微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > STM8 多通道ADC轮流采集时读数不正常

STM8 多通道ADC轮流采集时读数不正常

时间:10-02 整理:3721RD 点击:

有没有人遇到过这样的ADC故障...


在ADC采集的时候,我用的是单次采集的用法.在2个ADC通道采集过程中,如果仅仅只采集一个通道,不采集另外一个通道,发现数据都能正常读取.但是把2个通道一起放入主函数轮流采集的时候.发现读数就发现巨大变化,正常情况下,单次采集的到AD电压数据换算后是0.8V,但是轮流采集时读数换算后是21V!如果不采用轮流的形式,只开启任一一路ADC通道,则另外那一路ADC通道的读数又恢复正常..


求大侠指点一二。


代码如下:
u8 ADC1_change(u8 change)         //AD信号采集函数
{
u8 ADData;
u16        AD_result,AD_sum,AD_data0,AD_data1;
u8 i;
for(i=0;i<5;i++)
{
ADC1->CSR = change&0x0F; // 选择AD转换通道
ADC1->CR1 |= 0x01; // 启动AD转换
while(!(ADC1->CSR & 0x80)); // 等待AD转换完成
ADC1->CSR = 0x7F;
}
for(i=0;i<10;i++)
{
ADC1->CSR = change&0x0F; // 选择AD转换通道
ADC1->CR1 |= 0x01; // 启动AD转换
while(!(ADC1->CSR & 0x80)); // 等待AD转换完成
AD_data1 = ADC1->DRH;
AD_data0 = ADC1->DRL;
ADC1->CSR &= ~0x80;
AD_result = (AD_data1*256)+AD_data0;
AD_sum+=(AD_result*50/1024);
}
AD_sum/=10;
ADData=AD_sum;

return(ADData);
}
void ADC1_init(void)
{
ADC1->CR1 = 0x40; // 设置AD转换时钟1/8,单次 转换模式
ADC1->CR2 = 0x08; // 设置数据为右对齐
ADC1->CR3 = 0x00; // 不使用数据缓冲
//ADC1->TDRL = 0xff; //关闭施密特触发器
ADC1->CR1 |= 0x01; // 打开AD模块电源
}
while(1)
{
accel=ADC1_change(0x04);
Bat=ADC1_change(0x01);
mode=ADC1_change(0x00);
}

两个通道互相影响,这个我也遇到过。我采用的是STM32F103C8芯片。我是第一次接触,我觉得是由于两个通道之间切换过快引起的。小编可以再切换完成后延时在采集。在配置的时候我将采样周期由ADC_SampleTime_41Cycles5改为ADC_SampleTime_239Cycles5。采样点就比较稳定了

小编可以做这样一个试验:
第一步:两个通道是不加任何内容的,即一般说的是零值采样;
第二步:一个通道是满量程,另一个通道是零值;
第三步,量这两步的零值电压有什么变化。

虽然帖很久了,但是我回复一下,以备他人搜索至此参考
多通道采集切换时,在选择通道之前加上一句,清楚之前的通道选择,如下
可以在小编的代码
ADC1->CSR = change&0x0F; // 选择AD转换通道
前添加一下一句,即可实现通道切换
ADC1->CSR = change&0x80; // 清楚AD转换通道

请问小编,STM8引脚是怎么连接的?只发现一路的ADC .我用的是64引脚的 。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top