你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32AD多通道DMA采样
[复制链接]
wwl225
提问时间:2018-8-29 19:11 /
问答
是否解决:
请问,各位在使用STM32F3系列芯片用AD的DMA多通道采集时是如何处理采集数据的,。。,我再每次DMA采集完毕的中断函数中关中断,处理完AD采样再定时开启,有人这样用吗?但是采集的数据一直不对
赞
0
收藏
0
评论
2
分享
发布时间:2018-8-29 19:11
举报
请先
登录
后回复
2个回答
wenyangzeng
回答时间:2018-8-29 21:55:03
a0a.1 32b0c
ST官方就有现成的代码可供参考:
ADC_DMA_Transfer.rar
(45.21 KB, 下载次数: 13)
2018-8-29 21:54 上传
点击文件名下载附件
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
feixiang20
回答时间:2018-8-30 00:11:35
a0a.1 32b0c
网上有很多实例啊,你可以借鉴的呀,详细说要说很多呢,还是具体看实例吧
用DMA实现多路ADC通道数据采集
今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了。
找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作,保证自己对各部分设置的理解。
我这里用了3路的ADC通道,1路外部变阻器输入,另外两路是内部的温度采样和Vrefint,这样就能组成连续的采样,来测试多通道ADC自动扫描了,ADC分规则转换和注入转换,其实规则转换就是按照既定的设定来顺序转换,而注入转换就是可以在这顺序队列中插队一样,能够提前转换了。
初始化设置:
复制代码
1 //PC0 FOR ANAGLE SAMPLE
2 static void Protect_ClkInit(void)
3 {
4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);
5 RCC_ADCCLKConfig(RCC_PCLK2_Div6);
6 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
7 }
8
9 static void Protect_GPIOInit(void)
10 {
11 GPIO_InitTypeDef GPIO_InitStructure;
12
13 /*GPIO PhaseA_H 初始化*/
14 GPIO_InitStructure.GPIO_Pin = ADC_PIN;
15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
16 GPIO_Init(TIMER_GPIO_AH_PORT, &GPIO_InitStructure);
17 }
18
19 static void Protect_AdcInit(void)
20 {
21 ADC_InitTypeDef ADC_InitStructure;
22
23 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
24 ADC_InitStructure.ADC_ScanConvMode = ENABLE;
25 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
26 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
27 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
28 ADC_InitStructure.ADC_NbrOfChannel = 3;
29 ADC_Init(ADC1, &ADC_InitStructure);
30
31 ADC_TempSensorVrefintCmd(ENABLE);
32 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
33 ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_7Cycles5);
34 ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_7Cycles5);
35
36 ADC_DMACmd(ADC1, ENABLE);
37 /* Enable ADC1 external trigger */
38 ADC_ExternalTrigConvCmd(ADC1, DISABLE);
39
40 ADC_Cmd(ADC1, ENABLE);
41
42 ADC_ResetCalibration(ADC1);
43
44 while(ADC_GetResetCalibrationStatus(ADC1));
45
46 ADC_StartCalibration(ADC1);
47
48 while(ADC_GetCalibrationStatus(ADC1));
49
50 }
51
52 static void Protect_DMAInit(void)
53 {
54
55 DMA_InitTypeDef DMA_InitStructure;
56
57 /* DMA1 channel1 configuration ----------------------------------------------*/
58 DMA_DeInit(DMA1_Channel1);
59 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (ADC1->DR);
60 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
61 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
62 DMA_InitStructure.DMA_BufferSize = 3;
63 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
64 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
65 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
66 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
67 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
68 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
69 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
70 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
71
72 /* Enable DMA1 channel1 */
73 DMA_Cmd(DMA1_Channel1, ENABLE);
74 }
复制代码
设置好后测试,发现一个比较严重的问题,我在调变阻器的时候,发现会影响其他2路采样的数据,且数据变化比较大,我就先测试ADC的参考电压即Vref+和Vref-,没发现变化,那采样的初始化是否会有问题,在网上找了不少的资料,都没表明我的设置有问题,不过还是发现了一个不同,就是ADC_sampling_time的时间不同。那么我就把它设置成:
1 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
2 ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_239Cycles5);
3 ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_239Cycles5);
即最大的采样时间,结果发现确实是这个问题,后来又试了下其他几个采样时间,最短也要ADC_SampleTime_71Cycles5,不然数据都会被影响,大概采样周期不能太短, 不然DMA数据传输可能会被影响。
评分
参与人数
1
蝴蝶豆
+3
收起
理由
zero99
+ 3
查看全部评分
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
用DMA实现多路ADC通道数据采集
今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了。
找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作,保证自己对各部分设置的理解。
我这里用了3路的ADC通道,1路外部变阻器输入,另外两路是内部的温度采样和Vrefint,这样就能组成连续的采样,来测试多通道ADC自动扫描了,ADC分规则转换和注入转换,其实规则转换就是按照既定的设定来顺序转换,而注入转换就是可以在这顺序队列中插队一样,能够提前转换了。
初始化设置:
复制代码
1 //PC0 FOR ANAGLE SAMPLE
2 static void Protect_ClkInit(void)
3 {
4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOC,ENABLE);
5 RCC_ADCCLKConfig(RCC_PCLK2_Div6);
6 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
7 }
8
9 static void Protect_GPIOInit(void)
10 {
11 GPIO_InitTypeDef GPIO_InitStructure;
12
13 /*GPIO PhaseA_H 初始化*/
14 GPIO_InitStructure.GPIO_Pin = ADC_PIN;
15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
16 GPIO_Init(TIMER_GPIO_AH_PORT, &GPIO_InitStructure);
17 }
18
19 static void Protect_AdcInit(void)
20 {
21 ADC_InitTypeDef ADC_InitStructure;
22
23 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
24 ADC_InitStructure.ADC_ScanConvMode = ENABLE;
25 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
26 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
27 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
28 ADC_InitStructure.ADC_NbrOfChannel = 3;
29 ADC_Init(ADC1, &ADC_InitStructure);
30
31 ADC_TempSensorVrefintCmd(ENABLE);
32 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
33 ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_7Cycles5);
34 ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_7Cycles5);
35
36 ADC_DMACmd(ADC1, ENABLE);
37 /* Enable ADC1 external trigger */
38 ADC_ExternalTrigConvCmd(ADC1, DISABLE);
39
40 ADC_Cmd(ADC1, ENABLE);
41
42 ADC_ResetCalibration(ADC1);
43
44 while(ADC_GetResetCalibrationStatus(ADC1));
45
46 ADC_StartCalibration(ADC1);
47
48 while(ADC_GetCalibrationStatus(ADC1));
49
50 }
51
52 static void Protect_DMAInit(void)
53 {
54
55 DMA_InitTypeDef DMA_InitStructure;
56
57 /* DMA1 channel1 configuration ----------------------------------------------*/
58 DMA_DeInit(DMA1_Channel1);
59 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (ADC1->DR);
60 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
61 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
62 DMA_InitStructure.DMA_BufferSize = 3;
63 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
64 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
65 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
66 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
67 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
68 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
69 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
70 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
71
72 /* Enable DMA1 channel1 */
73 DMA_Cmd(DMA1_Channel1, ENABLE);
74 }
复制代码
设置好后测试,发现一个比较严重的问题,我在调变阻器的时候,发现会影响其他2路采样的数据,且数据变化比较大,我就先测试ADC的参考电压即Vref+和Vref-,没发现变化,那采样的初始化是否会有问题,在网上找了不少的资料,都没表明我的设置有问题,不过还是发现了一个不同,就是ADC_sampling_time的时间不同。那么我就把它设置成:
1 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);
2 ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,2,ADC_SampleTime_239Cycles5);
3 ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,3,ADC_SampleTime_239Cycles5);
即最大的采样时间,结果发现确实是这个问题,后来又试了下其他几个采样时间,最短也要ADC_SampleTime_71Cycles5,不然数据都会被影响,大概采样周期不能太短, 不然DMA数据传输可能会被影响。
评分
查看全部评分