Day24:ADC 高级应用

多通道扫描:
配置多个通道,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数组中的数据(三个通道)
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值