1712|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

MSP430G2553 模数转换器 ADC10 [复制链接]

一、ADC10组成

ADC10模块是MSP430 MCU内部的一个高性能、10位的模数转换器,包含了SAR(Successive-Approximation-Register) core、采样选择控制、基准源发生器和DTC(Data Transfer Controller)。DTC功能允许采样结果直接内部存储,而不需要CPU的干预。

ADC10的框图和主要寄存器的含义,如下图所示。虽然ADC10牵扯的寄存器配置很多,但实际使用起来并不复杂。


二、相关寄存器

主要寄存器及功能有:

ADC10AEx:模拟输入使能,用于使能某个管脚的模拟输入功能

ADC10MEM:保存AD转换的结果

ADC10CTL0:

- ADC10ON:开启/关闭ADC10

- ENC:Enable conversion。几乎所有的ADC10设置都要在ENC=0时进行。

- ADC10SC:Start conversion。开始转换后会自动清零。

- SREFx:选择正负基准源

- REFOUT、REFBURST、REF2_5V、REFON:选择内部基准源及其工作方式

- ADC10SHTx:选择采集和保持的时钟周期数目

- ADC10SR:选择reference buffer drive capability,影响最大采集速率

- ADC10IE、ADC10IFG:中断使能和中断标志位

- MSC:多次采集转换设置,只用于序列(sequence)或反复(repeated)模式采样。

ADC10CTL1:

- INCHx:输入通道选择,可选择外部管脚、基准源、内部温度传感器等。

- SHSx:选择采样信号由谁触发,默认是ADC10SC位,也可以是TimerA.OUTx。

- ADC10DF:转换数据格式,直接二进制或者二补码。

- ADC10SSELx、ADC10DIVx:选择ADC10的时钟,分频比。时钟默认采用ADC10内部的专门时钟ADC10OSC,频率约在5MHz左右。

- CONSEQx:选择模式,有单通道单次(默认)、多通道单次、单通道重复、多通道重复四种。

- ADC10BUSY:标志ADC10是否采样、转换完成。

如果使用到DTC的功能,还需要操作ADC10DTC0、ADC10DTC1、ADC10SA寄存器,具体可查看MSP430x2xx Family User's Guide。

三、代码示例

利用ADC10,每2秒读取一次A6(P1.6)通道上的电压,通过串口打印显示。
1 // voltage meter 2015.10.1  2 // for MSPG2 launchpad, VCC = 3.6V; and if Vcc changes,  3 // ref_vcc should be modified.  4   5 #include "io430.h"  6   7 #define A6 BIT6 // ADC input pin P1.6  8 #define RXD BIT1 //P1.1  9 #define TXD BIT2 //P1.2 10 11 #define IDLE 0 12 #define BUSY 1 13 14 // function definitions 15 void initADC10(void); 16 void initTA0(void); 17 18 void sendByte(unsigned char); 19 void printf(char *, ...); 20 void initUART(void); 21 22 // global variables 23 float volts = 0.0; // unit: mV 24 float ref_vcc = 3600.0; 25 char i = 0; 26 char status = IDLE; 27 28 void main( void ) 29 { 30   // Stop watchdog timer to prevent time out reset 31   WDTCTL = WDTPW + WDTHOLD; 32    33   // DCO setup 34   BCSCTL1 = CALBC1_1MHZ; 35   DCOCTL = CALDCO_1MHZ; 36    37   // ADC10 setup 38   initADC10(); 39    40   // UART setup 41   initUART(); 42    43   // Timer0 setup 44   initTA0(); 45    46   __enable_interrupt(); 47    48   LPM0; 49 50   while(1) 51   { 52       switch(status) 53       { 54       case IDLE: 55           break; 56       case BUSY: 57           ADC10CTL0 |= ADC10SC;   // start a new conversion 58           while ((ADC10CTL1 & ADC10BUSY) == 0x01);   // wait for conversion to end 59           volts = ADC10MEM * ref_vcc /1023.0; 60           printf("Voltage:  %i mV\r\n", (int)volts); 61           status = IDLE; 62           break; 63       } 64       LPM0; 65    66   } 67 } 68 69 void initADC10(void) 70 { 71     // Use Vcc(3.6V)/GND for Refs, 16 x ADC10CLKs, reference buffer on, turn on ADC 72     ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10SR + ADC10ON; 73      74     // A6 input, use ADC10CLK div 1, single channel mode   75     ADC10CTL1 =  INCH_6 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0; 76      77     // ADC input on P1.6 78     ADC10AE0 = A6; 79      80     // Enable conversions 81     ADC10CTL0 |= ENC;      82 } 83 84 void initTA0(void) 85 {   86     TA0CCR0 = 62550 - 1; 87     TA0CCTL0 = CCIE; // enable compare interrupt 88     TA0CTL = TASSEL_2 + ID_3 + MC_1 + TACLR; 89     // input clock: SMCLK/8 -> 125kHz; Up to CCR0 mode 90     // timer overflow freq: 125k/(TA0CCR0+1) -> 2Hz -> 500ms 91     // clear and start the timer, up mode 92 } 93 94 void initUART(void) {   95     //config P1.1 RXD, P1.2 TXD 96     P1SEL |= TXD + RXD; 97     P1SEL2 |= TXD + RXD; 98          99     //reset UCA0, to be configured100     UCA0CTL1 = UCSWRST;101     //config102     UCA0CTL1 |= UCSSEL_2; //SMCLK103     UCA0BR0 = 104;104     UCA0BR1 = 0;//1MHz baut rate = 9600105     UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1106     //make UCA0 out of reset107     UCA0CTL1 &= ~UCSWRST;108 }109 110 void sendByte(unsigned char byte )111 {112     while (!(IFG2&UCA0TXIFG));            // USCI_A0 TX buffer ready?113     UCA0TXBUF = byte;                // TX -> RXed character114 }115 116 //interrupt service routines117 #pragma vector = TIMER0_A0_VECTOR118 __interrupt void CCR0_ISR(void)119 {120     if(++i == 4) // interval: 1/2 * 4 = 2s, freq: 0.5Hz121     {122         // automatic flag clearing123         i = 0;124         status = BUSY;125         LPM0_EXIT;126     }127 }
 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表