蓝桥杯单片机adc双通道采集
时间: 2025-05-31 15:39:48 浏览: 23
### 蓝桥杯单片机ADC双通道采集
在蓝桥杯竞赛中,对于STM32系列单片机而言,实现ADC双通道采集的关键在于合理配置ADC模块以及编写相应的处理逻辑。下面给出一段基于HAL库的示例代码来展示如何完成此功能。
#### 配置与初始化
首先,在STM32CubeMX工具里设定好所需的外设资源,比如将PB15设置为ADC2_IN15,PB12设置为ADC1_IN11,并都选用单端模式[^3]。接着生成项目框架并打开工程文件进行后续编程工作。
```c
// 定义全局变量用于存储两个通道的数据值
u16 adc1_val, adc2_val;
float volt_r37, volt_r38;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
static uint32_t lastTick = 0;
if (uwTick - lastTick >= 100){ // 每隔至少100ms触发一次转换
lastTick = uwTick;
// 启动第一个ADC转换
HAL_ADC_Start(&hadc1);
while(HAL_IS_BIT_SET(hadc1.Instance->SR, ADC_FLAG_EOC)); // 等待转换结束标志位被置位
adc1_val = HAL_ADC_GetValue(&hadc1);
// 计算对应的实际电压值
volt_r38 = adc1_val / 4095.0f * 3.3f;
// 启动第二个ADC转换
HAL_ADC_Start(&hadc2);
while(HAL_IS_BIT_SET(hadc2.Instance->SR, ADC_FLAG_EOC));
adc2_val = HAL_ADC_GetValue(&hadc2);
// 再次计算实际电压值
volt_r37 = adc2_val / 4095.0f * 3.3f;
}
}
```
上述代码片段展示了定时中断服务程序内的操作流程,这里采用了轮询方式等待每次AD转换完成后获取结果,再将其转化为具体的物理量表示形式即电压值[^1]。
为了提高测量精度还可以加入简单的数字滤波算法,例如平均值法:
```c
#define FILTER_SIZE 8
static float filterBuffer[FILTER_SIZE];
static int bufferIndex = 0;
float applyAverageFilter(float newValue){
float sum = 0;
filterBuffer[bufferIndex++] = newValue;
if(bufferIndex >= FILTER_SIZE) bufferIndex = 0; // 循环缓冲区
for(int i=0;i<FILTER_SIZE;++i){
sum += filterBuffer[i];
}
return sum/FILTER_SIZE;
}
// 修改之前的电压赋值语句如下所示:
volt_r38 = applyAverageFilter(adc1_val / 4095.0f * 3.3f);
volt_r37 = applyAverageFilter(adc2_val / 4095.0f * 3.3f);
```
这段附加的过滤机制能够有效减少随机噪声干扰所带来的误差影响,使得最终得到的结果更加稳定可靠。
当涉及到具体的应用场景时,如配合MCP4017数字电位器一起使用,则需额外考虑I²C接口的相关配置及其驱动函数的设计,确保能正确发送指令改变电阻值的同时不影响到正常的模拟信号输入过程[^2]。
阅读全文
相关推荐














