yebobo 发表于 2012-7-21 08:27:44

AD单通道单词不断采集、显示的问题,真心纠结啊~~求解啊

下面是我写的一段代码?我想用1602显示AD值,unsigned int AD_capture(unsigned char s)这个函数是要采集那个通道的AD,显示在LCD的结果是只有AD0的是动态的,就是
说是while(1)中不断执行采集AD,但是其他通道的就是一直不动啊。。。。我是想就采集了一次,我吧AD0接到不同的电压会变的,其他通道就还是不变,,,好纠结啊
是不是AD初始化什么地方配置的不对呢?????真心希望大家一起讨论讨论~~~是哪里与问题呢???

#include <msp430x14x.h>
#include"1602.h"
#define uchar unsigned char
#define uint unsigned int
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
unsigned int AD_in0,AD_in1,AD_in2;

void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF;                     //高速晶振开启
BCSCTL2|=SELM1+SELS;               //MCLK=LFXT1
do{
    IFG1&=~OFIFG;                     //清除振荡器失效标志
    for(i=0;i<100;i++)                //稳定时间
       _NOP();
}
while((IFG1&OFIFG)!=0);            //检查振荡器失效标志是否存在
    IFG1&=~OFIFG;
}
void INIT_AD(void)
{ uint i;
   P6SEL&=0X00;
   P6SEL|=0XFF;
   P6DIR&=0X00;

   ADC12CTL0 &= ~ENC;//设置ENC为0,从而修改ADC12寄存器的值,只有其为零时,才可以修改
   ADC12CTL0|=REFON+REF2_5V+ADC12ON+SHT0_2;   //参考电压开,选择2.5V   
   ADC12CTL1|=SHP;
   ADC12MCTL0 |= INCH_0;   
   ADC12MCTL1 |= INCH_1;
   ADC12MCTL2 |= INCH_2;   
   
   ADC12MCTL0|=0X10;                         //选择基准源
   for ( i=0; i<0x3600; i++) ;      //延时等待基准源确定
   ADC12MCTL1|=0X10;         
   for (i=0; i<0x3600; i++);//选择基准源
   ADC12MCTL2|=0X10;         
   for (i=0; i<0x3600; i++);//选择基准源
                     
   ADC12CTL0|=ENC;                  //使能AD转换
}   

/*************************************************************/
/*                        起动AD转换                         */
/*************************************************************/
unsigned int AD_capture(unsigned char s)
{
unsigned int AD_data;

switch(s)
{
   case 0:               
      ADC12CTL0|=ADC12SC;    //开始转换AD00
      while((ADC12CTL1 & 0X01) ==1);//等待转换完毕   
      AD_data = ADC12MEM0;    //读取AD0
   break;

case 1:   
      ADC12CTL0|=ADC12SC;             //转换AD01   
      while((ADC12CTL1 & 0X01) ==1); //等待转换完毕
      AD_data = ADC12MEM1;      //读取AD1   
   break;
   
   case 2:   //转换AD02
      ADC12CTL0|=ADC12SC;
      while((ADC12CTL1 & 0X01) ==1);      //等待转换完毕
      AD_data = ADC12MEM2;   //读取AD1
   break;
}
return(AD_data);
}
void main( void )
{   
    WDTCTL = WDTPW + WDTHOLD;
    Clock_Init();
    IO();
    INIT_AD();   
    yj1602();
   
   
while(1)
    {
         AD_in0 = AD_capture(0);          //只有通道0 这个可以显示动态的
      ad_show(0,AD_in0);         
         AD_in1 = AD_capture(1);   //其他通道是不动的,就是采集一次就没采集了吗?
         ad_show(6,AD_in1);
    }
}

lvyunzeng 发表于 2012-7-21 09:02:39

你好好看看TI提供的历程吧,现在使用的是序列通道的单次采样。
ADC程序写的很烂,先自学然后提高,不要在网上炒来炒去的!

yebobo 发表于 2012-7-21 09:19:52

lvyunzeng 发表于 2012-7-21 09:02 static/image/common/back.gif
你好好看看TI提供的历程吧,现在使用的是序列通道的单次采样。
ADC程序写的很烂,先自学然后提高,不要在网 ...

谢谢你的建议~~程序是我自己写的,可能确实有点烂,因为初学430,但是这个为什么是序列通道到此转换呢?我没有配置CONSEQ位,是默认的00,也就是单路单词转换,ADC12MCTL1|=INCH1是对应的通道,我不太懂,TI的例程都是在中断中读取寄存器的AD值了,我不想在中断中处理,想通过调用哪个函数来进行AD转换

yebobo 发表于 2012-7-21 09:56:25

可以了,搞出来了~~

nust_奔跑 发表于 2012-7-21 14:32:57

yebobo 发表于 2012-7-21 09:56 static/image/common/back.gif
可以了,搞出来了~~

lz哪里出问题了呢~?分享一下~

Soul.art 发表于 2012-7-21 14:43:57

case 0:               
      ADC12CTL0|=ADC12SC;    //开始转换AD00
      while((ADC12CTL1 & 0X01) ==1);//等待转换完毕   
      AD_data = ADC12MEM0;    //读取AD0
   break;

case 1:   
   * ADC12CTL0|=ADC12SC;             //转换AD01   
      while((ADC12CTL1 & 0X01) ==1); //等待转换完毕
      AD_data = ADC12MEM1;      //读取AD1   
   break;
   
   case 2:   //转换AD02
      *ADC12CTL0|=ADC12SC;
      while((ADC12CTL1 & 0X01) ==1);      //等待转换完毕
      AD_data = ADC12MEM2;   //读取AD1

压根都没转换采集通道,我汗

yebobo 发表于 2012-7-21 14:56:07

Soul.art 发表于 2012-7-21 14:43 static/image/common/back.gif
case 0:               
      ADC12CTL0|=ADC12SC;    //开始转换AD00
      while((ADC12CTL1 & 0X01) ...

我一开始是在AD初始化里配置了转换通道,后来在case里~~一样的结果,还是不行
页: [1]
查看完整版本: AD单通道单词不断采集、显示的问题,真心纠结啊~~求解啊