STM32F030C8有一个12位ADC接口,现用库函数编写ADC驱动代码
1.初始化接口,配置ADC参数通道
void bsp_adc_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //打开GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //打开ADC1的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //硬件接在PA4上
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //GPIO用作模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //无需内部上拉下拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_DeInit(ADC1); //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值
/* Initialize ADC structure */
ADC_StructInit(&ADC_InitStructure); //初始化成员,下面再给成员赋值
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//f030是12bit
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设 ADCx
ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_239_5Cycles); //PA4对应ADC是通道4,见下面规格书截图,采样周期配置最大时间周期
/* ADC Calibration */
ADC_GetCalibrationFactor(ADC1);
/* Enable the ADC peripheral */
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADRDY flag */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
/* ADC1 regular Software Start Conv */
ADC_StartOfConversion(ADC1);
}
2.获取数据,转换数据
static u16 Get_Adc(u8 ch)
{
//设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
ADC_ChannelConfig(ADC1, ch, ADC_SampleTime_239_5Cycles);//ADC1,规则采样顺序值为 1,采样时间为 239.5 周期
ADC_ContinuousModeCmd(ADC1, ENABLE); //使能软件转换功能
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )== RESET);//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果
}
//多次采样,获取平均值
static 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;
}
//获取测量的电压对应等份
float Get_Battery_Voltage(void)
{
u16 adcx;
float temp;
adcx=Get_Adc_Average(ADC_Channel_4, 10); //选择通道4,10次采集求平均
temp=(float)adcx/4096; //12bit,2^12=4096
return temp;
}
3.调用接口,求出ADC口电压
对应IO口是TTa结构,最大电压是3.3V,因此测量的电压=Get_Battery_Voltage()*3.3(V)