[经验] MSP430F5529学习笔记2-ADC12

qinkaiabc   2014-1-24 15:38 楼主
开发版型号: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. int main(void)
  3. {
  4.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  5.   ADC12CTL0 = ADC12SHT02 + ADC12ON;         // Sampling time, ADC12 on
  6.   ADC12CTL1 = ADC12SHP;                     // Use sampling timer
  7.   ADC12IE = 0x01;                           // Enable interrupt
  8.   ADC12CTL0 |= ADC12ENC;
  9.   P6SEL |= 0x01;                            // P6.0 ADC option select
  10.   P1DIR |= 0x01;                            // P1.0 output

  11.   while (1)
  12.   {
  13.     ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion

  14.     __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_ISR will force exit
  15.     __no_operation();                       // For debugger
  16.   }
  17. }

  18. #pragma vector = ADC12_VECTOR
  19. __interrupt void ADC12_ISR(void)
  20. {
  21.   switch(__even_in_range(ADC12IV,34))
  22.   {
  23.   case  0: break;                           // Vector  0:  No interrupt
  24.   case  2: break;                           // Vector  2:  ADC overflow
  25.   case  4: break;                           // Vector  4:  ADC timing overflow
  26.   case  6:                                  // Vector  6:  ADC12IFG0
  27.     if (ADC12MEM0 >= 0x7ff)                 // ADC12MEM = A0 > 0.5AVcc?
  28.       P1OUT |= BIT0;                        // P1.0 = 1
  29.     else
  30.       P1OUT &= ~BIT0;                       // P1.0 = 0

  31.     __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
  32.   case  8: break;                           // Vector  8:  ADC12IFG1
  33.   case 10: break;                           // Vector 10:  ADC12IFG2
  34.   case 12: break;                           // Vector 12:  ADC12IFG3
  35.   case 14: break;                           // Vector 14:  ADC12IFG4
  36.   case 16: break;                           // Vector 16:  ADC12IFG5
  37.   case 18: break;                           // Vector 18:  ADC12IFG6
  38.   case 20: break;                           // Vector 20:  ADC12IFG7
  39.   case 22: break;                           // Vector 22:  ADC12IFG8
  40.   case 24: break;                           // Vector 24:  ADC12IFG9
  41.   case 26: break;                           // Vector 26:  ADC12IFG10
  42.   case 28: break;                           // Vector 28:  ADC12IFG11
  43.   case 30: break;                           // Vector 30:  ADC12IFG12
  44.   case 32: break;                           // Vector 32:  ADC12IFG13
  45.   case 34: break;                           // Vector 34:  ADC12IFG14
  46.   default: break;
  47.   }
  48. }
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. ADC12CTL0 |= ADC12SC;                   // Start sampling/conversion
参考控制寄存器如下:

14173441-0e4371d549114a7d979226b4308f59ee.png

14173455-bc362b50de0e4719adacd159e0f64153.png


ADCSHT0x :采样保持定时器0,该四位定义了保存在转换存储寄存器中转换结果的采样周期;
ADC12ENC:转换允许
ADC12SHP:选择采样定时器A0输出
ADC12IE:中断允许 (来自中断允许寄存器)



2)中断部分代码:
中断寄存向量ADC12IV中的数字(0-36)用来判断中断标志寄存器中相关位是否置位,此时表明转换结果已经装入转换存储寄存器中,具体数字的含义参见下图:

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



回复评论 (14)

2推荐 1134275907 

LZ精通430F6638么?有些问题想向您请教。
点赞  2014-2-10 21:47
只用过169的   在同一片里  能不能同时开启ADC  和DAC 喃?  我看手册上写得 用DAC是就要关闭ADC内核  只开启参考电压
点赞  2014-2-9 21:52
引用: 午后的红茶meton 发表于 2014-2-9 13:52
只用过169的   在同一片里  能不能同时开启ADC  和DAC 喃?  我看手册上写得 用DAC是就要关闭ADC内核  只开 ...

能同时开启ADC  和DAC
在使用DAC之前,必须开启内部参考源
ADC12CTL0 = REF2_5V + REFON;这句即是开启参考电压2.5v以供DA使用。

  1. #include "msp430x16x.h"

  2. //DAC0输出1.25V
  3. //ADC A0通道测量DAC0输出,测量值保存在ADC12MEM0寄存器中
  4. void Init_DAC0()
  5. {
  6.   ADC12CTL0=REF2_5V+REFON;//内部2.5V参考电压
  7.   DAC12_0CTL=DAC12IR+DAC12AMP_5+DAC12ENC;//单量程、中等速率、使能DAC
  8.   DAC12_0DAT=0x7FF;//1.25V
  9. }

  10. void Init_ADC0()
  11. {
  12.   unsigned int i;
  13.   P6SEL|=0x01;
  14.   ADC12CTL0|=ADC12ON+SHT0_2;//打开ADC12、设置采样速度
  15.   ADC12CTL1=SHP;//使用采样时钟
  16.   ADC12MCTL0=SREF_1;  //Vr+=Vef,选择参考电压范围
  17.   for(i=0;i<3600;i++);//参考电压稳定延时
  18.   ADC12CTL0|=ENC; //使能转换
  19.   while(1)
  20. {
  21.     ADC12CTL0|=ADC12SC;//开始转换
  22.     while((ADC12IFG&ADC12BUSY)==0);//等待转换
  23.     _NOP();
  24.   }
  25. }

  26. void main( void )
  27. {
  28.   // Stop watchdog timer to prevent time out reset
  29.   WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  30.   Init_DAC0();
  31.   Init_ADC0();
  32. }
点赞  2014-2-10 13:01
引用: 午后的红茶meton 发表于 2014-2-9 13:52
只用过169的   在同一片里  能不能同时开启ADC  和DAC 喃?  我看手册上写得 用DAC是就要关闭ADC内核  只开 ...

169源程序.zip (6.41 KB)
(下载次数: 26, 2014-2-10 13:03 上传)

点赞  2014-2-10 13:03
楼主给一个5529同时开启DAC和ADC的吧,感谢楼主
点赞  2014-7-15 15:23
引用: 够了 发表于 2014-7-15 15:23
楼主给一个5529同时开启DAC和ADC的吧,感谢楼主

5529内部无dac呀。。。
点赞  2014-7-29 04:30
我看见资料上面有啊
点赞  2014-7-29 12:29
同求楼主给5529同时开启DAC和ADC。谢了
点赞  2014-8-10 15:33
楼主能不能把你的datasheet发给我一份啊 我找了半天也没找到
点赞  2014-8-27 17:06
楼主,这个程序在哪个端口输入待转换的电压呀?看起来是P6.0?但是貌似并没有留出来啊!
点赞  2015-7-12 16:38
很好!!!!!!!!!!!!!!
点赞  2015-7-18 14:37
你好楼主,我看那个用户手册那里有介绍DAC的操作,但在数据手册中,F5529内部并没有DAC,只有ADC的内设,所以F5529内部并没有集成DAC?请楼主解答一下,谢谢
点赞  2015-7-24 10:24
楼主 求一个不用中断 写的 单通道单次采集啊~~ 5529 的 拜托
点赞  2016-7-25 16:22
赞,很有用
点赞  2017-12-19 21:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复