蓝桥杯嵌入式_STM32学习_ADC

代码

蓝桥杯嵌入式_STM32学习_ADC

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 的配置)

上一篇:git版本管理工具


下一篇:2022-02-03(239. 滑动窗口最大值)