STM32F1笔记(十一)ADC
查看《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引脚的定义
上一篇: STM32之ADC-模数转换