查看《STM32中文参考手册》里ADC的介绍和特性
STM32的ADC最大转换速率为1Mhz,即1us,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。当ADC的时钟超过14M时,将导致结果准确度下降。
规则通道相当于正常运行的程序。注入通道就相当于中断。因此注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。
单次、连续、扫描模式的理解
举例,用ADC1规则通道的顺序为CH0,CH1,CH2,CH3。
1、非扫描模式
在单次转换模式下,启动ADC1,则①开始转换CH0,转换完成后停止,等待ADC的下一次启动,继续从第①步开始转换。
在连续转换模式下,启动ADC1,则①开始转换CH0,转换完成后回到第①步。
2、扫描模式
在单次转换模式下,启动ADC1,则
①开始转换CH0;
②转换完成后自动开始转换CH1;
③转换完成后自动开始转换CH2;
④转换完成后自动开始转换CH3;
⑤转换完成停止,等待ADC的下一次启动下一次ADC启动后从第①步开始转换。
在连续转换模式下,启动ADC1,则
①开始转换CH0;
②转换完成后自动开始转换CH1;
③转换完成后自动开始转换CH2;
④转换完成后自动开始转换CH3;
⑤转换完成后返回第一步。
下面以规则通道的单次转换为例。
ADC初始化配置示例:
void Adc_Init(void)
{ ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE ); RCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));
}
单次转换获取ADC值示例:
u16 Get_Adc(u8 ch)
{ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE);while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));return ADC_GetConversionValue(ADC1);
}
通常我们不会直接使用单次采集得到的ADC,而是多采集几次,可以求算术平均值,也可以去掉一个最高值和一个最低值再求算术平均值。这样处理后得到的ADC值更可靠。
代码示例:
u16 Get_Adc_Average(u8 ch, u8 times)
{u32 temp_val = 0;u8 t;for(t = 0; t < times; t++){temp_val += Get_Adc(ch);delay_ms(5);}return (temp_val / times);
}
获取电压值是ADC常见的应用,计算公式为:U = adc_value * (3.3 / 4096)。 STM32 ADC的分辨率为12,所以=4096。3.3V为参考电压值,注意不是VCC!
正点原子战舰开发板ADC参考电压电路如下
可以简单理解为VDDA就是ADC的参考电压值,即3.3V。
《STM32中文参考手册》里ADC引脚的定义