1.超声波雷达驱动.h文件
采用一个定时器10us一次进行检测
#include "stdint.h"
extern TIM_HandleTypeDef htim16;
#define Driver_Radar_ITStart() HAL_TIM_Base_Start_IT(&htim16)
#define Driver_Radar_ITStop() HAL_TIM_Base_Stop_IT(&htim16)
#define Driver_Radar_Cnt_Clear() __HAL_TIM_SET_COUNTER(&htim16, 0)
#define Driver_Radar1_Trig_Port GPIOB
#define Driver_Radar1_Echo_Port GPIOB
#define Driver_Radar1_Trig_Pin GPIO_PIN_11
#define Driver_Radar1_Echo_Pin GPIO_PIN_10
#define Driver_Radar_Set GPIO_PIN_SET
#define Driver_Radar_Reset GPIO_PIN_RESET
#define Driver_Radar_Start_Time 10 //触发信号时间 -- 10us*100
#define Driver_Radar_Time_Out 24000 //检测最大为4m,时间约为0.24s
#define Driver_Radar_Error_Time 4000 //测试时发送出现莫名其妙的大数值一般就是雷达太近了
#define Driver_Radar_Normal 0x00 //正常模式
#define Driver_Radar_Trig_Off 0x01 //触发信号关闭模式
#define Driver_Radar_Cheak_Ready 0x02 //检测信号准备
#define Driver_Radar_Cheak 0x03 //检测信号模式
typedef enum
{
Radar_1 = 0,
Radar_Max
} Driver_Radar_TypeDef;
typedef struct
{
volatile uint8_t Ctrl;
volatile uint32_t time;
uint32_t cheak_time;
uint32_t pin_number;
void (*Radat_On)(void);
void (*Radat_Off)(void);
uint8_t (*Radat_Read)(void);
} Driver_Radar_Struct;
2.超声波雷达驱动.c文件
//雷达1开启
static void Driver_Radar_1_On(void)
{
HAL_GPIO_WritePin(Driver_Radar1_Trig_Port, Driver_Radar1_Trig_Pin, Driver_Radar_Set);
}
//雷达1关闭
static void Driver_Radar_1_Off(void)
{
HAL_GPIO_WritePin(Driver_Radar1_Trig_Port, Driver_Radar1_Trig_Pin, Driver_Radar_Reset);
}
//雷达1读数据
static uint8_t Driver_Radar_1_Read(void)
{
return HAL_GPIO_ReadPin(Driver_Radar1_Echo_Port, Driver_Radar1_Echo_Pin);
}
static Driver_Radar_Struct radar[Radar_Max] =
{
//控制信号 触发时间 检测时间 引脚号 触发信号开 触发信号关 检测信号读取
{0, 0, 0, Driver_Radar1_Echo_Pin, Driver_Radar_1_On, Driver_Radar_1_Off, Driver_Radar_1_Read},
};
/*********************************************************************
* @fn Driver_Radar_Start
*
* @brief 雷达启动.
*
* @param none
*
* @return none
*/
void Driver_Radar_Start(uint8_t ID)
{
if(ID < Radar_Max)
{
if(radar[ID].Ctrl == Driver_Radar_Normal)
{
radar[ID].time = 0;
radar[ID].Ctrl = Driver_Radar_Trig_Off;
radar[ID].Radat_On();
Driver_Radar_Cnt_Clear();
Driver_Radar_ITStart();
}
}
}
/*********************************************************************
* @fn Driver_Radar_Read
*
* @brief 读取雷达数值.
*
* @param none
*
* @return none
*/
uint16_t Driver_Radar_Read(uint8_t ID)
{
return radar[ID].cheak_time;
}
/*********************************************************************
* @fn Driver_Radar_Cheak_Callback
*
* @brief 雷达检测.
*
* @param none
*
* @return none
*/
void Driver_Radar_Cheak_Callback(uint16_t GPIO_Pin)
{
for(Driver_Radar_TypeDef i = Radar_1; i < Radar_Max; i++)
{
if(GPIO_Pin == radar[i].pin_number)
{
if(radar[i].Radat_Read() == Driver_Radar_Set)
{
radar[i].time = 0;
radar[i].Ctrl = Driver_Radar_Cheak;
}
else if(radar[i].Radat_Read() == Driver_Radar_Reset)
{
radar[i].cheak_time = radar[i].time;
if(radar[i].cheak_time >= Driver_Radar_Error_Time)
{
radar[i].cheak_time = 0;
}
radar[i].time = 0;
radar[i].Ctrl = Driver_Radar_Normal;
}
}
}
}
/*********************************************************************
* @fn HAL_TIM_PeriodElapsedCallback
*
* @brief 定时器回调函数 -- 10us一次.
*
* @param none
*
* @return none
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
uint8_t radar_open_num = 0;
if(htim->Instance == TIM16)
{
for(Driver_Radar_TypeDef i = Radar_1; i < Radar_Max; i++)
{
switch(radar[i].Ctrl)
{
case Driver_Radar_Normal: //正常等待模式
if(++radar_open_num >= Radar_Max)
{
Driver_Radar_ITStop();
}
break;
case Driver_Radar_Trig_Off: //信号触发模式
if(radar[i].time++ >= Driver_Radar_Start_Time)
{
radar[i].Ctrl = Driver_Radar_Cheak_Ready;
radar[i].time = 0;
radar[i].Radat_Off();
}
break;
case Driver_Radar_Cheak_Ready: //数据等待校验模式
break;
case Driver_Radar_Cheak: //数据检测模式
radar[i].time++;
break;
default:
break;
}
}
}
}
3.例程
static uint16_t radar_val = 0;
Driver_Radar_Start(Radar_1); //开启雷达
radar_val = Driver_Radar_Read(Radar_1)*17/10;