OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 24957|回复: 18

stm32 adc多通道采集各通道会相互影响

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2015-10-22
在线时间
0 小时
发表于 2015-11-5 20:38:18 | 显示全部楼层 |阅读模式
5金钱

求助。用DMA方式进行双通道ADC转换,给其中一个通道的电压,这个通道AD转换完全正确,但是为什么另一个通道的电压值也会变化。原本以为AD采样太快,但是增加了采样时间还是会有这个问题。

[mw_shl_code=c,true]#include "adc_dma.h" //#include "delay.h" u16 __IO AD_Value[2]; void ADC1_Init(void) { ADC1_GPIO_Config(); ADC1_DMA_Config(); ADC1_Mode_Config(); } static void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; GPIO_Init(GPIOC,&GPIO_InitStructure); } static void ADC1_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&AD_Value; DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize=2; DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; DMA_InitStructure.DMA_Priority=DMA_Priority_Medium; DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; DMA_Init(DMA1_Channel1,&DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); } static void ADC1_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; ADC_InitStructure.ADC_ScanConvMode=ENABLE; ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel=2; ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1,ENABLE); ADC_DMACmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } u16 get_ChannelVale(u8 ADC_Channel) { u16 ret = 0; switch(ADC_Channel) { case ADC_Channel_10: ret = AD_Value[0]; break; case ADC_Channel_11: ret = AD_Value[1]; break; } return ret; }[/mw_shl_code]
[mw_shl_code=c,true]#include "led.h" #include "delay.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "adc_dma.h" extern __IO u16 AD_Value[2]; int main(void) { u16 adcx; float temp; delay_init(); //???±?????????? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//?è????????????·?×é??×é2??2??????????????2???ì???????? uart_init(115200); //?®??????????115200 LED_Init(); //LED?????????? LCD_Init(); ADC1_Init(); //ADC?????? POINT_COLOR=RED;//?è??×??????ì?? LCD_ShowString(60,50,200,16,16,"WarShip STM32 ^_^"); LCD_ShowString(60,70,200,16,16,"ADC TEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2015/10/30"); //?????á?????? POINT_COLOR=BLUE;//?è??×????????? LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:"); LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V"); POINT_COLOR=GREEN;//?è??×????????? LCD_ShowString(60,170,200,16,16,"ADC_CH1_VAL:"); LCD_ShowString(60,190,200,16,16,"ADC_CH1_VOL:0.000V"); while(1) { POINT_COLOR=BLUE;//?è??×????????? adcx=get_ChannelVale( ADC_Channel_10); LCD_ShowxNum(156,130,adcx,4,16,0);//????ADC???? temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowxNum(156,150,adcx,1,16,0);//?????????? temp-=adcx; temp*=1000; LCD_ShowxNum(172,150,temp,3,16,0X80); POINT_COLOR=GREEN;//?è??×????????? adcx=get_ChannelVale( ADC_Channel_11); LCD_ShowxNum(156,170,adcx,4,16,0);//????ADC???? temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowxNum(156,190,adcx,1,16,0);//?????????? temp-=adcx; temp*=1000; LCD_ShowxNum(172,190,temp,3,16,0X80); LED2_REV; delay_ms(250); } }[/mw_shl_code]




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2015-11-5 21:12:40 | 显示全部楼层
因为没有同时给所有通道电压,其他通道都是浮空状态,只要也给电压就正常了
回复

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
发表于 2015-11-6 11:37:28 | 显示全部楼层
回复【2楼】jeraw:
---------------------------------
在STM32L151RD上即使相邻两个叫都给电压(我采集的ACC传感器ADXL335,XYZ轴)也会有点影响可以获取的数据发送出来串口示波看一下晃动波形。解决办法就是采样同步规则采样,就好很多
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
发表于 2015-11-6 11:40:05 | 显示全部楼层
回复【2楼】jeraw:
---------------------------------
我后来分析一下原因就是同步规则采用的是双ADC(ADC1和ADC2)而楼主用的 单ADC扫描模式
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

