单片机 STM8S903K3
本人采用单次扫描模式,可以读的到AD值的变化,但是AD值不准
具体来说,测量到AD口的电压为0.65V 理论计算AD值应该为133,但是程序运行中AD转化器读的AD值是46。差别太大了。
程序如下,请大侠们指点问题出在哪?
AD转换程序
void ad_equel_value(void)
{
uchar a,x,n,m,y;
ADC_CR1|=0x01;唤醒AD转换器
ADC_CR2=0X0a;//使能扫描模式,A/D转换为单次扫描模式,数据为右对齐方式。
ADC_CSR=0X86;//将AD转换结束状态标志清零,且扫描通道为0~6
ADC_CR1|=0X01;//启动A/D转换器 启动后14个机器周期读AD转换的值
for(a=0;a>=30;a++)//延迟30个机器周期后再读AD值
{}
nn++;
if(nn<60)//计数60次,确定60秒标志,标志置位才求平均值
{
flag_1ms=0;//清零1ms标志
{
addata_ch_h[0]=ADC_DB0RH;//循环读取 AD0通道的 高位数据
addata_ch_l[0]=ADC_DB0RL;//循环读取 AD0通道的 低位数据
addata_ch_h[1]=ADC_DB1RH;//循环读取 AD1通道的 高位数据
addata_ch_l[1]=ADC_DB1RL;//循环读取 AD1通道的 低位数据
addata_ch_h[2]=ADC_DB2RH;//循环读取 AD2通道的 高位数据
addata_ch_l[2]=ADC_DB2RL;//循环读取 AD2通道的 低位数据
addata_ch_h[3]=ADC_DB3RH;//循环读取 AD3通道的 高位数据
addata_ch_l[3]=ADC_DB3RL;//循环读取 AD3通道的 低位数据
addata_ch_h[4]=ADC_DB4RH;//循环读取 AD4通道的 高位数据
addata_ch_l[4]=ADC_DB4RL;//循环读取 AD4通道的 低位数据
addata_ch_h[5]=ADC_DB5RH;//循环读取 AD5通道的 高位数据
addata_ch_l[5]=ADC_DB5RL;//循环读取 AD5通道的 低位数据
addata_ch_h[6]=ADC_DB6RH;//循环读取 AD6通道的 高位数据
addata_ch_l[6]=ADC_DB6RL;//循环读取 AD6通道的 低位数据
}
for(m=0;m<=6;m++)
{
addata_add_ch[m]=addata_add_ch[m]+addata_ch_h[m]*4+addata_ch_l[m]; //AD各通道AD值循环累加
}
}
else//计数60次后求平均值
{
nn=0;
ADC_CR1&=0xfe;//关断AD转换器
flag_1ms=0;
for(y=0;y<=6;y++)
{
addata_divide_ch[y]=addata_add_ch[y]/60;// 累加值除60得平均值整数部分
addata_yushu_ch[y]=addata_add_ch[y]%60;//求余数
if(addata_yushu_ch[y]>=30) //四舍五入
{
addata_equel_ch[y]=addata_divide_ch[y]+1;
}
else
{
addata_equel_ch[y]=addata_divide_ch[y];
}
addata_add_ch[y]=0; //将累加的AD值的和清0,准备下一 次AD值的累加
}
}
}
主程序:
main()
{
_asm("sim");
clock_inti();
io_inti();
_asm("rim");
timer6_50us();
while(1)
{
time_flag();
if(flag_1ms==1)
{
ad_equel_value();
if((addata_equel_ch[4]>50)&&(addata_equel_ch[4]<160))
{
BEEP_CSR=0X22;
}
else
{
PC_ODR|=0x80;
}
}
}
}
将门槛设为50点就是点亮灯了,蜂鸣器不叫,郁闷! |