25433|55

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

谈谈430中ADC10四种通道采样的问题,希望能对大家有所帮助 [复制链接]

起始对于ADC10四种通道采样的问题,如何操作ADC10,我想大家应该都知道,不知道的就去看手册吧。对于大多数人来说,就像我自己,最大的困难就是如何取值,ADC10中自带一个DTC可以不借助CPU而自动传值,但是传到RAM里的值如何读出来输入到引脚上,这个肯定会令初学者头疼一阵子,其实ADC10在将模拟量转化成数字量后会储存在ADC10MEM中,然后传值时由用户设定ADC10SA的首地址,我们只要将自定义的数组首地址赋值给ADC10SA就可以了,每次传值都是按你设定通道的先后来,如果是序列通道多次转换,加入你ADC10AE0=0X06,那么首先将P1^1通道的值传到数组上,然后会自动跳转到P1^2通道的值传给数组,然后再跳回P1^1通道,单通道就只有那一个通道来回跳转,以下我赋上了自己写好的序列通道多次转换的代码,带详细注解,如果有什么错误希望大家指出:
#include
unsigned int a[32];
unsigned int i,b=0;
float v=0;
void main(void) {
        WDTCTL=WDTPW+WDTHOLD;
        P1OUT=0;
        ADC10CTL0|=ADC10ON+ADC10IE+REFON+REF2_5V+SREF_1+MSC+ADC10SHT_2;//取内部参考电压2.5V,使采样时间为16xADC10CLK,以增大采样时间以保证采样的准确性;
        ADC10CTL1|=INCH_4+CONSEQ_3;//最大采样通道为P1^4,采用序列多次采样的模式
        ADC10DTC1|=0X20;//每一个通道连续采样32次
        ADC10AE0|=0X1a;//使能通道P1^4,3,1;
        P1DIR=BIT0+BIT6;
        while(1)
        {
                ADC10CTL0&=~ENC;//关闭采样使能
                while(ADC10CTL1&ADC10BUSY);//判断是否有采样或转换动作
                ADC10CTL0|=ADC10SC+ENC;//开始采样
                ADC10SA=(unsigned int )a;//将组数a的首地址作为采样的起始地址,首先是对P1^1通道采样32次,  放入数组a中,一次循环后再对P1^3采样32次,以此类推,向下循环
                __bis_SR_register(LPM0_bits+GIE);//关闭CPU,开启总中断
                for(i=0;i<32;++i)
                {
                        b+=a;
                }
                b=b/32;//取32次采样的平均
                v=b*25;
                v=(v/1023)/10;//转化为电压值
                if(v>1.25)
                P1OUT^=BIT0;
                else
                P1OUT^=BIT6;
        }
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
        LPM0_EXIT;
}

最新回复

楼主:问什么  while(ADC10CTL1 & ADC10BUSY);//判断是否有采样或转换动作 这个语句在执行第二次的时候,就无限停在那了?  详情 回复 发表于 2017-8-11 16:55

点评

LZ,如果我想显示数组a里面的值,要怎么读出来  详情 回复 发表于 2012-8-17 02:42
 
点赞 关注(4)

回复
举报

32

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
#include
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
MSP430G2553.H
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(中级)

4
 
b+=a;应该是b+=a;吧,你在取平均值的时候确定他们都32个数据都已经采样好了?而且你P1.1和P1.3两个采样的数据是不是没有全部利用啊。我也是小白,可能意见不是很给力。对了,问个问题,AD的中断触发条件到底是一次成功转换结束后触发的还是转换时间溢出才触发的?ADC10SC使能后是不是进行一次AD采样转换,然后转换结束触发中断,想要再AD采样转换就要再使能ADC10SC?有时候对一些中断的触发条件真的不了解,有没帖子或者资料总结过推荐我下。
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

5
 
