




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电设工作小结之MSP430G2553学习笔记2接上一篇:(四),ADC101,ADC10是十位的AD,在g2553上有A0A7八个可以外接的AD通道,A10接到片上的温度传感器上,其他的通道都接在内部的V或GND上。因为是为的所以计算公式如下:2 ,ADC参考电压的选择:ADC的参考电压可以为:由ADC控制寄存器0 ADC10CTL0控制。但是要提高ADC的精度的话,尽量不要用内部的参考电压,最好外接一个比较稳定的电压作为参考电压,因为内部的产生的参考电压不是特别稳定或精度不是特别的高。例如我在使用时遇到的情况如下:Vref设为2.5V但实际的值大概为2.475V, 选择VCCVSS作为参考,用电压表测得大概为3.58V还是不小的偏差的。另外,在有可能的情况下,尽量采用较大的VR+和VR-,以减小纹波对采样结果的影响。3,ADC10的采样方式有:单通道单次采样,单通道多次采样,多通道单次采样,多通道多次采样。4,DTC:因为ADC10只有一个采样结果存储寄存器ADC10MEM,所以除了在单通道单次采样的模式下,其他的三个模式都必须使用DCT,否则转换结果会不停地被新的结果给覆盖。DTC是转换结果传送控制,也就是转换结果可以不用CPU的干预,就可以自动地存储在指定的存储空间内。使用这种方式转换速度快,访问方便,适用于高速采样模式中。DTC的使用可以从下面的例子中很容易看明白:#include #include ser_12864.huchar 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,ADC内核开,中断使能MSC多次转换选择开/如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行中断使能/使用DTC时,当一个块传送结束,产生中断/数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止ADC10DTC1 = 0x04; /数据传送控制寄存器1 4 conversions定义在每块的传送数目一共采样4次 所以单块传送4次/以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次ADC10AE0 |= BIT0+BIT1;/ P1.0 P1.1 ADC option select 使能模拟输入脚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);for (;)ADC10CTL0 &= ENC;/ADC不使能其实这句话可以放在紧接着CPU唤醒之后的,因为CPU唤醒了,说明我们想要的/转换数据传送完成了,如果ADC继续转换,那么转换结果也不再传输,是无用的。所以紧接着放在CPU唤醒之后/计时关闭ADC,有利于降低功耗while (ADC10CTL1 & BUSY);/ Wait if ADC10 core is active等待忙ADC10SA = (unsigned int)adc_sample;/数据传送开始地址寄存器设置DTC的开始地址Data buffer start/设置数据开始传送的地址为数组adc_sample的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把/地址强制转换为16位的int或unsigned int/应该也可以用指针直接访问DTC的存储区,还没试过/例如:前面定义了单块传送4次数据,所以每次传送完成了一个块,也就是4次,就会把中断标志位置位,产生中断/因为上面设置的地址为数组adc_sample的首地址,所以每次转换的结果就会传送到该数组的前4位上,所以如果/一切正常的话,数组里应该是前4位为转换的结果,后4位为初始值0通过下面的显示,验证转换是正确的/一次触发首先对A1、A0采样,放入a0和a1中,再对A1、A0采样,放入a2和a3中。如此循环下去。/验证得知,当多通道采样时,先采高的通道,再采低的通道。如上面每次采样时,先采A1 再A0/因为一共采样传送4次,所以数组的后4位为初始值0ADC10CTL0 |= ENC + ADC10SC; / Sampling and conversion startADC使能,开始转换 ADC10SC为采样触发源/不需要cpu的干预,DTC就可以把采样结果存储到指定的存储区中_bis_SR_register(CPUOFF + GIE);/ LPM0, ADC10_ISR will force exit如果转换结果传送完成,/就会进入中断,CPU唤醒 继续往下运行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 ADC10_ISR(void)/中断响应以后,中断标志位自动清零_bic_SR_register_on_exit(CPUOFF);/ Clear CPUOFF bit from 0(SR)上面的例子是把存储结果存储在了uint型的数组中。也可以用指针直接指定要存放的地址,然后再用指针进行访问(理论上可以,但还没有试过)。也可以把存储结果直接存放在一个16位的寄存器中,如:ADC10SA = (unsigned int)&TACCR1;/ Data transfer location把转换结果存储在TACCR1所在的/位置处,就相当于存储在TACCR1中 因为ADC转换结果和寄存器TACCR1都是16位的,所以要把地址强制转换为16位的/int 或 unsigned int型5,ADC采样注意事项:用片上的ADC10进行采样,如果外部分压电路的电阻过大(比如几K以上),AD引脚会把电压拉高,使采样结果发生很大的偏差。应换成小电阻(几十几百欧),如果要求更精确的话,要加运放进行电压跟随。6,AD采样交流信号:一般是50Hz,100Hz,1000Hz。方法是在交流信号的一个周期内采样多次(如40次,30次等),然后利用公式可以求出交流信号的有效值,平均值等。7,片上温度传感器ADC的A10通道接片上的温度传感器,MSP430内嵌的温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管。当使用片上温度传感器时,采样周期必须大于30us片上温度传感器的偏移很大,所以精确测量需要进行校准。选择片上温度传感器INCH_10,ADC其他的设置都和外部通道的设置相同,包括参考电压源的选择和转换存储的选择选择了片上温度传感器,会自动地打开片上参考电压源发生器作为温度传感器的电压源,但是这并不会时能VREF+输出,也不会影响AD转换参考源的选择,转换参考源的选择和其他通道的选择相同公式为:VTEMP=0.00355(TEMPC)+0.986片上温度传感器的校准,可以参见我的温度传感器校准程序,也可以参考其他的论文。下面只给出程序的一部分: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.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通信的基本程序:#includemsp430g2553.hunsigned char rev;char *string1=Helloworld!;char string2=Get it!n;/n是换行符void putchar(unsigned char c)/发送字符函数while (!(IFG2&UCA0TXIFG);/ USCI_A0 TX buffer ready? 等待TX buffer为空UCA0TXBUF = c;/ TX - RXed character发送字符cvoid putstr(char *s)/发送字符串函数IE2 &= UCA0RXIE;/发送时先关闭接收中断,不接收while(*s)!=0)/如果没有发完,就继续循环发送putchar(*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逻辑保持在复位状态,用于设置串口/UCA0CTL0全部为默认状态:无奇偶校验,LSB first,8bit_data,一位停止位,UART模式,异步模式/UCA0BR0 = 8;/ SMCLK 1MHz 1152008/UCA0BR1 = 0;/ 1MHz 115200/UCA0MCTL = UCBRS2 + UCBRS0;/ Modulation UCBRSx = 5/下面是选择ACLK,波特率设置为固定的UCA0CTL1 |= UCSSEL_1;/ACLKUCA0BR0 = 3;/ ACLK 32768Hz 960032768Hz/9600 = 3.41UCA0BR1 = 0;/ 32768Hz 9600UCA0MCTL = UCBRS1 + UCBRS0;/ Modulation UCBRSx = 3UCA0CTL1 &= UCSWRST;/ *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 ready first#pragma vector=USCIAB0RX_VECTOR_interrupt void USCI0RX_ISR(void)while (!(IFG2&UCA0TXIFG);/ USCI_A0 TX buffer ready? 等待TX buffer为空UCA0TXBUF = UCA0RXBUF;/ TX - RXed character发送接收到是数据rev=UCA0RXBUF;if(rev&0x01)P1OUT |= BIT0;putstr(string1);putstr(string2);elseP1OUT &= BIT0;注意:关于波特率的设置这一块还没有看懂,但上面的例子总的设置是对的值得说明的是:可以用定时器来实现串口通信功能,例子还没有看。3,对于SPI和I2C,有时有可能会用于g2553和其他的一些芯片、设备的通信用,还没没仔细看。(六),比较器AComparator_A+1,是一个模拟电压比较器,主要功能是指出两个输入电压CA0和CA1的大小关系,然后由输出信号CAOUT输出。2,输出:如果正端输入电压大于负端输入电压,输入为1。如果负端输入电压大于正端输入电压,输出为0;3,最终输出信号的上升沿或下降沿可以设置为具有中断能力,中断响应后,硬件会自动清除中断标志位CAIFG,也可以被软件清除。4,Comparator_A+支持精密的斜坡AD转换,供电电压检测和监视外部模拟信号。5,比较器的其中一路可以接参考电压,有0.25VCC, 0.5VCC, 三极管的阀值电压0.55V也可以两路信号都接外部的模拟信号。6,更详细的内容,参见用户只能,下面的例子是简单的用比较器A比较两个输入模拟电压的高低,有CAOUT输出:/主要功能是比较两个输入信号的大小关系#includevoid delay(void);/ Software delayvoid main (void)WDTCTL = WDTPW + WDTHOLD;/ Stop WDTCACTL2 = P2CA4;/ CA1/P1.1 = +comp 正输入端信号选择CA1,负输入端信号不连接外部输入信号/其他位的设置为默认:比较器输出不滤波 , 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);/ 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 routine#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的干预下独立地工作,这样减小了CPU的工作时间,也大幅降低了系统功耗。2,msp430能够用中断迅速把CPU从低功耗模式中唤醒,唤醒时间小于1us。这就保证了系统的低功耗。让CPU工作在脉冲状态,最大限度地让CPU处于休眠状态,只有在一些需要CPU干预的操作或计算时,才把CPU唤醒。另外,把一些无关的外围模块也都关闭,使一些需要的模块尽量单独工作,从而可以把CPU休眠。合理地利用中断,在需要的时间唤醒cpu。3,msp430应用系统价格和电流消耗等因素会影响CPU与外围模块对时钟的需求,所以系统使用不同的时钟信号:ACLK, MCLK, SMCLK。用户通过程序可以选择低频或高频,这样可以根据实际需要来选择合适的系统时钟频率,这3种不同的频率的时钟输出给出不同的模块,从而更合理地利用系统的电源,实现整个系统的超低功耗。4,单片机的工作模式有:活动模式是(AM),低功耗模式0(LPM0)低功耗模式4(LPM4)。不同的低功耗模式禁止不同的模块,适应不同的需求。5,各种低功耗模式的配置有控制位:SCG1,SCG2,OscOff, CPUOff由软件来配置。而各种低功耗模式又可通过中断的方式会到活动模式。在CCS的编译系统中,已经做好了各种低功耗模式的宏定义,在软件中直接调用就可以了,宏定义如下:#ifdef _ASM_HEADER_#define 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+OSCOFF+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(LPM2_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晶振作为ACLK时钟,DCO用于CPU激活后的突发短暂运行。(2),用接口模块代替软件驱动功能。(3),用中断控制程序运行。(4),用可计算的分支代替标志位测试产生的分支。(5),用快速查表代替冗长的软件计算。(6),在冗长的软件计算中使用单周的CPU寄存器。(7),避免频繁的子程序和函数调用。(8),尽可能直接用电池供电。此外,在设计外设时还有一些常规原则:(1),将不用的FETI输入端连接到Vss。(2),JTAG端口TMS, TCK和TDI不要连接到Vss。(3),CMOS输入端不能有浮空节点,将所有输入端接适当的电平。(4),不论对于内核还是对于各外围模块,选择尽可能低的运行频率,如果不影响功能应设计自动关机。(八),看门狗定时器1,单片机的看门狗定时器的原始功能是防止程序出错跑飞,但是在系统的研发阶段,一般不使用看门狗的。2,msp的看门狗可以工作在看门狗模式和间隔定时器模式,在间隔定时器模式下,就可以当一个普通的定时器使用。其中工作模式的宏定义如下:#define _MSP430_HAS_WDT_SFR_16BIT(WDTCTL);#define WDTIS0(0x0001)#define WDTIS1(0x0002)#define WDTSSEL(0x0004)#define WDTCNTCL(0x0008)#define WDTTMSEL(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+WDTCNTCL+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+WDTCNTCL)#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)#define WDT_ARST_1_9(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)下面举一个看门狗工作于间隔定时器模式下的例子:#include void main(void)WDTCTL = WDT_MDLY_32;/ Set Watchdog Timer interval t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急安全工作培训课件
- 2025山东省莱州市中考数学经典例题含答案详解【能力提升】
- 婴幼儿秋季腹泻生理机制与高发原因解析
- 2024年自考专业(金融)自我提分评估含答案详解【典型题】
- 酒精消费与癌症风险
- 借贷双务合同(标准版)
- 补充协议补充合同(标准版)
- 做账实操-《民非会计制度》的核算内容
- 2024-2025学年中医助理医师每日一练试卷及参考答案详解(A卷)
- 2025年能源与资源行业:新能源储能系统性能优化与成本控制策略报告001
- 安徽科技馆笔试题目及答案
- 厂房分割租赁协议书
- 会计中级职称《财务管理》电子书
- GB/T 45345-2025金属及其他无机覆盖层工程用直流磁控溅射银镀层镀层附着力的测量
- 无人机教员聘用协议书
- 脑科生理病理图谱解读
- 足球教练员的职业素养与道德规范
- 产地证培训讲义
- 《南京理工大学化工》课件
- 养殖场远程视频监控解决方案
- 二手车转让免责协议书范本
评论
0/150
提交评论