MSP430:AD10

使用的MSP430G2553,为AD10,正常有8路输出,P1.0-P1.7为A0-A7

有七个寄存器,

参考电压可以是VCC或者内部参考电压1.5V或者2.5V

参考时钟可以是内部ADC10OSC

最高转换速率达200ksps

转换方式四种:单通道单次,序列通道单次,单通道多次,序列通道多次。多次转换时候会用到DTC功能防止数据还没被取出就被覆盖

单通道的实例程序,开启的为通道5,也就是P1.5

 1 void AD_Channel5_Config(void)
 2 {
 3   /* Configure ADC  Channel */
 4   ADC10CTL1 = INCH_5 + ADC10DIV_0 ;         // Channel 5, ADC10CLK
 5 
 6 
 7   ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;
 8   //SREF_1+REFON +REF2_5V 表示使用内部参考电压  2.5v
 9   ADC10AE0 |= BIT5;                         //P1.5 ADC option
10 
11 }
单通道单次

每次开始转换需要给寄存器置位,写了个小函数

1 void AD_Start(void)
2 {
3     ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion
4 }
开始转换

转换后的数据处理

 1 #pragma vector=ADC10_VECTOR
 2 __interrupt void ADC10_ISR (void)
 3 {
 4     int data ;
 5     float shuju,c;
 6     char a[4];
 7     data = ADC10MEM;
 8     shuju =  ((double)data/1024)*2.5;
 9     c =shuju;
10     a[0]= ((int)c%10+0x30);
11     a[1]= 0x2e;
12     a[2]=  ((int)(c*10)%10+0x30);
13     a[3]=  ((int)(c*100)%10+0x30);
14 
15     uart_send_str(a);
16     __delay_cycles(5);
17     uart_send_huiche();
18 //    uart_send_ch((char)(ADC10MEM*25/1024));
19 }
中断处理数据

多通道的也调通了,几点说明

首先要在ADC10CTL0中开始MSC位

然后 ADC10CTL1 = CONSEQ_3 + INCH_7;     CONSEQ选择转换方式此时为多通道多次,后面的INCH位最高通道位,因为我使用4-7四个通道所以最高INCH_7

数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止。这里不做操作即可

ADC10DTC1 = 0x04;设置转换次数,这里我只转换一遍即停止,因为四个通道所以为4,转换次数=通道数*每个通道转换次数

 ADC10AE0 |= BIT7+BIT6+BIT5+BIT4; 使能这四个通道

ADC10SA =(unsigned int) adc_result;   //数据传送开始地址寄存器  设置DTC的开始地址  Data buffer start

这里值得注意需要传入数组首地址。之前写的ADC10SA adc_result;编译不通过,加了前面的(unsigned int)就OK了,不明白这里。

因为我的定义unsigned int adc_result[];

总之这里改好后程序就OK了。

下面给出代码

 1 void AD_MultiChannel_4_Config(unsigned int adc_result[])
 2 {
 3     ADC10CTL1 = CONSEQ_3 + INCH_7;     // 多通道多次转换, 最大转换通道为A1
 4 
 5 
 6       ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE + REF2_5V+ REFON + SREF_1; // ADC10ON, interrupt enabl
 7 
 8       //采样保持时间为16 x ADC10CLKs,ADC内核开,中断使能   MSC多次转换选择开
 9 
10       //如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行  中断使能
11 
12       //使用DTC时,当一个块传送结束,产生中断
13 
14 
15       //数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止
16 
17       ADC10DTC1 = 0x04; //数据传送控制寄存器1 4 conversions  定义在每块的传送数目  一共采样4次所以单块传送4次
18 
19       //以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次
20 
21 
22       ADC10AE0 |= BIT7+BIT6+BIT5+BIT4;         // P1.0 P1.1 ADC option select 使能模拟输入脚A0 A1
23 
24          //不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,
25 
26       //采样是相同的
27 
28 
29       while (ADC10CTL1 & BUSY);
30       ADC10SA =(unsigned int) adc_result;   //数据传送开始地址寄存器  设置DTC的开始地址  Data buffer start
31 
32               //设置数据开始传送的地址为数组adc_sample[]的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把
33 
34               //地址强制转换为16位的int或unsigned int
35 
36               //应该也可以用指针直接访问DTC的存储区,还没试过
37 
38 
39 
40 }
多通道设置

启动AD代码与前面一样

 1 #pragma vector=ADC10_VECTOR
 2 __interrupt void ADC10_ISR (void)
 3 {
 4     int data ;
 5     float shuju,c;
 6     char a[4];
 7 /*    data = ADC10MEM;
 8     shuju =  ((double)data/1024)*2.5;
 9     c =shuju;
10     a[0]= ((int)c%10+0x30);
11     a[1]= 0x2e;
12     a[2]=  ((int)(c*10)%10+0x30);
13     a[3]=  ((int)(c*100)%10+0x30);
14 
15         uart_send_str(a);
16     __delay_cycles(5);
17     uart_send_huiche();
18 */
19     for(data=0;data<8;data++)
20         {
21 
22 
23             shuju =  ((double)adc_result[data]/1024)*2.5;
24             c =shuju;
25             a[0]= ((int)c%10+0x30);
26             a[1]= 0x2e;
27             a[2]=  ((int)(c*10)%10+0x30);
28             a[3]=  ((int)(c*100)%10+0x30);
29 
30             uart_send_ch((char)data+0x30);
31             uart_send_ch(' ');
32             uart_send_str(a);
33             __delay_cycles(5);
34             uart_send_huiche();
35             __delay_cycles(5);
36 
37         }
中断数据处理

这里 unsigned int adc_result[8];

测试基本OK,还需要多做一些测试,目前手头资源有限

原文地址:https://www.cnblogs.com/wwjdwy/p/3188799.html