axi dma 寄存器配置_STM32 ADC多通道转换的DMA传输示例

f721127fdebc7ad59efb9df7e38fa318.png

这里以STM32F334 Nucleo板作为硬件平台,使用ARM keil MDK集成开发环境。

对3个ADC通道进行连续、扫描转换,转换结果通过DMA传输到内存,再作为TIM2的3个比较寄存器的值,以控制TIM2三个通道的PWM输出。

另外,使用TIM6的更新事件作为ADC转换的启动触发源。本示例中,TIM6的周期远长于TIM2的周期,通过TIM6周期性地触发AD转换。

使用STM32CubeMx进行配置,基本配置过程如下:

  1. 时钟配置【略】。

  2. 配置ADC。选择ADC1的通道7、8、9三个通道,单端输入。

    79acc9de9f589ad1b40ea393a69077d0.png

8ae12f942017090a2b4e8fc05ab089b0.png

d20ece9c143692f300cf392863535df5.png

配置有关ADC触发DMA传输的内容【EOC触发;Normal模式;从外设到内存;DMA传输中断开启】

c853b377c7384e25eb30314dda0f32d6.png

3、TIM2的配置【时基参数/PWM配置】

705b156f0370ed8cdf455215c6b3eb4d.png

TIM2的三个通道的PWM初始配置一样。

5f36b9a6a26836c718cdd45e1e66e1f5.png

4、TIM6的配置如下【其中更新事件作为触发输出】

5d093f7aff107f3b797ab1d0306731ed.png

5、生成初始代码,创建工程。

6、添加用户代码。

6.1关闭TIM2的3个通道CCR寄存器的预装载功能,修改即时生效。

__HAL_TIM_DISABLE_OCxPRELOAD(&htim2,TIM_CHANNEL_1|TIM_CHANNEL_2|TIM_CHANNEL_3);【这点不是必须的,根据实际应用来定】

6.2 开启TIM2三个通道的PWM输出并使能TIM2.

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

6.3 做ADC的校准操作。

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);

6.4 做好ADC转换及DMA传输的准备工作。Value_Adc为存放ADC结果的内存数组名。

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)Value_Adc, 3);

6.5 开启TIM6的计数并通过它触发AD转换。

   HAL_TIM_Base_Start(&htim6);

6.6 在DMA传输完成中断里添加处理代码。

4ded6ca7e9f2232153e37188cf2b192c.png

将3个通道的AD转换结果赋给相应的比较寄存器以达到调整PWM占空比输出的目的。

因为这里DMA是配置为NORMAL模式,需从新开启DMA传输。

7、结果验证。编译运行查看结果。【三路PWM输出,占空比与ADC转换值相关。本示例的ADC输入没有实际信号,只是悬空而已,结果仅做演示。】

49a78018e8c4386da0b1b473cceb777f.png

******************************************

往期话题链接:

1、基于STM32的TIM+DMA+DAC应用示例

2、基于CubeMx管脚配置时的ADC_IN与GPIO_Analog选项话题

3、一个低功耗应用的案例分析

4、STM32开发者的免费福利---TouchGFX

5、一个跟地址对齐有关的应用异常案例

87f53581c3108c4b82fac68937f56b64.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值