[STM32] STM8多通道ADC单次转换小BUG,终于搞定了!

[复制链接]
2477|14
 楼主| henangongda123 发表于 2020-11-26 20:32 | 显示全部楼层 |阅读模式
搞了一下午,被这个STM8多通道查询转换搞蒙了,一直显示转换数据不对,但不知道到底问题出在哪?查了网上很多资料,有说多通道干扰要延时的,也有说多通道数据要变换位置的,还有的说要连续测量多次的,我遇到的问题是:2个通道,一直只测一个通道,另外一个通道始终没数据或者数据不对。上实时仿真才发现,STM8 ADC通道选择状态寄存器有问题(也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化)!最终发现,STM8在操作ADC多通道转换的时候,通道选择状态寄存器要先清零。。。否则通道选择位会出现叠加!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

巧克力娃娃 打赏了 1.00 元 2020-11-27
理由:顶起来,好贴

评论

好帖,看了有收获  发表于 2020-11-28 07:15
 楼主| henangongda123 发表于 2020-11-26 20:32 | 显示全部楼层
本帖最后由 henangongda123 于 2020-11-26 20:34 编辑

参考代码如下:
  1. /********* ADC模数转换操作 **********/
  2. /***********************************************************
  3. 函数名:ADC_Get()
  4. 功  能:获取不同通道ADC转换结果
  5. 参  数:ADC_Channel --- 需要转换的ADC通道
  6. 返回值:无
  7. /**********************************************************/
  8. void ADC_Get(uchar ADC_Channel)
  9. {
  10.         uchar a,b;                  //定义两个变量,用于数据运算
  11.         //初始化ADC
  12.         ADC_CR1 |= 0x20;           //ADC时钟为16/4=4MHz,单次转换模式
  13.         ADC_CSR = 0x00;            /*先清零通道选择状态寄存器(此步非常重要,否则会出现通道选择不对BUG)*/
  14.         if(ADC_Channel==6)
  15.         {
  16.                 ADC_CSR |= 0x06;          //选择通道6(AIN6)
  17.   }
  18.         if(ADC_Channel==5)
  19.         {
  20.                 ADC_CSR |= 0x05;          //选择通道5(AIN5)
  21.         }
  22.         ADC_CR2 |= 0x08;            //ADC转换结果右对齐
  23.   _asm("nop");
  24.         ADC_CR1 |= 0x01;           //使能ADC,唤醒并触发一次ADC转换
  25.         delay_us(10);               //延时等待ADC转换完毕
  26.         //开始转换ADC,结果保存在ADC_Data内
  27.         ADC_CR1 |= 0x01;            //再次启动一次AD转换
  28.         while(!(ADC_CSR&0x80));     //等待转换完成
  29.         ADC_CSR &= 0x7F;            //清除转换完毕中断标志
  30.         b = ADC_DRL;                //先读取ADC转换低8位值
  31.         a = ADC_DRH;                //再读取ADC转换高8位值
  32.         a &= 0x03;                  //取最高2位
  33.         ADC_Data = a*256+b;         //获取最终ADC值
  34. }

xyz549040622 发表于 2020-11-27 09:33 来自手机 | 显示全部楼层
支持下,确实是个小bug,如果不指出来,绝大部分人都不会进行这样的操作。
goyhuan 发表于 2020-11-27 10:09 | 显示全部楼层
这可不是芯片有问题,本来或运算就是这样的,你不先清一下变量,置位后永远是1.
athlon64fx 发表于 2020-11-27 10:36 | 显示全部楼层
不要轻易地说芯片BUG,何况是初学者...
 楼主| henangongda123 发表于 2020-11-27 10:48 | 显示全部楼层
goyhuan 发表于 2020-11-27 10:09
这可不是芯片有问题,本来或运算就是这样的,你不先清一下变量,置位后永远是1. ...

是的  后来我也想到这点了 但是大部分操作都需要这样写的
 楼主| henangongda123 发表于 2020-11-27 10:49 | 显示全部楼层
athlon64fx 发表于 2020-11-27 10:36
不要轻易地说芯片BUG,何况是初学者...

嗯 不能算单片机BUG,主要还是程序BUG 手册上没有特别强调这点,程序写的又是按习惯写的
触觉的爱 发表于 2020-11-27 17:36 | 显示全部楼层
印象中用过STM8S的多通道AD,没什么问题吧。
这操作寄存器的置位与清零,是程序问题吧……与、或的运算 ,用计算器就能确认对错
直接赋值吧,省得考虑运算问题
菜鸟同学 发表于 2020-11-28 10:24 | 显示全部楼层
**NT018 发表于 2020-11-28 09:00
用 STC8H1K08-36I-TSSOP20, 这个 ADC简单好用

STC 就得了吧,和STM8比较性价比太低。
 楼主| henangongda123 发表于 2020-11-28 11:13 | 显示全部楼层
菜鸟同学 发表于 2020-11-28 10:24
STC 就得了吧,和STM8比较性价比太低。

呵呵 内核、稳定性都不是一个档次
631717730 发表于 2020-11-28 21:15 | 显示全部楼层
也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误解呢,自己理解有问题,就怪手册没有提醒,是不是手册也要提醒你该吃饭了
菜鸟同学 发表于 2020-11-30 09:10 | 显示全部楼层
**NT018 发表于 2020-11-28 10:46
这个要测试了才知道,我们近期替代了好几个项目,搞不定的找我 我安排工程师对接 ...

早就不用STC了,我2014年就用你们的STC89芯片,出货过后半年掉程序,打电话给你们姚老板,要么打不通,要么打通了很不耐烦,也没有说清一二三,总之瞧不起小客户,从那以后就开始换成STM8 STM32。
就你们现在几块钱的价格,我随便可以买一个M0,给我个有,我何必在51上畏畏缩缩的写代码。
 楼主| henangongda123 发表于 2020-11-30 12:14 | 显示全部楼层
631717730 发表于 2020-11-28 21:15
也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误 ...

嗯 怪我了 不应该发帖喽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

2115

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部