你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8 多通道ADC采集故障,望指点

[复制链接]
mike-420405 提问时间:2013-9-24 18:44 /
 
 
小弟目前在做项目的时候遇到一个很费解的ADC故障...
在ADC采集的时候,我用的是单次采集的用法.
在2个ADC通道采集过程中,如果仅仅只采集一个通道,不采集另外一个通道,发现数据都能正常读取.
但是把2个通道同时放入主函数轮流采集的时候.发现读数就发现巨大变化,正常情况下,我采集的到AD电压数据换算后是0.8V,但是现在读数换算后居然是21V!!!!!!!!!    但是只要不开启任一一路ADC通道,则另外那一路ADC通道的读数又恢复正常..
有大大能帮我答疑解惑吗?不胜感激...
收藏 1 评论12 发布时间:2013-9-24 18:44

举报

12个回答
dzc2001 回答时间:2013-9-25 11:23:50

RE:STM8 多通道ADC采集故障,望指点

是不是有什么共用的资源(比如寄存器)你没处理好
回答时间:2013-9-25 13:23:24

RE:STM8 多通道ADC采集故障,望指点

检查adc的配置吧,这样也不好说,贴代码出来看看就知道
fengye5340 回答时间:2013-9-25 15:16:15

RE:STM8 多通道ADC采集故障,望指点

你的2个通道是用DMA方式采集的吗?建议贴代码看看,看你的描述,好像两个数据的内容都挤到一个数据存储区里面了。这样造成结果非常大了。举个例子:A 16位存储 B 16位存储 你定义一个16位的 BUFFER[2];就没啥问题,但是如果不小心定义成 32位 BUFFER[2];那A B的结果就会全部挤到 BUFFER[0]里面。
  还是上代码看的明白,这个只是猜呢
mike-420405 回答时间:2013-9-26 10:10:37

回复:STM8 多通道ADC采集故障,望指点

代码如下:

u8 ADC1_change(u8 change)                                                //AD信号采集函数
{
                 u8 ADData;
                 u16        AD_result,AD_sum,AD_data0,AD_data1;
                 u8 i;
                       
                        for(i=0;iCSR = change&0x0F;      // 选择AD转换通道
                                ADC1->CR1 |= 0x01;                   // 启动AD转换
                                while(!(ADC1->CSR & 0x80));    // 等待AD转换完成
                                ADC1->CSR = 0x7F;
                        }
                       
                        for(i=0;iCSR = 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);
}
wdm4006 回答时间:2013-9-26 19:59:46

RE:STM8 多通道ADC采集故障,望指点

你的AD_sum定义为16位不对,至少32位
chintau 回答时间:2013-9-27 22:56:34

RE:STM8 多通道ADC采集故障,望指点

楼主这是正常的,我也遇到这样的问题,开始以为硬件问题搞了好久,最后发现单次转换一样的,不用DMA准确多了
scream2008 回答时间:2014-1-3 14:15:34

RE:STM8 多通道ADC采集故障,望指点

两个通道互相影响,这个我也遇到过。
我采用的是STM32F103C8芯片。
你可以做这样一个试验:第一步:两个通道是不加任何内容的,即一般说的是零值采样;第二步:一个通道是满量程,另一个通道是零值;第三步,量这两步的零值电压有什么变化。
我是第一次接触,我觉得是由于两个通道之间切换过快引起的。楼主可以再切换完成后延时在采集。在配置的时候我将采样周期由ADC_SampleTime_41Cycles5改为ADC_SampleTime_239Cycles5。采样点就比较稳定了
开放大学生 回答时间:2014-3-24 18:39:42

RE:STM8 多通道ADC采集故障,望指点

楼主原因找到了没?我现在的也是是这个问题?
gavinliang 回答时间:2017-4-10 14:48:33
这是多通道切换时,相互影响造成的,我也不知道怎么解决。
gavinliang 回答时间:2017-4-10 14:55:14
uint16_t Get_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)
{
    uint16_t GetADC_Value = 0;
    FlagStatus flag_status;
    //ADC1_DeInit();
    /*
            * ADC1_CONVERSIONMODE_CONTINUOUS = 转换模式:连续转换  ADC1_CONVERSIONMODE_SINGLE= 单次转换
              ADC1_CHANNEL_2 = ADC通道2
                    ADC1_PRESSEL_FCPU_D2 = 时钟分频器 fADC1= fMASTER/2
                    ADC1_EXTTRIG_TIM, DISABLE = 启用或者关闭外部触发转换事件:内部定时器1的TRG事件--关闭
                    ADC1_ALIGN_LEFT = 数据对齐方向:左对齐
                    ADC1_SCHMITTTRIG_CHANNEL0, DISABLE = 启用或者关闭指定通道的施密特触发器:通道2--关闭
                                                                                                                                                                     (ADC1_SCHMITTTRIG_ALL, DISABLE = 所有通道--关闭)
            */
    ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel, ADC1_PRESSEL_FCPU_D2, \
              ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);

    ADC1_Cmd(ENABLE);
    ADC1_StartConversion();
    delay_us(10);
    flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
    if (flag_status != RESET) // SET or RESET
    {
        GetADC_Value = ADC1_GetConversionValue(); //返回ADC结果
    }
    return GetADC_Value;
}

//读AD值
void Read_Temperature_TEST()
{       
        Conversion_Value = Get_ADCCH_Value(ADC1_CHANNEL_3); //TEMP_AD_TEST_Value  PD2
  TEMP_AD_TEST_Value = Conversion_Value;

        Conversion_Value = Get_ADCCH_Value(ADC1_CHANNEL_4); //TEMP_AD_Value  PD3
  TEMP_AD_Value = Conversion_Value;

}


在主循环里面,跑Read_Temperature_TEST()。读出来的值是 TEMP_AD_TEST_Value = 464, TEMP_AD_Value = 1000  证明第三通道读出来是正常的,后面通道的受到第三通道的在通道切换时的相互影响,所以后面的第4通道读出来的值就不正常。但是,如果单独只读一个通道,另一个通道不读,这两个通道分别读出来的AD值都是正常的。。太不可思议了,还有这种情况出现 ,希望引起大家的注意。
   希望有解决办法的高人出来指点一下。

sssdd 回答时间:2017-4-13 13:39:05
不懂stm8有DMA。。。
不懂stm8有两个ADC。。
不懂两只ADC同时开?有这种必要?
stm32 的双ADC有要求,采样时间不能重叠。估计你就是重叠了。
时钟频率当然是越慢越好。采样时间当然也是越长越好。
lvkui2017 回答时间:2018-5-28 13:52:01
要多次采集求平均值
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版