发新帖本帖赏金 1.00元(功能说明)我要提问
返回列表
打印
[STM32]

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

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

使用特权

评论回复

打赏榜单

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

评论
happy0god 2020-11-28 07:15 回复TA
好帖,看了有收获 

相关帖子

沙发
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.

使用特权

评论回复
5
athlon64fx| | 2020-11-27 10:36 | 只看该作者
不要轻易地说芯片BUG,何况是初学者...

使用特权

评论回复
6
henangongda123|  楼主 | 2020-11-27 10:48 | 只看该作者
goyhuan 发表于 2020-11-27 10:09
这可不是芯片有问题,本来或运算就是这样的,你不先清一下变量,置位后永远是1. ...

是的  后来我也想到这点了 但是大部分操作都需要这样写的

使用特权

评论回复
7
henangongda123|  楼主 | 2020-11-27 10:49 | 只看该作者
athlon64fx 发表于 2020-11-27 10:36
不要轻易地说芯片BUG,何况是初学者...

嗯 不能算单片机BUG,主要还是程序BUG 手册上没有特别强调这点,程序写的又是按习惯写的

使用特权

评论回复
8
触觉的爱| | 2020-11-27 17:36 | 只看该作者
印象中用过STM8S的多通道AD,没什么问题吧。
这操作寄存器的置位与清零,是程序问题吧……与、或的运算 ,用计算器就能确认对错
直接赋值吧,省得考虑运算问题

使用特权

评论回复
9
菜鸟同学| | 2020-11-28 10:24 | 只看该作者
**NT018 发表于 2020-11-28 09:00
用 STC8H1K08-36I-TSSOP20, 这个 ADC简单好用

STC 就得了吧,和STM8比较性价比太低。

使用特权

评论回复
10
henangongda123|  楼主 | 2020-11-28 11:13 | 只看该作者
菜鸟同学 发表于 2020-11-28 10:24
STC 就得了吧,和STM8比较性价比太低。

呵呵 内核、稳定性都不是一个档次

使用特权

评论回复
11
631717730| | 2020-11-28 21:15 | 只看该作者
也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误解呢,自己理解有问题,就怪手册没有提醒,是不是手册也要提醒你该吃饭了

使用特权

评论回复
12
菜鸟同学| | 2020-11-30 09:10 | 只看该作者
**NT018 发表于 2020-11-28 10:46
这个要测试了才知道,我们近期替代了好几个项目,搞不定的找我 我安排工程师对接 ...

早就不用STC了,我2014年就用你们的STC89芯片,出货过后半年掉程序,打电话给你们姚老板,要么打不通,要么打通了很不耐烦,也没有说清一二三,总之瞧不起小客户,从那以后就开始换成STM8 STM32。
就你们现在几块钱的价格,我随便可以买一个M0,给我个有,我何必在51上畏畏缩缩的写代码。

使用特权

评论回复
13
henangongda123|  楼主 | 2020-11-30 12:14 | 只看该作者
631717730 发表于 2020-11-28 21:15
也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误 ...

嗯 怪我了 不应该发帖喽

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

2116

帖子

19

粉丝