STM32控制超声波测距模块HC-SR04
在学习STM32开发板的过程中,碰到一个常用的测距模块HC-SR04,本来想着很简单,结果使用时出现了种种问题,网上的代码乱七八糟基本上不好用,所以自己好好将这个东西梳理了一遍,现在将梳理结果和代买分享出来。
HC-SR04主要参数 :
5V的电压
小于2ms的工作电流
2-450cm的探测距离
有Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd 四个接口,VCC和GND不用多说,一个接板子上5V的输出,一个接GND,Trig和Echo都接板子上的I/O口,这里我选择的是PA4与PA0.
基本工作原理:
1.给Trig一个至少10us的高电平信号
2.HC-SR04自动发送8个40khz的方波,自动检测是否有信号返回
3.信号返回则通过Echo输出一个高电平,高电平持续时间就是超声波从发送到返回被接收的时间
距离=(高电平时间*声速(340m/s))/2
简单来说就是通过给Trig一个10us的高电平,之后在Echo等待高电平输出,进行一次输入捕获,捕获高电平的输出时间,此输出时间即为测距时间,通过计算时间计算出距离。不断地重复上述操作,完成测距。
//初始化PA0,PA4 (PA4作为输出口,PA0作为输入口)
//HC_SR04初始化
void HCSR04_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0 清除之前设置
GPIOA->CRL|=0X00000008;//PA0输入
GPIOA->ODR|=0<<0; //PA0下拉
GPIOA->CRL&=0XFFF0FFFF;//PA4清除之前设置
GPIOA->CRL|=0X00030000;//PA4推挽输出
GPIOA->ODR|=1<<5; //PA4 输出高
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器
TIM2->CCMR1|=1<<0; //CC1S=01 选择输入端IC1映射到TI1
TIM2->CCMR1|=1<<4; //IC1F=0001 配置滤波器 以Fck_int采样,两个事件后有效
TIM2->CCMR1|=0<<2; //IC1PS=00