一、HAL库ADC使用
1.基础认识
ADC在数字模拟电路中有过短暂的了解,模数转换,即将模拟量转换为数字量
- ADC的工作均为非阻塞模式
(后续补充)
二、红外模块简介
1.距离测量范围:10~80厘米
2.模拟量输出
3.电源电压:4.5~5.5 V
三、CubeMX配置
1.RCC
2.SYS
3.ADC
4.串口
四、代码
sharp.h
#ifndef __SHARP2Y0A21_H
#define __SHARP2Y0A21_H
#include "main.h"
#define Adc1IN11Distance_READ_TIMES 10 //定义红外传感器读取次数,以便取平均值
void DistanceSensor_Init(void); //初始化红外传感器
float DistanceSensor_Get_Val(void); //读取红外传感器的值
#endif
#include "sharp.h"
#include "adc.h"
#include "main.h"
#include "stdio.h"
//初始化ADC,不用修改
//这里我们仅以规则通道为例
//初始化传感器,需要修改端口和引脚号,这里是c出口,c1引脚,ADC3的IN11
void DistanceSensor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟
//先初始化ADC1通道11 IO口
GPIO_InitStructure.Pin = GPIO_PIN_1;//PA1
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;//模拟输入
GPIO_InitStructure.Pull = GPIO_NOPULL ;//不带上下拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
MX_ADC1_Init();//初始化ADC1
}
//PA1=IN1
float DistanceSensor_Get_Val(void)
{
uint32_t temp_val=0;
float distemp=0.0;
uint8_t t;
for(t=0;t<Adc1IN1Distance_READ_TIMES;t++)
{
temp_val+=HAL_ADC_GetValue(&hadc1); //读取ADC值,通道1
HAL_Delay(5);
}
temp_val/=Adc1IN1Distance_READ_TIMES;//得到平均值,这个是平均的ADC,
printf("average_val=%d\r\n",temp_val);
distemp=temp_val*3.3/4095;
printf("voltage= %f\r\n",distemp);//电压值
//电压对应距离
distemp=(-13.2*distemp*distemp*distemp)+72.84*distemp*distemp-140*distemp+107.12;
return distemp;
}
main.c
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
adcx=HAL_ADC_GetValue(&hadc1);
distance=DistanceSensor_Get_Val();
printf("adcX=%d\r\n",adcx);
printf("shuiwei=%f\r\n",distance);
HAL_Delay(200);
}
完整工程详见本人资源