STM32G474 ADC平均值采样
时间: 2025-05-30 21:53:26 浏览: 59
### STM32G474 ADC 平均值采样实现
#### 配置ADC参数
为了在STM32G474上实现ADC平均值采样,首先需要配置ADC的相关参数。具体来说:
- 设置ADC分辨率为12位,数据右对齐[^1]。
- 启用连续转换模式和扫描模式,允许数据循环覆盖。
这些设置可以通过STM32CubeMX图形化界面完成,或者通过修改生成的初始化代码来调整。
#### 编写DMA传输回调函数
当使用DMA进行连续采集时,可以在每次DMA传输完成后计算多个样本的平均值。为此,需编写一个DMA传输完成后的回调函数,在此函数中处理接收到的数据并计算其平均值。
```c
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
uint32_t sum = 0;
static const uint8_t SAMPLE_COUNT = 16; // 定义采样次数
for (uint8_t i = 0; i < SAMPLE_COUNT; ++i) {
sum += AdcConvertedValues[i]; // 假设AdcConvertedValues[]存储了DMA接收缓冲区中的值
}
float averageValue = (float)sum / SAMPLE_COUNT;
/* 将平均值发送到串口或其他地方 */
}
```
上述代码片段展示了如何在一个DMA传输结束后获取一组测量结果,并对其进行求和运算得到总和;之后除以采样数量获得最终的平均读数。
#### 添加滤波算法(可选)
如果希望进一步提高信号质量,则可以考虑加入简单的低通滤波器或者其他类型的数字滤波技术。例如采用滑动窗口平均法作为基础形式之一:
```c
#define FILTER_WINDOW_SIZE 8
static uint16_t filterBuffer[FILTER_WINDOW_SIZE];
static volatile size_t bufferIndex = 0;
// 更新过滤器缓存并返回当前估计值
inline float updateFilter(uint16_t newValue){
filterBuffer[bufferIndex++] = newValue;
if(bufferIndex >= FILTER_WINDOW_SIZE){
bufferIndex=0;
}
int totalSum = 0;
for(int i=0;i<FILTER_WINDOW_SIZE;++i){
totalSum+=filterBuffer[i];
}
return ((float)(totalSum))/(FILTER_WINDOW_SIZE);
}
/* 修改之前的回调函数部分 */
averageValue = updateFilter(newValue);
```
这段程序实现了长度固定的移动平均线(Moving Average),它有助于减少随机噪声的影响而不会显著延迟响应时间。
阅读全文
相关推荐


















