STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

码农世界 2024-05-28 前端 77 次浏览 0个评论

一、模块资料

(1)模块简介

超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件与硬件完全兼容老版本HC-SRO4;可以通过电阻设置成UART或IIC模式。2CM盲区,4.5M典型最远测距,2.2mA作电流。采用升级解调芯片RCWL-9206,带UART与IIC功能MCU:使其外围更加简洁,工作电压更宽(3-5.5V),接口功能更多。

(2)模块参数

①专业解调测距芯片RCWL-9206 ②支持GPIO,UART与IIC三种模式接口 ③2.2mA工作电流 ④2cm最小盲区 ⑤2cm-450cm的超宽测量范围 ⑥工作温度:-10°C-70°c ⑦3V-5.5V宽电压供电

(3)工作原理

(4)实现思路

程序采用状态机编程,MCU给模块Trig引脚输出一个高电平脉冲-->模块发送脉冲信号-->定时器启动高电平输入捕获-->模块返回的高电平信号到达定时器开始计数-->返回信号变为低电平定时器停止计数-->得到定时器时间差-->根据公式计算距离

二、CubeMX配置

(1)芯片选择

(2)配置RCC、SYS、时钟树

(3)配置GPIO

(4)配置串口1

(5)配置定时器

(6)开启定时器中断

(7)设置路径,生成代码工程

三、Keil5代码

(1)勾选Use MicroLIB

(2)创建SR04.c和SR04.h文件

SR04.h文件同上

SR04.c

#include "SR04.h"
 
float distant;      //测量距离
uint32_t measure_Buf[3] = {0};   //存放定时器计数值的数组
uint8_t  measure_Cnt = 0;    //状态标志位
uint32_t high_time;   //超声波模块返回的高电平时间
 
 
//===============================================读取距离
void SR04_GetData(void)
{
switch (measure_Cnt){
    case 0:
         TRIG_H;
         delay_us(30);
         TRIG_L;
    
        measure_Cnt++;
        __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
        HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                            
        break;
    case 3:
        high_time = measure_Buf[1]- measure_Buf[0];    //高电平时间
         printf("\r\n----高电平时间-%d-us----\r\n",high_time);                           
        distant=(high_time*0.034)/2;  //单位cm
        printf("\r\n-检测距离为-%.2f-cm-\r\n",distant);          
        measure_Cnt = 0;  //清空标志位
        TIM2->CNT=0;     //清空计时器计数
        break;
                
    }
}
 
 
//===============================================us延时函数
    void delay_us(uint32_t us)//主频72M
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
    {
        ;
    }
}
 
//===============================================中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{
    
    if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2
    {
        switch(measure_Cnt){
            case 1:
                measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
                __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获
                measure_Cnt++;                                            
                break;              
            case 2:
                measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
                HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);
                measure_Cnt++;  
                         
        }
    
    }
    
}

SR04.h

#ifndef __SR04_H
#define __SR04_H
#include "main.h"
#include "tim.h"
#include "stdio.h"
 
#define TRIG_H  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define TRIG_L  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)
 
void delay_us(uint32_t us);
void SR04_GetData(void);
 
#endif

(3)将SR04.c添加进工程

(4)usart.c代码添加

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
 
 
 
/* USER CODE BEGIN 1 */
/*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    return ch;
}
/* USER CODE END 1 */

(5)main函数

#include "SR04.h"
 
 
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      
      SR04_GetData(  );
      HAL_Delay(1500);
      
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

四、编译

五、接线图及效果

转载请注明来自码农世界,本文标题:《STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,77人围观)参与讨论

还没有评论,来说两句吧...

Top