历史上的今天
今天是:2025年03月09日(星期日)
2020年03月09日 | MSP430:AD10
2020-03-09 来源:eefocus
使用的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,还需要多做一些测试,目前手头资源有限
上一篇:MSP430低功耗设置小结
史海拾趣
|
我用lpc1343枚举了一个USB HID键盘设备,描述符我用的USB 键盘的,以前用过没问题的。 用end1 发送键盘数据,但是空闲时段一直发送0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00.但是按键数据又是正常的,就是表象没什么影响。不知道会不会对别的有影 ...… 查看全部问答> |
|
上海汉的信息技术股份有限公司 诚招嵌入式软件工程师 任职要求: 1.本科以上学历,计算机软件或相关专业,2年以上工作经验。 2.具有2年以上C++语言,linux或unix开发经验。 3.熟悉嵌入式开发。 4.懂日语者优先。 有意者请将简历发 ...… 查看全部问答> |
|
单片机与PC机的串口通信时,刚开始的时候传的数据是正确的,工作一段时间,传的数据就出现错误,当向PC机传固定的一个数据时,还出现时而正确,时而错误的情形,不知道这是为什么。… 查看全部问答> |
|
這是用於燈具產品內的發光二極體光源的評估指南的第一版,適用於發光二極體作為光源的元件,例如發光二極體模組,發光二極體陣列、電源與控制電路。也涵蓋了由最終產品製造商製作的發光二極體光源,它可以是產品的一部分或 ...… 查看全部问答> |
|
LM3S8962自带工程boot_demo_eth经常出现烧录失败的问题。IAR编译的。大家碰到过吗? LM3S8962自带工程boot_demo_eth经常出现烧录失败的问题。其它工程很少出现。IAR编译的。大家碰到过吗? 用LM Flash Programmer 下载是成功的,没有任何出错的信息。但是下载完成后,就是没有办法跑起来。 用IAR可以调试,但是调 ...… 查看全部问答> |
|
哪位大侠写过msp430f149控制DHT11温室读传感器的串口显示程序,我调了好久总是不能显示数据 ?不知道什么原因?高手帮忙啊,不胜感激之至!! 串口程序; #include \"usart.h\"struct DHT_data{ unsigned char DH_H; ...… 查看全部问答> |




