STM32多通道ADC查询模式
ADC配置
连续转换一定要打开!
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;//扫描转换模式
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.LowPowerAutoPowerOff = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;//开启 连续转换模式
hadc1.Init.NbrOfConversion = 1;//连续转换次数
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发器
hadc1.Init.DMAContinuousRequests = DISABLE; //连续DMA传输
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;//采样时间
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
调用读取ADC值
unsigned int ADC_1 = 0,ADC_2 = 0;
/*
*ADC检测
*/
unsigned int get_adc(){
HAL_ADC_Start(&hadc1);//开启ADC
HAL_ADC_PollForConversion(&hadc1,500);//等待ADC转换完成,超时为500ms
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){
return HAL_ADC_GetValue(&hadc1); //获取读取值
}
return 0;
}
/*
*读取 ADC值
*/
void read_ADC(){
for(uint8_t i=0;i<2;i++){
if(0==i)ADC_1=get_adc();
else ADC_2=get_adc();
}
HAL_ADC_Stop(&hadc1);
}
将读取到的ADC值转换为电压值
V=3.3*(ADC_1/4096)*分压数;
其他
将ADC转换为其他值如:电量,气体浓度值。需根据实际硬件写程序。
如某蓄电池电压与电量(5格)转换
if(Battery_ADC<=2405){
para.battery_level=1;
}else if(Battery_ADC<=2517){
para.battery_level=2;
}else if(Battery_ADC<=2621){
para.battery_level=3;
}else if(Battery_ADC<=2725){
para.battery_level=4;
}else para.battery_level=5;
//每个电池的数值是不一样的要根据测试硬件得到数据!!!