564|1

1119

帖子

0

资源

纯净的硅(中级)

MSP430:AD10 [复制链接]

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

有七个寄存器,

image.png image.png

参考电压可以是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,还需要多做一些测试,目前手头资源有限


回复

3028

帖子

0

资源

纯净的硅(高级)

谢谢分享,学习一下啊。


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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