代码
void ADC1_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1,ENABLE);//使能GPIOB和ADC1
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//六分频,为12MHz(ADC最大频率14MHz)
//初始化GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//初始化ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//单通道
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//关闭连续转换模式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//通道数量为1
ADC_Init(ADC1,&ADC_InitStructure);
//校准ADC1
ADC_Cmd(ADC1,ENABLE);//使能ADC1
ADC_ResetCalibration(ADC1);//复位校对
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位完成
ADC_StartCalibration(ADC1);//开始校对
while(ADC_GetCalibrationStatus(ADC1));//等待校对完成
}
u16 Get_Adc(u8 channel){
u16 temp;
ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);//规则组通道初始化
//第一个入口参数为选的配置的 ADC,第二个入口参数为选择配置的通道,第三个入口参数则配置 ADC 编号(例如使用 ADC1,那么就写 1),第四个入口参数则代表单次采样的时钟周期数。
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件启动AD转换
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0);//通过标志位判断转换是否完成
temp = ADC_GetConversionValue(ADC1);//获取转换值
ADC_SoftwareStartConvCmd(ADC1,DISABLE);//关闭软件转换
return temp;
}
// 主函数中
ADC1_Init();
while(1){
if(ADC_Flag){//用定时器先设定每 500ms 读取一次 AD 值
ADC_Flag = 0;
adc_val = Get_Adc(8) * 3.3 / 4095;// PB0 引脚对应的是第 8 通道,我们直接 Get_Adc (8) 即可获取 PB0 的 AD 值。
sprintf((char*)string," ADC_VAL:%.2f ",adc_val);
LCD_DisplayStringLine(Line2,string);
}
}
转动可变电阻,我们发现 ADC 的值随着我们的转动而改变,那么我们这个 ADC 采样程序是没有问题了。
参考博客:
@fei…- 蓝桥杯嵌入式开发经验分享(7.ADC 的配置)