收藏 分享(赏)

电设工作小结之——MSP430G2553学习笔记—2.doc

上传人:精品资料 文档编号:10242169 上传时间:2019-10-24 格式:DOC 页数:14 大小:137.50KB
下载 相关 举报
电设工作小结之——MSP430G2553学习笔记—2.doc_第1页
第1页 / 共14页
电设工作小结之——MSP430G2553学习笔记—2.doc_第2页
第2页 / 共14页
电设工作小结之——MSP430G2553学习笔记—2.doc_第3页
第3页 / 共14页
电设工作小结之——MSP430G2553学习笔记—2.doc_第4页
第4页 / 共14页
电设工作小结之——MSP430G2553学习笔记—2.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、电设工作小结之MSP430G2553 学习笔记 2接上一篇:(四),ADC101,ADC10 是十位的 AD,在 g2553 上有 A0A7 八个可以外接的 AD 通道,A10 接到片上的温度传感器上,其他的通道都接在内部的 V或 GND 上。因为是为的所以计算公式如下:2 ,ADC 参考电压的选择:ADC 的参考电压可以为:由 ADC 控制寄存器 0 ADC10CTL0 控制。但是要提高 ADC 的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。例如我在使用时遇到的情况如下:Vref 设为 2.5V 但实际的

2、值大概为 2.475V, 选择 VCC VSS 作为参考,用电压表测得大概为 3.58V 还是不小的偏差的。另外,在有可能的情况下,尽量采用较大的 VR+和 VR-,以减小纹波对采样结果的影响。3,ADC10 的采样方式有:单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。4,DTC:因为 ADC10 只有一个采样结果存储寄存器 ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用 DCT,否则转换结果会不停地被新的结果给覆盖。DTC 是转换结果传送控制,也就是转换结果可以不用 CPU 的干预,就可以自动地存储在指定的存储空间内。使用这种方式转换速度快,访

3、问方便,适用于高速采样模式中。DTC 的使用可以从下面的例子中很容易看明白:#include #include “ser_12864.h“uchar s1=“DTC:“;uchar s2=“2_cha_2_time_DTC“;void ADC_init()ADC10CTL1 = CONSEQ_3 + INCH_1; / 2 通道多次转换, 最大转换通道为 A1ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; / ADC10ON, interrupt enabl 参考电压选默认值 VCC 和 VSS/采样保持时间为 16 x ADC10CLKs,

4、ADC 内核开,中断使能 MSC 多次转换选择开/如果 MSC 置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行中断使能/使用 DTC 时,当一个块传送结束,产生中断/数据传送控制寄存器 0 ADC10DTC0 设置为默认模式:单传送块模式,单块传送完停止ADC10DTC1 = 0x04; /数据传送控制寄存器 1 4 conversions 定义在每块的传送数目一共采样 4 次 所以单块传送 4 次/以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送 2 次ADC10AE0 |= BIT0+BIT1; / P1.0 P1.1 ADC option select 使能

5、模拟输入脚A0 A1/不知道为什么,当 P10 P11 都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,/采样是相同的void main(void)uint adc_sample8=0; /存储 ADC 序列采样结果WDTCTL = WDTPW+WDTHOLD;BCSCTL1 = CALBC1_12MHZ; /设定 cpu 时钟 DCO 频率为 12MHzDCOCTL = CALDCO_12MHZ;P2DIR |=BIT3+BIT4; /液晶的两条线init_lcd();ADC_init();wr_string(0,0,s1);wr_string(0,3,s2);fo

