使用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转换中碰到这种开机后上漂现象不奇怪, 可能是温度升的过高,
或者采样电阻本身温度性能不好, 一些输出电压信号的传感器制作工艺也会导致这问题