10080|7

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM8AD值读不准?不知道是什么原因 [复制链接]

单片机 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点就是点亮灯了,蜂鸣器不叫,郁闷!
此帖出自stm32/stm8论坛

最新回复

ADC_CSR=0X86;//将AD转换结束状态标志清零,且扫描通道为0~6 楼主是设置了第六个通道吗?还是0~6个共七个通道。。  详情 回复 发表于 2012-7-26 09:12
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
据说STM8S的AD是很准的,建议LZ自己查查,比如,是否累加环节出错,以及阻抗匹配的问题。

还有,这样是错误的:
for(a=0;a>=30;a++)//延迟30个机器周期后再读AD值
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 现在还没到累加环节,直接仿真看寄存器的值就是对不上的。阻抗匹配怎么说,是输入设置的问题吗?
此帖出自stm32/stm8论坛
 
 

回复

45

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 现在在AD口线出接了个104的滤波电容后,误差明显的放小了很多,在电压值比较小的时候AD比较准,电压值越大,误差越大,最大的误差有25左右,精度还是不够。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 阻抗匹配:MCU的AD的输入阻抗(所需的分辨率下,随分辨率会不同) 应该大于 信号源的输出阻抗
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵 好象真是和阻抗有关系,可调电阻为1K,分压电阻100欧。原来是通过一个4.7K的电阻接入到AD口,AD设置为悬浮输入,读树不准。现在将4.7K的电阻调成510欧,误差最大为3,应该算比较准确的了吧!
多谢指教哈!
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

7
 
我也遇到这种情况,调了两天时间,汗!!!
此帖出自stm32/stm8论坛
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

8
 

设置AD转换通道

ADC_CSR=0X86;//将AD转换结束状态标志清零,且扫描通道为0~6
楼主是设置了第六个通道吗?还是0~6个共七个通道。。
此帖出自stm32/stm8论坛
 
个人签名坐钓江口而不关心鱼儿是否上钩
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表