开发环境:VSCODE(gcc编译链)+STM32CubeMX(也可以使用HUAWEI-LiteOS-Studio) 。 代码:链接:https://pan.baidu.com/s/1uXfIR0GFQOBZPl1NfQP08w
提取码:6b0c
基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将
发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号
时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:距离=
高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对
回响信号的影响。
HAL库代:
void HCSR04_Read_Data(float *cmA,float *cmB,uint16_t *cmC)
{
while(ECHO_IN() ==1);
TRIG_H();
delay_us(1); //10uS 以上脉冲触发信号
TRIG_L();
while(ECHO_IN() ==0); //ECHO_IN为0时,无信号
htim6.Instance->CNT = 0; //清空
HAL_TIM_Base_Start(&htim6); //开启定时器
while(ECHO_IN() ==1); //有信号返回,ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间
HAL_TIM_Base_Stop(&htim6); //关闭定时器
//测试距离=(高电平时间*声速(340M/S))/2;
*cmA =(((htim6.Instance->CNT)*340)/1000000.0)/2*100; //声速换算
*cmB = ((htim6.Instance->CNT))/58.0 ; //厘米换算
*cmC = ((htim6.Instance->CNT))/58; //整数换算
}
固件库3.5代码
void HCSR04_Read_Data(float *cmA,float *cmB,uint16_t *cmC)
{
while(ECHO_IN() ==1);
TRIG_H();
delay_us(15); //10uS 以上脉冲触发信号
TRIG_L();
while(ECHO_IN() ==0); //ECHO_IN为0时,检ECHO_IN为0时,无信号
TIM_SetCounter(TIM6,0); //清空
TIM_Cmd(TIM6,ENABLE); //开启定时器
while(ECHO_IN() ==1); //有信号返回,ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间
TIM_Cmd(TIM6,DISABLE); //关闭定时器
//测试距离=(高电平时间*声速(340M/S))/2;
*cmA =((TIM_GetCounter(TIM6)*340)/1000000.0)/2*100; //声速换算
*cmB = (TIM_GetCounter(TIM6))/58.0 ; //厘米换算
*cmC = (TIM_GetCounter(TIM6))/58; //整数换算
}
|