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);
}
}
你好好看看TI提供的历程吧,现在使用的是序列通道的单次采样。
ADC程序写的很烂,先自学然后提高,不要在网上炒来炒去的! 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 static/image/common/back.gif
可以了,搞出来了~~
lz哪里出问题了呢~?分享一下~ 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
压根都没转换采集通道,我汗 Soul.art 发表于 2012-7-21 14:43 static/image/common/back.gif
case 0:
ADC12CTL0|=ADC12SC; //开始转换AD00
while((ADC12CTL1 & 0X01) ...
我一开始是在AD初始化里配置了转换通道,后来在case里~~一样的结果,还是不行
页:
[1]