MSP430学习笔记2-ADC12
开发版型号:SEED—MSP430F5529A
开发工具 :CCS 5.4v
以下内容是CCS中ADC12操作的一些简单的demo,现整理如下:
有关MSP430F5529芯片ADC12相关资料,可参考《MSP430x5xx and MSP430x6xx Family User's Guide (Rev. M)——Chapter 28 ADC12_A》
1:demo描述
Description: A single sample is made on A0 with reference to AVcc.
Software sets ADC12SC to start sample and conversion - ADC12SC
automatically cleared at EOC. ADC12 internal oscillator times sample (16x)
and conversion. In Mainloop MSP430 waits in LPM0 to save power until ADC12
conversion complete, ADC12_ISR will force exit from LPM0 in Mainloop on
reti. If A0 > 0.5*AVcc, P1.0 set, else reset.
参考AVcc电压、以A0定时器作为采样输入信号源的、单通道单次模式采样,当采样信号大于0.5*AVcc时,P1.0置位,否则为0。
代码如下:
1 #include <msp430.h> 2 3 int main(void) 4 { 5 WDTCTL = WDTPW + WDTHOLD; // Stop WDT 6 ADC12CTL0 = ADC12SHT02 + ADC12ON; // Sampling time, ADC12 on 7 ADC12CTL1 = ADC12SHP; // Use sampling timer 8 ADC12IE = 0x01; // Enable interrupt 9 ADC12CTL0 |= ADC12ENC; 10 P6SEL |= 0x01; // P6.0 ADC option select 11 P1DIR |= 0x01; // P1.0 output 12 13 while (1) 14 { 15 ADC12CTL0 |= ADC12SC; // Start sampling/conversion 16 17 __bis_SR_register(LPM0_bits + GIE); // LPM0, ADC12_ISR will force exit 18 __no_operation(); // For debugger 19 } 20 } 21 22 #pragma vector = ADC12_VECTOR 23 __interrupt void ADC12_ISR(void) 24 { 25 switch(__even_in_range(ADC12IV,34)) 26 { 27 case 0: break; // Vector 0: No interrupt 28 case 2: break; // Vector 2: ADC overflow 29 case 4: break; // Vector 4: ADC timing overflow 30 case 6: // Vector 6: ADC12IFG0 31 if (ADC12MEM0 >= 0x7ff) // ADC12MEM = A0 > 0.5AVcc? 32 P1OUT |= BIT0; // P1.0 = 1 33 else 34 P1OUT &= ~BIT0; // P1.0 = 0 35 36 __bic_SR_register_on_exit(LPM0_bits); // Exit active CPU 37 case 8: break; // Vector 8: ADC12IFG1 38 case 10: break; // Vector 10: ADC12IFG2 39 case 12: break; // Vector 12: ADC12IFG3 40 case 14: break; // Vector 14: ADC12IFG4 41 case 16: break; // Vector 16: ADC12IFG5 42 case 18: break; // Vector 18: ADC12IFG6 43 case 20: break; // Vector 20: ADC12IFG7 44 case 22: break; // Vector 22: ADC12IFG8 45 case 24: break; // Vector 24: ADC12IFG9 46 case 26: break; // Vector 26: ADC12IFG10 47 case 28: break; // Vector 28: ADC12IFG11 48 case 30: break; // Vector 30: ADC12IFG12 49 case 32: break; // Vector 32: ADC12IFG13 50 case 34: break; // Vector 34: ADC12IFG14 51 default: break; 52 } 53 }
2:代码分析
1)主函数中代码:
1 ADC12CTL0 = ADC12SHT02 + ADC12ON; // Sampling time, ADC12 on 2 ADC12CTL1 = ADC12SHP; // Use sampling timer 3 ADC12IE = 0x01; // Enable interrupt 4 ADC12CTL0 |= ADC12ENC; 5 6 ADC12CTL0 |= ADC12SC; // Start sampling/conversion
参考控制寄存器如下:
![](http://images0.cnblogs.com/blog/466101/201306/14173441-0e4371d549114a7d979226b4308f59ee.png)
![](http://images0.cnblogs.com/blog/466101/201306/14173455-bc362b50de0e4719adacd159e0f64153.png)
ADCSHT0x :采样保持定时器0,该四位定义了保存在转换存储寄存器中转换结果的采样周期;
ADC12ENC:转换允许
ADC12SHP:选择采样定时器A0输出
ADC12IE:中断允许 (来自中断允许寄存器)
2)中断部分代码:
中断寄存向量ADC12IV中的数字(0-36)用来判断中断标志寄存器中相关位是否置位,此时表明转换结果已经装入转换存储寄存器中,具体数字的含义参见下图:
![](http://images0.cnblogs.com/blog/466101/201306/14174230-765159a1ae72495195ca18b7e379aa41.png)
3)
1 if (ADC12MEM0 >= 0x7ff) // ADC12MEM = A0 > 0.5AVcc? 2 P1OUT |= BIT0; // P1.0 = 1 3 else 4 P1OUT &= ~BIT0; // P1.0 = 0
参考电压使用VCC,因为ADC精度为12位(4095),所以0x7FF(2047)就是0.5Vcc的AD值
StevenMeng
2013 6.14
作者:StevenMeng 出处:http://www.cnblogs.com/steven-blog/欢迎转载或分享,但请务必声明文章出处。