henangongda123 发表于 2020-11-26 20:32

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

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

henangongda123 发表于 2020-11-26 20:32

本帖最后由 henangongda123 于 2020-11-26 20:34 编辑

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

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
也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误 ...

嗯 怪我了 不应该发帖喽
页: [1]
查看完整版本: STM8多通道ADC单次转换小BUG,终于搞定了!