不好意思,我理解上出了点偏差,经过再次调试,发现不是对一个通道取32次值后再到下一个通道,而是以此取值,就是a【0】装的是P1^4的值,a【1】装的是P1^3的值,a【2】装的是P1^2的值,a【3】装的是P1^1的值,a【4】装的是P1^0的值,然后又是a【5】装的是P1^4的值,至于为什么P1^2和P1^0都有用,调试发现INCH_x,那个x是几那么前面所有的通道都可以用,在CONSEQ_3的模式下,也就是说ADC10AE0无效,至于为什么,我也不知道,有哪位知道的解释一下,谢谢了,楼上那位的ADC10CTL0=ENS+ADC10SC这一句是开始转换的标志,
GIE的开启标志着进入中断,资料的话我只有ADC10的中文手册,其它的没了,真抱歉……

点评

楼主,这里我有点不理解,那个p1.4到p1.0循环32次的话,那数组a你一开始只定义了32,是不是不够?数组a的大小是不是应该定义为【5*32】?  详情 回复 发表于 2012-7-30 09:56
谢谢楼主,看了你的讲解,我懂了!谢谢。期待楼主对其他模块的详细讲解!  详情 回复 发表于 2012-7-27 00:51
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

6
 
这是更正后的代码:
#include"msp430g2553.h"
unsigned int a[32],b[8];
unsigned int i,j;
float v[8];
void main(void) {
        WDTCTL=WDTPW+WDTHOLD;
        P1OUT=0;
        ADC10CTL0|=ADC10ON+ADC10IE+REFON+REF2_5V+SREF_1+MSC+ADC10SHT_2;//取内部参考电压2.5V,使采样时间为16xADC10CLK,
                                                                                                                                        //增大采样时间以保证采样的准确性;
        ADC10CTL1|=INCH_7+CONSEQ_3;//最大采样通道为P1^7,采用序列多次采样的模式,INCH_X决定了采样通道为AX~A0;
        ADC10DTC1|=0X20;//一共采样32次
        //ADC10AE0|=0XFF;//使能通道A7~A0;
        P1DIR=BIT0+BIT6;
        while(1)
        {
                ADC10CTL0&=~ENC;//关闭采样使能
                while(ADC10CTL1&ADC10BUSY);//判断是否有采样或转换动作
                ADC10CTL0|=ADC10SC+ENC;//开始采样
                ADC10SA=(unsigned int )a;//将组数a的首地址作为采样的起始地址,首先是对A7~A0依次采样放入数组a【0】~a[7]中,在循环对A7~A0依次采样,放入数组a【8】~a【15】
                                                                        //中,以此类推,向下循环直到32次结束
                __bis_SR_register(LPM0_bits+GIE);//关闭CPU,开启总中断
                for(i=0;i<8;++i)
                {
                        b=0;
                        for(j=0;j<4;++j)
                        {
                                b+=a[i+j*8];
                        }
                }
                for(i=0;i<8;++i)
                {
                        b=b/4;//取4次采样的平均
                        v=b*25;
                        v=(v/1023)/10;//转化为电压值
                }
                if(v[6]>1)
                P1OUT^=BIT6;
                else
                P1OUT^=BIT0;
        }
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
        LPM0_EXIT;//退出CPU中断
}
为了让灯亮,方便测试,我把使能ADC10AE0关了

点评

楼主,关于六楼你更正后的代码。有点问题想要请教一下。首先,数据手册里面关于ADC10DTC1的英文解释是DTC transfers. These bits define the number of transfers in each block。01h-0FFh Number of transfers per  详情 回复 发表于 2012-8-4 16:30
为什么b【8】这个数组可以直接b+=a;呢?我不懂,  详情 回复 发表于 2012-8-1 19:16
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT ADC10CTL1 = INCH_1 + ADC10DIV_0 + CONSEQ_3; // Temp Sensor ADC10CLK/4 ADC10CTL0 |= ADC10ON + ADC10IE + REFO  详情 回复 发表于 2012-7-30 09:11
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

7
 
好帖,新手发现每写一句代码都要查手册上的对应语句
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

8
 
