当前位置: 代码迷 >> 单片机 >> C8051F550单片机AD检测电压,结果变大后稳固
  详细解决方案

C8051F550单片机AD检测电压,结果变大后稳固

热度:382   发布时间:2016-04-28 14:41:00.0
C8051F550单片机AD检测电压,结果变大后稳定
使用C8051F550单片机片上AD测电流, 发现 当使能AD  AD0BUSY放在 主程序不同位置时,结果不一样。。很困惑。。
 程序大体为
void main ()
{
PCA0MD &=~0x40;   //关看门狗
SYSCLK_Init();       //初始化系统时钟
Port_Init();              //端口初始化
UART0_Init();          //串口初始化
Timer_init();            //时钟初始化
ADC0_Init();             //AD初始化

AD0BUSY=1;    //启动AD
for(i=0,i<20;i++);        //等待转换结束
printf("voltage:  %d mV",voltage);    //voltage AD中断里转换得出
}
现在问题是,程序如上,这样程序一直循环执行,连续不断输出电压值,电压值在一定幅度内;
而如果我把 AD0BUSY=1放到while(1)循环内:
void main ()
{
PCA0MD &=~0x40;   //关看门狗
SYSCLK_Init();       //初始化系统时钟
Port_Init();              //端口初始化
UART0_Init();          //串口初始化
Timer_init();            //时钟初始化
ADC0_Init();             //AD初始化

while(1){
AD0BUSY=1;    //启动AD
for(i=0,i<20;i++);
printf("voltage:  %d mV",voltage);    //voltage AD中断里转换得出
} }
这时,程序不断输出的电压值,是不断变大到一定值才稳定下来,而稳定的值比之前程序电压值大不少。哪个程序输出的电压值是正确的?
我不明白这两个程序不同写法 怎么会对串口输出AD转换的电压值有影响?  谢谢大家赐教!
------解决思路----------------------
都有问题

void main ()
{
PCA0MD &=~0x40;   //关看门狗
SYSCLK_Init();       //初始化系统时钟
Port_Init();              //端口初始化
UART0_Init();          //串口初始化
Timer_init();            //时钟初始化
ADC0_Init();             //AD初始化

AD0BUSY=1;    //启动AD
for(i=0,i<20;i++);        //等待转换结束
printf("voltage:  %d mV",voltage);    //voltage AD中断里转换得出
}

你需要确定这样写程序会自动重复执行main()而不是跑飞了? 一般mani()里面都是while(1)无限循环的,防止main()执行完毕后不知道跑哪去了

AD0BUSY=1;    //启动AD
for(i=0,i<20;i++);
printf("voltage:  %d mV",voltage);    //voltage AD中断里转换得出

你确定for(i=0;i<20;i++)这个延时够了?如果volaage没更新你printf的结果会和上次一样造成稳定的假象

另外先变大后稳定这个现象很常见,大多数不是程序问题,AD转换中碰到这种开机后上漂现象不奇怪, 可能是温度升的过高,
或者采样电阻本身温度性能不好, 一些输出电压信号的传感器制作工艺也会导致这问题
  相关解决方案