6、r (;)ADC10CTL0 /ADC 不使能 其实这句话可以放在紧接着 CPU 唤醒之后的,因为 CPU 唤醒了,说明我们想要的/转换数据传送完成了,如果 ADC 继续转换,那么转换结果也不再传输,是无用的。所以紧接着放在 CPU 唤醒之后/计时关闭 ADC,有利于降低功耗while (ADC10CTL1 / Wait if ADC10 core is active 等待忙ADC10SA = (unsigned int)adc_sample; /数据传送开始地址寄存器 设置DTC 的开始地址 Data buffer start/设置数据开始传送的地址为数组 adc_sample的首地址,因为

7、寄存器 ADC10SA和转换结果都是 16 位的,所以要把/地址强制转换为 16 位的 int 或 unsigned int/应该也可以用指针直接访问 DTC 的存储区,还没试过/例如:前面定义了单块传送 4 次数据,所以每次传送完成了一个块,也就是 4次,就会把中断标志位置位,产生中断/因为上面设置的地址为数组 adc_sample的首地址,所以每次转换的结果就会传送到该数组的前 4 位上,所以如果/一切正常的话,数组里应该是前 4 位为转换的结果,后 4 位为初始值 0 通过下面的显示,验证转换是正确的/一次触发首先对 A1、A0 采样,放入 a0和 a1中,再对 A1、A0 采样,放入a

8、2和 a3中。如此循环下去。/验证得知,当多通道采样时,先采高的通道,再采低的通道。如上面每次采样时,先采 A1 再 A0/因为一共采样传送 4 次,所以数组的后 4 位为初始值 0ADC10CTL0 |= ENC + ADC10SC; / Sampling and conversion start ADC 使能,开始转换 ADC10SC 为采样触发源/不需要 cpu 的干预,DTC 就可以把采样结果存储到指定的存储区中_bis_SR_register(CPUOFF + GIE); / LPM0, ADC10_ISR will force exit 如果转换结果传送完成,/就会进入中断,CPU

9、 唤醒 继续往下运行wr_int(2,0,adc_sample0); /显示转换结果 A1wr_int(6,0,adc_sample1); /A0wr_int(0,1,adc_sample2); /A1wr_int(3,1,adc_sample3); /A0wr_int(6,1,adc_sample4);wr_int(0,2,adc_sample5);wr_int(3,2,adc_sample6);wr_int(6,2,adc_sample7);/ ADC10 interrupt service routine#pragma vector=ADC10_VECTOR_interrupt void

10、 ADC10_ISR(void) /中断响应以后,中断标志位自动清零_bic_SR_register_on_exit(CPUOFF); / Clear CPUOFF bit from 0(SR)上面的例子是把存储结果存储在了 uint 型的数组中。也可以用指针直接指定要存放的地址,然后再用指针进行访问(理论上可以,但还没有试过)。也可以把存储结果直接存放在一个 16 位的寄存器中,如:ADC10SA = (unsigned int) / Data transfer location 把转换结果存储在 TACCR1 所在的/位置处,就相当于存储在 TACCR1 中 因为 ADC 转换结果和寄存器

11、 TACCR1 都是 16 位的,所以要把地址强制转换为 16 位的/int 或 unsigned int 型5,ADC 采样注意事项:用片上的 ADC10 进行采样,如果外部分压电路的电阻过大(比如几 K 以上),AD 引脚会把电压拉高,使采样结果发生很大的偏差。应换成小电阻(几十几百欧),如果要求更精确的话,要加运放进行电压跟随。6,AD 采样交流信号:一般是 50Hz,100Hz,1000Hz。方法是在交流信号的一个周期内采样多次(如 40 次,30 次等),然后利用公式可以求出交流信号的有效值,平均值等。7,片上温度传感器ADC 的 A10 通道接片上的温度传感器,MSP430 内嵌的

12、温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管。当使用片上温度传感器时,采样周期必须大于 30us 片上温度传感器的偏移很大,所以精确测量需要进行校准。选择片上温度传感器 INCH_10,ADC 其他的设置都和外部通道的设置相同,包括参考电压源的选择和转换存储的选择选择了片上温度传感器,会自动地打开片上参考电压源发生器作为温度传感器的电压源,但是这并不会时能 VREF+输出,也不会影响 AD 转换参考源的选择,转换参考源的选择和其他通道的选择相同公式为:VTEMP=0.00355(TEMPC)+0.986片上温度传感器的校准,可以参见我的温度传感器校准程序,也可以参考其他的论文。

13、下面只给出程序的一部分:void ADC_init()ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; / ADC10ON, interrupt enabled 参考电压选默认值 VCC 和 VSS/采样保持时间为 16 x ADC10CLKs,ADC 开,中断使能ADC10CTL1 = INCH_10; / ADC 输入通道选择 A10,为内部的温度传感器/其他是默认,采样触发输入源选择为 ADC10SC,采样输入信号不翻转,转换时钟选择内部时钟源:ADC10OSC,3.76.3MHz/不分频,单通道单次转换/ADC10AE0 |= 0x02; / PA

14、.1 ADC option select 使能模拟输入脚 A1/P1DIR |= 0x01; / Set P1.0 to output direction/所以是 P11 为 ADC 输入脚,P10 控制 led(五),通用串行通信接口(USCI)1,USCI_A:支持 UART, IrDA, SPIUSCI_B:支持 I2C, SPI2,UART 这个模块没什么好说的,和其他的一写处理器如 S12,ARM 等差不多。只要设置好几个控制寄存器,波特率,写几个收发函数就可以了。下面就给出 msp430g2553 于PC 用 UART 通信的基本程序:#include “msp430g2553.h

15、“unsigned char rev;char *string1=“Helloworld!“;char string2=“Get it!n“; /n 是换行符void putchar(unsigned char c) /发送字符函数while (!(IFG2 / USCI_A0 TX buffer ready? 等待 TX buffer 为空UCA0TXBUF = c; / TX - RXed character 发送字符 cvoid putstr(char *s) /发送字符串函数IE2 /发送时先关闭接收中断,不接收while(*s)!=0) /如果没有发完,就继续循环发送putchar(

16、*s);/ putchar(n); /发送换行符s+;IE2 |= UCA0RXIE; /发送完了打开接收中断void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop WDTP1DIR=BIT0;BCSCTL1 = CALBC1_1MHZ; / Set DCO 为 1MHzDCOCTL = CALDCO_1MHZ;P1SEL = BIT1 + BIT2 ; / P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2; /第二外围模式选择/ UCA0CTL1 |= UCSSEL_2; / SMCLK 其他默认:软件复位使能 USCI

17、 逻辑保持在复位状态,用于设置串口/UCA0CTL0 全部为默认状态:无奇偶校验,LSB first,8bit_data,一位停止位,UART 模式,异步模式/ UCA0BR0 = 8; / SMCLK 1MHz 115200 8/ UCA0BR1 = 0; / 1MHz 115200/ UCA0MCTL = UCBRS2 + UCBRS0; / Modulation UCBRSx = 5/下面是选择 ACLK,波特率设置为固定的UCA0CTL1 |= UCSSEL_1; /ACLKUCA0BR0 = 3; / ACLK 32768Hz 9600 32768Hz/9600 = 3.41UCA0

18、BR1 = 0; / 32768Hz 9600UCA0MCTL = UCBRS1 + UCBRS0; / Modulation UCBRSx = 3UCA0CTL1 / *Initialize USCI state machine* 初始化释放,可以操作IE2 |= UCA0RXIE; / Enable USCI_A0 RX interrupt 接收中断使能_bis_SR_register(LPM0_bits + GIE); / Enter LPM0, interrupts enabled/ Echo back RXed character, confirm TX buffer is read

19、y first#pragma vector=USCIAB0RX_VECTOR_interrupt void USCI0RX_ISR(void)while (!(IFG2 / USCI_A0 TX buffer ready? 等待 TX buffer 为空UCA0TXBUF = UCA0RXBUF; / TX - RXed character 发送接收到是数据rev=UCA0RXBUF;if(revputstr(string1);putstr(string2);elseP1OUT 注意:关于波特率的设置这一块还没有看懂,但上面的例子总的设置是对的值得说明的是:可以用定时器来实现串口通信功能,例子

20、还没有看。3,对于 SPI 和 I2C,有时有可能会用于 g2553 和其他的一些芯片、设备的通信用,还没没仔细看。(六),比较器 A Comparator_A+1,是一个模拟电压比较器,主要功能是指出两个输入电压 CA0 和 CA1 的大小关系,然后由输出信号 CAOUT 输出。2,输出:如果正端输入电压大于负端输入电压,输入为 1。如果负端输入电压大于正端输入电压,输出为 0;3,最终输出信号的上升沿或下降沿可以设置为具有中断能力,中断响应后,硬件会自动清除中断标志位 CAIFG,也可以被软件清除。4,Comparator_A+支持精密的斜坡 AD 转换,供电电压检测和监视外部模拟信号。5

21、,比较器的其中一路可以接参考电压,有 0.25VCC, 0.5VCC, 三极管的阀值电压 0.55V也可以两路信号都接外部的模拟信号。6,更详细的内容,参见用户只能,下面的例子是简单的用比较器 A 比较两个输入模拟电压的高低,有 CAOUT 输出:/主要功能是比较两个输入信号的大小关系#include void delay(void); / Software delayvoid main (void)WDTCTL = WDTPW + WDTHOLD; / Stop WDTCACTL2 = P2CA4; / CA1/P1.1 = +comp 正输入端信号选择 CA1,负输入端信号不连接外部输入信

22、号/其他位的设置为默认:比较器输出不滤波 , CAOUT 为比较器的输出结果CCTL0 = CCIE; / CCR0 interrupt enabledTACTL = TASSEL_2 + ID_3 + MC_2; / SMCLK/8, cont-mode_EINT(); / enable interruptswhile (1) / Loop/比较器 A 控制寄存器 1 CACTL1 采用的是默认设置:参考电压源 VCAREF 加到比较器的正输入端,内部参考源关,比较器关,/中断不使能CACTL1 = 0x00; / No reference voltage_BIS_SR(LPM0_bits)

23、; / Enter LPM0CACTL1 = CAREF0 + CAON; / 参考源为 0.25*Vcc, Comp. on_BIS_SR(LPM0_bits); / Enter LPM0CACTL1 = CAREF1 + CAON; / 参考源为 0.5*Vcc, Comp. on_BIS_SR(LPM0_bits); / Enter LPM0CACTL1 = CAREF1 + CAREF0 + CAON; /参考源为三极管的阀值电压 0.55V, Comp. on_BIS_SR(LPM0_bits); / Enter LPM0/ Timer A0 interrupt service ro

24、utine#pragma vector=TIMER0_A0_VECTOR_interrupt void Timer_A (void)_BIC_SR_IRQ(LPM0_bits); / Clear LPM0 bits from 0(SR)7,也可以用比较器 A 监视供电电压,用 0.25VCC 和三极管的阀值电压 0.55V 进行比较,从而监视供电电压的高低,如果电压低于某个值时,可以做某种动作比如报警电池电量过低等。(七),低功耗模式1,TI msp430 单片机是一个特别强调超低功耗的单片机系列。对于低功耗的实现,丰富的中断和合理的时钟系统是必须的,另外相对独立的外设,可以不在 CPU 的干

25、预下独立地工作,这样减小了 CPU 的工作时间,也大幅降低了系统功耗。2,msp430 能够用中断迅速把 CPU 从低功耗模式中唤醒,唤醒时间小于 1us。这就保证了系统的低功耗。让 CPU 工作在脉冲状态,最大限度地让 CPU 处于休眠状态,只有在一些需要CPU 干预的操作或计算时,才把 CPU 唤醒。另外,把一些无关的外围模块也都关闭,使一些需要的模块尽量单独工作,从而可以把 CPU 休眠。合理地利用中断,在需要的时间唤醒cpu。3,msp430 应用系统价格和电流消耗等因素会影响 CPU 与外围模块对时钟的需求,所以系统使用不同的时钟信号:ACLK, MCLK, SMCLK。用户通过程序

26、可以选择低频或高频,这样可以根据实际需要来选择合适的系统时钟频率,这 3 种不同的频率的时钟输出给出不同的模块,从而更合理地利用系统的电源,实现整个系统的超低功耗。4,单片机的工作模式有:活动模式是(AM),低功耗模式 0(LPM0)低功耗模式4(LPM4)。不同的低功耗模式禁止不同的模块,适应不同的需求。5,各种低功耗模式的配置有控制位:SCG1,SCG2,OscOff, CPUOff 由软件来配置。而各种低功耗模式又可通过中断的方式会到活动模式。在 CCS 的编译系统中,已经做好了各种低功耗模式的宏定义,在软件中直接调用就可以了,宏定义如下:#ifdef _ASM_HEADER_#defi

27、ne LPM0 (CPUOFF)#define LPM1 (SCG0+CPUOFF)#define LPM2 (SCG1+CPUOFF)#define LPM3 (SCG1+SCG0+CPUOFF)#define LPM4 (SCG1+SCG0+OSCOFF+CPUOFF)#else#define LPM0_bits (CPUOFF)#define LPM1_bits (SCG0+CPUOFF)#define LPM2_bits (SCG1+CPUOFF)#define LPM3_bits (SCG1+SCG0+CPUOFF)#define LPM4_bits (SCG1+SCG0+OSCOF

28、F+CPUOFF)#include “in430.h“#define LPM0 _bis_SR_register(LPM0_bits) #define LPM0_EXIT _bic_SR_register_on_exit(LPM0_bits)#define LPM1 _bis_SR_register(LPM1_bits) #define LPM1_EXIT _bic_SR_register_on_exit(LPM1_bits)#define LPM2 _bis_SR_register(LPM2_bits) #define LPM2_EXIT _bic_SR_register_on_exit(L

29、PM2_bits)#define LPM3 _bis_SR_register(LPM3_bits) #define LPM3_EXIT _bic_SR_register_on_exit(LPM3_bits)#define LPM4 _bis_SR_register(LPM4_bits) #define LPM4_EXIT _bic_SR_register_on_exit(LPM4_bits)#endif6,具体的例子就不再举了,就是在 CPU 不需要工作的时候进入低功耗模式,在需要工作的时候,通过中断唤醒。下面说说一般的低功耗的原则:(1),最大化 LPM3 的时间,用 32KHz 晶振作为