多谢楼主的示例,我终于搞出来了
但是有个问题,在我不接输入时,显示采样的电压总是1.4V左右,为什么?

点评

这个我记得用户指南里面有提到过,说是当管脚用作IO口时,如果悬空,在没有输入输出的情况下,为了低功耗考虑,此时管脚上的值无关紧要。也就是说用作输入时如果没有输入,即管脚悬空,读入的值1.x V是无效的,当给  详情 回复 发表于 2012-7-31 11:19
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 

楼主的代码各种编译不过啊

能不能发个能过的呢?
第一个
b+=a;报错
第二个
b,v都报错
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

10
 
晕,那个数组框在发上去的时候没显示出来,是b 【i】和v【i】,要自己添加下,至于不接的时候会显示电压,是因为所用的引脚没有接地,所以一开始会有显示
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

11
 
本来是使用AD12的,刚接触AD10感觉很难用,楼主这个帖子,解开了迷惑了, 现在看看看,这430的功能的确很强大,AD很灵活
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(初级)

12
 
一直不明白采样保持shi是什么意思

点评

ADC采样需要一段时间来获取电压值。  详情 回复 发表于 2012-12-21 15:00
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

13
 

嘿嘿

学到啦。。。谢谢!
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 5楼 Domen 的帖子

谢谢楼主,看了你的讲解,我懂了!谢谢。期待楼主对其他模块的详细讲解!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(中级)

15
 
好贴
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

16
 
不错。记得我以前也是很纠结,面对这些设置。现在写这些都是先看手册能少走很多弯路。手册说的很清楚。楼主加油。
 
 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

17
 

回复 6楼 Domen 的帖子

void main(void)
{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC10CTL1 = INCH_1 + ADC10DIV_0 + CONSEQ_3;         // Temp Sensor ADC10CLK/4
  ADC10CTL0 |= ADC10ON + ADC10IE + REFON + REF2_5V + SREF_1 + MSC + ADC10SHT_2;
  ADC10AE0 = 0X03;  //P1.0 P1.1 analog enable
  ADC10DTC1|=0X0a;
  delay_us(40);
  
  //LCD初始化
  LCD_init_first();
  LCD_init();

  while(1)
  {
   ADC10CTL0 &= ~ENC;//关闭采样使能
   while(ADC10CTL1 & ADC10BUSY);//判断是否有采样或转换动作
   
   ADC10CTL0 |= ADC10SC + ENC;//开始采样
   ADC10SA = (uint)a;
   _EINT();//关闭CPU,开启总中断
   LPM0;

   for(num1=0;num1<2;num++)
   {
     for(num=0;num<5;num++)
     {
        b[num1]+=a[num1+num*2];
     }
   }
   P10=b[1]/5;
   P11=b[0]/5;
   display();   
   P10_v=P10/1023*2.5;
   P11_v=P11/1023*2.5;
   display_v_P10(P10_v);
   display_v_P11(P11_v);   
  }
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
  LPM0_EXIT;// Clear CPUOFF bit from 0(SR)
}
我照着大虾写的程序来的,可是为什么没有反映呢?求助!!!
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

18
 

回复 5楼 Domen 的帖子

楼主,这里我有点不理解,那个p1.4到p1.0循环32次的话,那数组a你一开始只定义了32,是不是不够?数组a的大小是不是应该定义为【5*32】?

点评

我一开始的理解有点偏差,不是每一个通道取32次,是所有通道一共取32次值我后面的回复有更改的:)  详情 回复 发表于 2012-7-30 16:02
 
 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

19
 
自己解决了

点评

我最终又没有改出来:Cry:  详情 回复 发表于 2012-8-3 17:06
是哪里错了,能指出吗?  详情 回复 发表于 2012-8-2 20:45
是哪里错了,能指出吗?  详情 回复 发表于 2012-8-2 20:45
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

20
 

回复 18楼 zhujunjiejuan 的帖子

我一开始的理解有点偏差,不是每一个通道取32次,是所有通道一共取32次值我后面的回复有更改的
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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