MSP430:AD10

2020-03-09来源: eefocus关键字: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,还需要多做一些测试,目前手头资源有限


关键字:MSP430  AD10 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic490838.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430低功耗设置小结
下一篇:msp430 timerA interrupt

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430F149内部Flash操作
一般,在单片机中的Flash存储器用于存放程序代码,属于只读型存储器。而在MSP430些列的单片机中,都可以通过内置的Flash控制器擦除或改写任何一段的内容。另外,msp430的单片机内部还专门留有一段Flash区域(information memory),用于存放掉电后需要永久保存的数据。利用430内部的Flash控制器,可以完成较大容量的数据记录、用户设置参数在掉电后的保存等功能。硬件介绍:要对Flash读写,首先要了解MSP430的存储器组织。430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间中,没有代码空间和数据空间之分。一般430的单片机都统一编址在0-64k地址范围中,只有少数高端
发表于 2020-05-07
MSP430F149内部Flash操作
MSP430 FLASH读写
MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。其他段的地址根据容量不同,从0xFFFFh开始,每512字节为一段进行分配。FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址写入
发表于 2020-05-06
关于Msp430 Flash型单片机内部Flash的操作
1 Msp430Flash型单片机内部Flash存储器介绍MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。Msp430的Flash存储器的特点有:1)产生内部编程电压2)可位、字节、字编程,可以单个操作,也可以连续多个操作3)超低功耗操作4)支持段擦除和多段模块擦除2 Flash存储器的分割Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。Flash 存储器被分割成两部分:主存储器和信息存储器,两
发表于 2020-05-06
MSP430的JTAG接口和BSW接口
1.JTAG口,JTAG引脚如下定义:单片机TCK——测试时钟输入,接仿真器7脚单片机TDI——测试数据输入,接仿真器2脚单片机TDO——测试数据输出,接仿真器1脚单片机TMS——测试模式选择,接仿真器5脚单片机TRST——测试复位,输入引脚,低电平有效(此引脚可选),接仿真器11脚 2. BSW接口单片机SBWTDIO/RST——测试数据输入输出,接仿真器1脚TDO,其中SBWTDIO和单片机复位RST引脚复用单片机SBWTCK/TEST——测试时钟,接仿真器7脚TCK
发表于 2020-05-06
MSP430的JTAG接口和BSW接口
MSP430F169(四)——浅谈F169看门狗
什么是看门狗在工业现场,往往会由于供电电源、空间电磁干扰或其他原因引起强烈的干扰噪声。这些干扰作用于数字器件,极易使其产生误动作,从而失去应有的控制功能,引起MSP430发生“程序跑飞”事故。若不进行有效的处理,程序就不能回到正常的状态,从而失去应有的控制功能。看门狗定时器正是为了解放这类问题而产生的,尤其是在具有循环结构的程序任务中更为有效。看门狗有一个RST管脚,用来复位。看门狗的两种工作模式(一)看门狗模式:看门狗模式是看门狗这个组件的主要功能,(这不是废话嘛,看门狗组件肯定是看门狗啊)提到看门狗,不得不说这个密码保护了(WDTPW watchdog timer password )任何读写操作必须通过他才能正确执行指令
发表于 2020-05-06
MSP430F169(四)——浅谈F169看门狗
MSP430学习的第一个模拟I2C程序
#include <msp430.h>unsigned char I2CBUF;unsigned char checkbit;#define SCL_H   (P10OUT |= BIT2)      // P10.2为SCL#define SCL_L   (P10OUT &= ~BIT2)#define SDA_H   (P10OUT |= BIT1)     //p10.1为SDA#define SDA_L   (P10OUT &= ~BIT1)#define
发表于 2020-05-06
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved