在学习Continuous Conversion Mode时,根据网上的例程和配置,我发现Continuous Conversion Mode ENABLE 和DISABLE输出结果好像没有区别。后来自己验证下来的结果,做个笔记
Continuous Conversion Mode:使能后,相比于单次转换模式,连续转换模式在打开ADC后一直转换。假如你单通道,在完成一次ADC转换后就停止了,而连续转换模式会一直转换,当你是多通道AN1 ,AN2,AN3,单次转换模式在把三个通道转换完一次后停止,而连续转换模式在转换完AN3后,会从新再次去转换。下面用个例程比较
例程一:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc,50);//
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))
{
value_adc=HAL_ADC_GetValue(&hadc);
voltage=(float)value_adc/4095*3.3*11;
printf("%f\r\n",voltage);
printf("%d\r\n",value_adc);
HAL_Delay(500);
}
输出结果
输出结果:
留意此时ADC的值是在变化的,看着好像在连续的采样,但是你看程序,ADC的开启和等待转换的函数都是放在while()里的,我在网上查好像都是这样的例程。这时候你发现Continuous Conversion Mode选择ENABLE 和DISABLE没有区别。但是当你把 HAL_ADC_Start(&hadc);放到while()上面去,连续转换模式还是DISABLE,你就会发现此时ADC的值不变了,只是进行了一次转换.
其实就是转换了一次,printf函数一直在输出那次的ADC转换而已
此时,你把连续扫描模式ENABLE ,程序不动。你会发现ADC再次连续转换
此时的输出结果是连续转换的,但是我发现此时ADC的值偏大,后来研究一下是采用周期太短的问题。之前Continuous Conversion Mode DISABLE,在while里连续转换,它的真正采用周期并不是你设置的ADC采用周期,而是你while()的循环周期,你多久 循环一次就进行一次采用。当你Continuous Conversion Mode DISABLE ENABLE时,就是上面ADC偏大的那种情况,此时你把周期调长,就可以了.(此时 HAL_ADC_Start(&hadc)放在while里和while外都一样)