30、ACLK 时钟,DCO 用于 CPU 激活后的突发短暂运行。(2),用接口模块代替软件驱动功能。(3),用中断控制程序运行。(4),用可计算的分支代替标志位测试产生的分支。(5),用快速查表代替冗长的软件计算。(6),在冗长的软件计算中使用单周的 CPU 寄存器。(7),避免频繁的子程序和函数调用。(8),尽可能直接用电池供电。此外,在设计外设时还有一些常规原则:(1),将不用的 FETI 输入端连接到 Vss。(2),JTAG 端口 TMS, TCK 和 TDI 不要连接到 Vss。(3),CMOS 输入端不能有浮空节点,将所有输入端接适当的电平。(4),不论对于内核还是对于各外围模块,选择

31、尽可能低的运行频率,如果不影响功能应设计自动关机。(八),看门狗定时器1,单片机的看门狗定时器的原始功能是防止程序出错跑飞,但是在系统的研发阶段,一般不使用看门狗的。2,msp 的看门狗可以工作在看门狗模式和间隔定时器模式,在间隔定时器模式下,就可以当一个普通的定时器使用。其中工作模式的宏定义如下:#define _MSP430_HAS_WDT_ SFR_16BIT(WDTCTL); #define WDTIS0 (0x0001)#define WDTIS1 (0x0002)#define WDTSSEL (0x0004)#define WDTCNTCL (0x0008)#define WDT

