STM32 超声波测距模块HC-SR04 驱动

HC-SR04是常用的测距模块,这里分享关于这个模块的使用方法。

基本原理:

Trig口输入一个大于10us的高电平做激励(一般用20us)

随后检测Echo口的电平,产生高电平时开始计时,直至低电平时止,得到的时间为超声波行进时间,正比于距离

注意5V供电(注意开发板没有升压变压器,开发板也必须5V供电!!!)

代码实现:

先开启定时器TIME1

72分频(1MHz),10000计数,也就是说1us计数一次、也就是10ms中断一次。

在TIME1中断回调函数中,设置每中断一次计数一次

int dis_t=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM1)
  {
    dis_t++;
  }
}

定义测距函数

先拉低trig口电平,再拉高20us(大于10us即可)

在检测到echo口高电平时开始计数

float get_distance()
{
  HAL_GPIO_WritePin(Trig_Port,Trig_Pin,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(Trig_Port,Trig_Pin,GPIO_PIN_SET);
  delay_us(20);
  HAL_GPIO_WritePin(Trig_Port,Trig_Pin,GPIO_PIN_RESET);
  while(HAL_GPIO_ReadPin(Echo_Port,Echo_Pin)==GPIO_PIN_RESET);
  int count1=__HAL_TIM_GetCounter(&htim1);
  dis_t=0;
  while(HAL_GPIO_ReadPin(Echo_Port,Echo_Pin)==GPIO_PIN_SET);
  int count2=__HAL_TIM_GetCounter(&htim1);
  //u1_printf("%d %d
",dis_t*10000+count2-count1);
  return (dis_t*10000+count2-count1)*17.0/1000;
}

注意最终得到的时间差是:

定时器计数差*1us+中断计数(dis_t)*10ms

最后换算得出距离(单位厘米)

事实上,一般测距时几十厘米的距离用不到中断回调函数(10ms超声波能走3.4m),但为了防止中断后重置计数器导致count相减出现负值,也要考虑定时器中断。

实验结果:

数据测量较为准确,且稳定,一般不需特别的滤波

当然,如果对精度要求高,考虑到偶尔会出现一些奇怪的数据,也可以加上滤波

经验分享 程序员 微信小程序 职场和发展