1、如何使用STM32CubeMX实现DMA模式下的AD转换山西大学电子信息工程系,王晓峰1、在Pinout界面配置ADC输入通道(引脚)在左边栏中勾选要选用为AD通道的引脚,每个ADC对应一组引脚,单击勾选即可。红色为冲突引脚。2、时钟配置图中的PCLK2即为AD模块输入时钟。但不是最终转换速率,且最大转换速率不能超过器件上限(2.4 MSPS)。3、参数配置进入configuration界面。点选ADC按钮。模式为独立模式。ClockPrescaler 是对PCLK2进行分频。需要注意,完成一次AD需要15个周期。所以最终的转换频率是PCLK2除2再除15。Resolution:分辨率:12位
2、二进制数Data alignment数据对齐:右对齐Scan Conversion Mode:扫描转换模式,如果使用了一个ADC下的多个采集通道,需要选择Enable模式,否则只会转换设置的第一个通道。Continuous Conversion Mode连续转换模式Discontinuous Conversion Mode:不连续转换模式DMA Continuous requests :DMA连续请求End of Conversion Selection转换结束方式选择:可选择单通道转换完成后EOC标志置位或所有转换完成后EOC置位。ADC_Regular_ConversionMode:在此项
3、下,需要手动将每一个AD通道添加到Rank里。WatchDog:模拟看门狗NVIC部分添加DMA流并开启中断(第二行),关闭中断模式的中断使能(第一行)。Priority 优先级:可根据具体情况设定。但一定保持SysTick的优先级最高。Memory :勾选此项,转换数据将存在Memory中,并且地址自加连续存放。此功能对某个通道连续多次采样很好用,采样数据会自动填满一个数组,方便软件滤波。Mode :选循环模式,填满数组后自动从头刷新。Data Width 数据长度:如果是12位AD转换,此处选半字。在这个页面可以添加引脚标签。建议保持高阻(不上拉不下拉)。4 程序实现在STM32CubeM
4、X生成好的程序基础上。在main设置一个uhADCxConvertedValue2的全局变量数组。类型为Uint16_t。在main函数的初始化区后,while(1)区前,添加:if(HAL_ADC_Start_DMA(ADC1启动,并开始连续转换,转换结果会放在uhADCxConvertedValue2数组中,大小是100。因为是连续转换,所以数组中存放的是最近100次转换结果。5 软件滤波滤波子函数:可以计算100个点的滤波结果。此函数为中值平均滑动滤波,当然,滑动是ADC的DMA自动实现的。uint16_t ADC_Average(_IO uint16_t *buff , uint16_
5、t num , uint16_t threshold)uint32_t sigma = 0;uint16_t i=0,j=0,temp = 0;uint16_t temp_buffnum;for(i=0;inum;i+)temp_buffi = buffi;for(i=0;i(num-1);i+) for(j=0;j(num-1);j+) if(temp_buffj temp_buffj+1) temp = temp_buffj;temp_buffj = temp_buffj+1;temp_buffj+1 = temp;for(i=threshold;i(num-threshold);i+) sigma = sigma + buffi;temp = (uint16_t)(sigma / (num - threshold*2);return(temp);6 Enjoy your Application _