32、TMSEL (0x0010)#define WDTNMI (0x0020)#define WDTNMIES (0x0040)#define WDTHOLD (0x0080)#define WDTPW (0x5A00)#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) #define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) #define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) #define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+W

33、DTCNTCL+WDTIS1+WDTIS0) #define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) #define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) #define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) #define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) #define WDT_MRST_32 (WDTPW+WD

34、TCNTCL) #define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) #define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) #define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) #define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) #define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) #define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1

35、) #define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) 下面举一个看门狗工作于间隔定时器模式下的例子:#include void main(void)WDTCTL = WDT_MDLY_32; / Set Watchdog Timer interval to 30ms SMCLK 计时IE1 |= WDTIE; / Enable WDT interrupt 间隔定时器模式中断使能P1DIR |= 0x01; / Set P1.0 to output direction_BIS_SR(LPM0_bits + GIE); / En

36、ter LPM0 w/ interrupt/ Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR_interrupt void watchdog_timer(void) /WDTIFG 中断标志自动清除P1OUT = 0x01; / Toggle P1.0 using exclusive-OR3,上电以后看门狗默认是打开的,如果不用的话就将其关闭:WDTCTL = WDTPW + WDTHOLD;4,看门狗控制寄存器还控制着 RST/NMI 管脚的功能,可以选择它为复位管脚,也可以选择它产生不可屏蔽中断,例子如下:

