历史上的今天
返回首页

历史上的今天

今天是: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,还需要多做一些测试,目前手头资源有限


推荐阅读

史海拾趣

ABCircuits公司的发展小趣事

随着公司的不断发展,ABCircuits意识到单打独斗难以应对日益激烈的市场竞争。于是,公司开始积极寻求与其他企业的战略合作。通过与上下游企业的紧密合作,ABCircuits不仅获得了稳定的供应链支持,还成功打开了国际市场的大门。这些合作不仅加速了公司的扩张步伐,也提升了其品牌影响力和市场竞争力。

Cystech公司的发展小趣事

随着全球环保意识的不断提高,C-TECH Co., Ltd积极响应环保号召,将环保理念融入公司的发展之中。公司在2007年就通过了ISO 14001环境管理体系认证,并在生产过程中采用环保材料和工艺,减少废弃物排放和能源消耗。此外,公司还积极参与环保公益活动,推动行业绿色发展。通过践行环保理念,C-TECH Co., Ltd在电子行业树立了良好的企业形象。

GSI Technology公司的发展小趣事

随着电子行业的快速发展,GSI Technology积极寻求新的市场机会。公司凭借其高性能存储器产品在军事、医疗、汽车等领域的应用优势,成功进军这些新兴市场。同时,GSI还积极与行业内其他企业建立战略合作关系,共同推动技术创新和市场拓展。例如,GSI与某知名汽车制造商合作,为其开发定制化的高性能存储器解决方案,有效提升了汽车智能化水平。

Habia Cable公司的发展小趣事

随着电子行业的快速发展,GSI Technology积极寻求新的市场机会。公司凭借其高性能存储器产品在军事、医疗、汽车等领域的应用优势,成功进军这些新兴市场。同时,GSI还积极与行业内其他企业建立战略合作关系,共同推动技术创新和市场拓展。例如,GSI与某知名汽车制造商合作,为其开发定制化的高性能存储器解决方案,有效提升了汽车智能化水平。

Davicom公司的发展小趣事

在竞争激烈的电子行业中,Davicom始终坚持自主研发,不断突破核心技术。公司投入大量研发资金,建立了一支高素质的研发团队,并申请了多项专利。通过多年的努力,Davicom在DSP IC及系统应用技术方面取得了重大突破,成功开发出多款具有竞争力的产品。

Abracon公司的发展小趣事

面对不断变化的市场环境和客户需求,Davicom始终保持创新精神,不断寻求新的发展机遇。公司紧跟行业趋势,积极投入研发资源,推出了一系列具有创新性的产品。这些新产品不仅提升了公司的市场竞争力,也为公司的持续发展注入了新的动力。

问答坊 | AI 解惑

关于LPC1343的USB_HID键盘的端点数据发送问题

我用lpc1343枚举了一个USB HID键盘设备,描述符我用的USB 键盘的,以前用过没问题的。 用end1 发送键盘数据,但是空闲时段一直发送0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00.但是按键数据又是正常的,就是表象没什么影响。不知道会不会对别的有影 ...…

查看全部问答>

上海汉的信息技术股份有限公司 --诚招嵌入式软件工程师

上海汉的信息技术股份有限公司  诚招嵌入式软件工程师 任职要求: 1.本科以上学历,计算机软件或相关专业,2年以上工作经验。 2.具有2年以上C++语言,linux或unix开发经验。 3.熟悉嵌入式开发。 4.懂日语者优先。 有意者请将简历发 ...…

查看全部问答>

关于单片机与PC机的串口通信问题。急!

单片机与PC机的串口通信时,刚开始的时候传的数据是正确的,工作一段时间,传的数据就出现错误,当向PC机传固定的一个数据时,还出现时而正确,时而错误的情形,不知道这是为什么。…

查看全部问答>

如何获取鼠标点击后的坐标? 位置

如何获取鼠标点击后的坐标?   位置…

查看全部问答>

evc模拟器不能用

我装了EVC还有模型器,为什么不模拟器不能用…

查看全部问答>

UL 8750 用於燈具產品的發光二極體光源 安全通則

這是用於燈具產品內的發光二極體光源的評估指南的第一版,適用於發光二極體作為光源的元件,例如發光二極體模組,發光二極體陣列、電源與控制電路。也涵蓋了由最終產品製造商製作的發光二極體光源,它可以是產品的一部分或 ...…

查看全部问答>

LM3S8962自带工程boot_demo_eth经常出现烧录失败的问题。IAR编译的。大家碰到过吗?

LM3S8962自带工程boot_demo_eth经常出现烧录失败的问题。其它工程很少出现。IAR编译的。大家碰到过吗?     用LM Flash Programmer 下载是成功的,没有任何出错的信息。但是下载完成后,就是没有办法跑起来。 用IAR可以调试,但是调 ...…

查看全部问答>

msp430f149控制DHT11温湿度传感器的串口程序

哪位大侠写过msp430f149控制DHT11温室读传感器的串口显示程序,我调了好久总是不能显示数据 ?不知道什么原因?高手帮忙啊,不胜感激之至!! 串口程序; #include  \"usart.h\"struct DHT_data{ unsigned char DH_H;    ...…

查看全部问答>

一个关于CAN 电路接口的问题

我在在板子上看见在CAN接口的高低之间接一个2K的电阻有什么作用啊…

查看全部问答>

Hanker试用周计划提交

Hanker试用周计划提交…

查看全部问答>