STM8多通道ADC单次转换小BUG,终于搞定了!
搞了一下午,被这个STM8多通道查询转换搞蒙了,一直显示转换数据不对,但不知道到底问题出在哪?查了网上很多资料,有说多通道干扰要延时的,也有说多通道数据要变换位置的,还有的说要连续测量多次的,我遇到的问题是:2个通道,一直只测一个通道,另外一个通道始终没数据或者数据不对。上实时仿真才发现,STM8 ADC通道选择状态寄存器有问题(也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化)!最终发现,STM8在操作ADC多通道转换的时候,通道选择状态寄存器要先清零。。。否则通道选择位会出现叠加!本帖最后由 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值
}
支持下,确实是个小bug,如果不指出来,绝大部分人都不会进行这样的操作。 这可不是芯片有问题,本来或运算就是这样的,你不先清一下变量,置位后永远是1. 不要轻易地说芯片BUG,何况是初学者... goyhuan 发表于 2020-11-27 10:09
这可不是芯片有问题,本来或运算就是这样的,你不先清一下变量,置位后永远是1. ...
是的后来我也想到这点了 但是大部分操作都需要这样写的 athlon64fx 发表于 2020-11-27 10:36
不要轻易地说芯片BUG,何况是初学者...
嗯 不能算单片机BUG,主要还是程序BUG 手册上没有特别强调这点,程序写的又是按习惯写的 印象中用过STM8S的多通道AD,没什么问题吧。
这操作寄存器的置位与清零,是程序问题吧……与、或的运算 ,用计算器就能确认对错
直接赋值吧,省得考虑运算问题 **NT018 发表于 2020-11-28 09:00
用 STC8H1K08-36I-TSSOP20, 这个 ADC简单好用
STC 就得了吧,和STM8比较性价比太低。 菜鸟同学 发表于 2020-11-28 10:24
STC 就得了吧,和STM8比较性价比太低。
呵呵 内核、稳定性都不是一个档次 也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误解呢,自己理解有问题,就怪手册没有提醒,是不是手册也要提醒你该吃饭了 **NT018 发表于 2020-11-28 10:46
这个要测试了才知道,我们近期替代了好几个项目,搞不定的找我 我安排工程师对接 ...
早就不用STC了,我2014年就用你们的STC89芯片,出货过后半年掉程序,打电话给你们姚老板,要么打不通,要么打通了很不耐烦,也没有说清一二三,总之瞧不起小客户,从那以后就开始换成STM8 STM32。
就你们现在几块钱的价格,我随便可以买一个M0,给我个有,我何必在51上畏畏缩缩的写代码。 631717730 发表于 2020-11-28 21:15
也可能我的代码问题,用“|”语句去改成寄存器位,反而会让其他位不变化
小伙子是不是对 |= 这个表达式有误 ...
嗯 怪我了 不应该发帖喽
页:
[1]