多通道扫描:
配置多个通道,ADC 自动顺序转换
适用于同时采集多路模拟信号 (如多路温度)
连续转换模式:
ADC 转换完成后自动开始下一次转换
适合实时监测 (如电池电压)
DMA+ADC:
ADC 转换结果直接通过 DMA 传输到内存,不占用 CPU
适合高速数据采集 (如音频信号)
ADC 应用案例:
电池电量监测 (通过分压电阻)
温度测量 (通过热敏电阻 + 运放)
光敏电阻测量光照强度
代码示例:(DMA 方式多通道 ADC 采样)
// 全局变量
uint32_t adc_values[3]; // 存储3个通道的转换结果
// ADC初始化
void ADC1_DMA_Init(void){
ADC_ChannelConfTypeDef sConfig;
// 配置ADC参数(扫描模式)
hadc1.Init.ScanConvMode = ENABLE; // 扫描模式
hadc1.Init.ContinuousConvMode = ENABLE; // 连续转换
hadc1.Init.NbrOfConversion = 3; // 转换3个通道
// 配置通道0-2
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 3;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
// 配置DMA
DMA_HandleTypeDef hdma_adc;
hdma_adc.Instance = DMA1_Channel1;
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到内存
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址不变
hdma_adc.Init.MemInc = DMA_MINC_ENABLE; // 内存地址递增
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // 外设数据字对齐
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // 内存数据字对齐
hdma_adc.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_adc.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_adc);
// 关联DMA和ADC
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_values, 3); // 启动DMA转换
}
// 主函数
int main(){
ADC1_DMA_Init();
while(1){
// 处理adc_values数组中的数据(三个通道)
}
}
315

被折叠的 条评论
为什么被折叠?