37、/第 16 脚是 RST/NMI/SBWTDIO 在本程序中,如果按下 RESER 键,会进入非可屏蔽中断,使 P10 led 闪烁#include void main(void)WDTCTL = WDTPW + WDTHOLD + WDTNMI + WDTNMIES; / WDT off NMI hi/lo/WDTHOLD 停止看门狗定时器 WDTNMI 选择 RST/NMI pin 为 NMI 功能 WDTNMIES 选择下降沿触发 NMIP1DIR |= 0x01; / Set P1.0 to output directionP1OUT / Clear P1.0 LED offIE1 |

38、= NMIIE; / Enable NMI 不可屏蔽中断使能_BIS_SR(LPM0_bits); / Enter LPM0 因为是非可屏蔽中断,所以不用打开总中断#pragma vector=NMI_VECTOR_interrupt void nmi_ (void)volatile unsigned int i;P1OUT |= 0x01; / Set P1.0 LED onfor (i = 20000; i 0; i-); / DelayP1OUT / Clear P1.0 LED offIFG1 / Reclear NMI flag in case bounce/NMI 中断标志位必须要软件清除IE1 |= NMIIE; / Enable NMI/当非可屏蔽中断被相应,所有的 NMI 使能位都会自动地被复位,所以 NMI 相应之后,用户必须软件重新使能需要的 NMI

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报