1.扫描转换模式
Continuous Conversion Mode(连续转换模式)
启用:ADC在完成一次转换(或一次扫描序列)后,自动开始下一次转换,无需再次调用 HAL_ADC_Start。
禁用:ADC在完成一次转换(或一次扫描序列)后停止,需手动调用 HAL_ADC_Start 触发下一次转换。
while (1)
{
/* USER CODE END WHILE */
/* 启动ADC扫描转换 */
HAL_ADC_Start(&hadc1);
/* 等待通道1(ADC1_IN1)转换完成 */
if (HAL_ADC_PollForConversion(&hadc1, 50) == HAL_OK)
{
adc1_CH1 = HAL_ADC_GetValue(&hadc1);
}
/* 等待通道2(ADC1_IN2)转换完成 */
if (HAL_ADC_PollForConversion(&hadc1, 50) == HAL_OK)
{
adc1_CH2 = HAL_ADC_GetValue(&hadc1);
}
/* 等待温度传感器通道转换完成 */
if (HAL_ADC_PollForConversion(&hadc1, 50) == HAL_OK)
{
adc1_TempSensor = HAL_ADC_GetValue(&hadc1);
}
/* 停止ADC */
HAL_ADC_Stop(&hadc1);
/* 打印三个通道的ADC值 */
sprintf(adc_str, "CH1:%d,CH2:%d,Temp:%d\n",adc1_CH1,adc1_CH2,adc1_TempSensor);
SEGGER_RTT_printf(0,"%s",adc_str);
/* 延时1秒 */
Delay_ms(500);
/* USER CODE BEGIN 3 */
}
2.单次模式+间断模式(不使用DMA)
【经验分享】STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式)+ 读取内部传感器温度 - STM32团队 ST意法半导体中文论坛
主函数打印数据
char adc_str[20];
float tmp_data;
uint16_t adc;
/* USER CODE END WHILE */
for(uint8_t i=0;i<3;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
adc = HAL_ADC_GetValue(&hadc1);
sprintf((char*)adc_str,"%d ",adc);
SEGGER_RTT_printf(0, "%s", adc_str);
}
HAL_ADC_Stop(&hadc1);
sprintf((char*)adc_str,"\n");
SEGGER_RTT_printf(0, "%s", adc_str);
Delay_ms(1000);
效果