163

主题

1223

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2014-5-21
在线时间
339 小时
发表于 2015-11-6 11:41:39 | 显示全部楼层
而双ADC模式工作好处就是,引脚内部相当于模拟开关把引脚分配给不同的ADC上,这样信号串扰肯定也小了
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2015-11-6 19:24:12 | 显示全部楼层
回复【5楼】cornrn:
---------------------------------
我试过单ADC是这样,我有空也来试下双ADC
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-11-29
在线时间
4 小时
发表于 2016-12-10 10:12:18 | 显示全部楼层
有干扰啊,肿么解决?????
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
20
金钱
20
注册时间
2014-12-30
在线时间
0 小时
发表于 2017-3-21 23:23:34 | 显示全部楼层
楼主问题解决了吗?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-5-19
在线时间
2 小时
发表于 2017-7-7 17:00:50 | 显示全部楼层
去掉引脚与地之间的电容会好一点,要是在切换通道后稳定一段时间会更好,就是还不知道怎么设置,单次触发好像也是切换通道后立马转换。想到的办法是单通道连续转换,第一次转换就当切换通道,转换值丢弃,取后几次转换的平均值,再转其他通道读数。
回复

使用道具 举报

18

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2014-4-18
在线时间
13 小时
发表于 2017-7-16 12:12:50 | 显示全部楼层
我ADC+DMA多通道采样同样也会受干扰,每次读取结果都是错误值,坐等求解
回复

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2020-4-13 19:03:44 | 显示全部楼层
ADC+DMA多通道采样,串扰严重,实验了2个通道接固定信号,第3个分别接地、接VDD和接电压信号,
只要第三个通道电压变化,其它通道都有影响、变换,有时还很大,不是简单的滤波可以解决,比较乱!
用的信号、VDD和地,都是最小系统板自身或自身电源的分压,希望STM厂商给与解释。
回复

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2020-4-13 19:11:09 | 显示全部楼层
另外,试验发现,板子采用单独电池供电,不使用USB等电源,现象依旧,最大CH之间影响大于100mv,最小20-30mv。
回复

使用道具 举报

4

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2019-7-28
在线时间
59 小时
发表于 2020-4-13 21:40:09 | 显示全部楼层
简单解决办法:将采样周期设到55以上,根据信号的带宽,最好设到最大,经试验,(3个通道)串扰能降到3mv以下,负荷一般 0.1%采集精度的要求,再加上简单的滤波,一般用途没有问题。
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2020-4-14 16:13:09 | 显示全部楼层
本帖最后由 y284858 于 2020-4-14 16:17 编辑

你同一板子除程序外其他一样的情况下改单通道测试看看是不是电路本身有干扰
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-10-14
在线时间
24 小时
发表于 2020-6-2 12:19:29 | 显示全部楼层
综合大家的方法发现 在扫描模式 需要用到的每个adc引脚都接上电,不要悬空,采样周期大于55(ADC_SampleTime_55Cycles5),干扰不是特别严重
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-8-24
在线时间
22 小时
发表于 2021-3-26 10:31:48 | 显示全部楼层
超级无敌磊果果 发表于 2020-6-2 12:19
综合大家的方法发现 在扫描模式 需要用到的每个adc引脚都接上电,不要悬空,采样周期大于55(ADC_SampleTim ...

有效果,
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2020-5-19
在线时间
28 小时
发表于 2021-10-22 18:22:27 | 显示全部楼层
感谢楼上各位大佬分析,采样周期调大后通道间干扰基本没了,最慢速度浮动0.3V左右,最快速度基本可以接受
回复

使用道具 举报

4

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2011-3-22
在线时间
66 小时
发表于 2023-8-17 08:22:56 | 显示全部楼层
谢谢分享
回复

使用道具 举报

4

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2011-3-22
在线时间
66 小时
发表于 2023-8-17 08:23:24 | 显示全部楼层
谢谢分享         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 02:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表