4 种主流读取 ADC 多通道写法

张开发
2026/6/10 23:11:11 15 分钟阅读

分享文章

4 种主流读取 ADC 多通道写法
前置说明ADC 分辨率12bit → 范围0 ~ 4095参考电压3.3V所有代码都基于你现有的hadc1。方式一单通道模式 手动切换通道你当前在用CubeMX 配置ScanConvModeDISABLENbrOfConversion1adc.c 代码/* USER CODE BEGIN 1 */ ADC_ChannelConfTypeDef sConfig5 { .Channel ADC_CHANNEL_5, .Rank ADC_REGULAR_RANK_1, .SamplingTime ADC_SAMPLETIME_1CYCLE_5 }; ADC_ChannelConfTypeDef sConfig6 { .Channel ADC_CHANNEL_6, .Rank ADC_REGULAR_RANK_1, .SamplingTime ADC_SAMPLETIME_1CYCLE_5 }; uint16_t ADC_Read_CH5(void) { HAL_ADC_ConfigChannel(hadc1, sConfig5); HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 20); uint16_t val HAL_ADC_GetValue(hadc1); HAL_ADC_Stop(hadc1); return val; } uint16_t ADC_Read_CH6(void) { HAL_ADC_ConfigChannel(hadc1, sConfig6); HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 20); uint16_t val HAL_ADC_GetValue(hadc1); HAL_ADC_Stop(hadc1); return val; } /* USER CODE END 1 */特点最简单、新手友好每次读都重新配通道速度一般推荐学习/简单项目方式二扫描模式 软件连续读取无DMA、无中断CubeMX 配置必须改ScanConvModeENABLENbrOfConversion2Rank1 CH5Rank2 CH6ContinuousConvModeDISABLEadc.c 读取函数/* USER CODE BEGIN 1 */ // 一次启动依次读出 CH5、CH6 void ADC_Read_2CH(uint16_t *val5, uint16_t *val6) { HAL_ADC_Start(hadc1); // 等待第1路 CH5 HAL_ADC_PollForConversion(hadc1, 20); *val5 HAL_ADC_GetValue(hadc1); // 等待第2路 CH6 HAL_ADC_PollForConversion(hadc1, 20); *val6 HAL_ADC_GetValue(hadc1); HAL_ADC_Stop(hadc1); } /* USER CODE END 1 */main.c 调用uint16_t adc5, adc6; ADC_Read_2CH(adc5, adc6);特点一次启动遍历两个通道效率比方式一高依旧纯轮询不占用中断推荐固定两路、频繁同时采集方式三扫描连续转换 轮询自动循环采样CubeMX 配置ScanConvModeENABLENbrOfConversion2ContinuousConvModeENABLE连续转换Rank1CH5Rank2CH6读取代码不用反复 Start/Stop/* USER CODE BEGIN 1 */ // 初始化时调用一次开启连续转换 void ADC_Start_Continuous(void) { HAL_ADC_Start(hadc1); } // 直接读取当前两组值 void ADC_Get_2CH(uint16_t *val5, uint16_t *val6) { *val5 HAL_ADC_GetValue(hadc1); // 等待切换到第二路 HAL_Delay(1); *val6 HAL_ADC_GetValue(hadc1); } /* USER CODE END 1 */使用main初始化里执行一次ADC_Start_Continuous();之后循环直接取值。特点ADC 一直在自动循环采样响应最快不适合悬空/干扰大的模拟口适合高速、不间断采集方式四扫描 DMA 搬运工业常用最优CubeMX 配置ADCScanENABLE、Nbr2、Rank1CH5、Rank2CH6ContinuousConvModeENABLE开启 ADC DMA 请求内存地址递增配置 DMA 通道循环模式全局缓冲区/* USER CODE BEGIN PTD */ uint16_t adc_buf[2]; // adc_buf[0]CH5 , adc_buf[1]CH6 /* USER CODE END PTD */adc.c 初始化启动/* USER CODE BEGIN 1 */ void ADC_DMA_Init_Start(void) { // 绑定DMA缓冲区循环搬运 HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_buf, 2); } /* USER CODE END 1 */取值主循环直接读数组// 主循环里直接用 uint16_t adc5 adc_buf[0]; uint16_t adc6 adc_buf[1];特点ADC 硬件自动采样 DMA 自动搬运CPU 零开销最稳定、实时性最强推荐正式项目、多通道、长期运行四种方法选型总结方法配置优点缺点适用场景1 单通道切换单通道、关闭扫描代码简单、好排错速度一般学习、简单两路采集2 扫描轮询两路扫描开、2个转换采集效率高需固定两路同时读两个ADC3 连续转换轮询扫描连续转换采样不间断抗干扰弱高速采集4 DMA 自动搬运扫描DMA连续CPU不占用、最稳配置稍多工程、产品级统一头文件声明adc.h以上任意函数都在adc.h添加对应声明示例/* USER CODE BEGIN Prototypes */ uint16_t ADC_Read_CH5(void); uint16_t ADC_Read_CH6(void); void ADC_Read_2CH(uint16_t *val5, uint16_t *val6); void ADC_Start_Continuous(void); void ADC_Get_2CH(uint16_t *val5, uint16_t *val6); void ADC_DMA_Init_Start(void); /* USER CODE END Prototypes */

更多文章