一、超声波模块
一、SR04超声波模块
说明:
原理
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。(即mcu输出一个高电平持续10us脉冲信号。)
(2)ECHO引脚自动发送 8 个 40khz 的方波,自动检测是否有信号返回;有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
(即:通过mcu检测该引脚的电平状态。)
修改配置systick
配置tim:
/* 滴答定时器配置1ms
SystemCoreClock/1000 1ms中断一次
SystemCoreClock/100000 10us中断一次
SystemCoreClock/1000000 1us中断一次
*/
HAL_SYSTICK_Config(SystemCoreClock/(1000000));
/* 系统滴答定时器时钟源 */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* 系统滴答定时器中断优先级配置 */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
uint64_t count=0;
uint64_t time_end=0;
//定时器配置,设定一个10us的更新中断。
htim4.Instance = TIM4;
htim4.Init.Prescaler = 120-1;//1hmz=1us
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 10-1;//10 us
HAL_TIM_Base_Start_IT(&htim4);
//在中断回调里进行自加处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* 根据形参判断进入回调函数的是哪个定时器 */
if(htim == &htim4)
{
count++;
}
}
int16_t sonar_mm(void) //测距并返回单位为毫米的距离结果
{
uint32_t Distance,Distance_mm = 0;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET); //输出高电平
HAL_Delay(15);//延时15微秒
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET); //输出低电平
while( HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==0);//等待低电平结束
count=0;//计时清零
while(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==1);//等待高电平结束
time_end=count; //记录结束时的时间
if(time_end/100<38) //判断是否小于38毫秒,大于38毫秒的就是超时,直接调到下面返回0
{
Distance=(count*346)/2; //计算距离,25°C空气中的音速为346m/s
Distance_mm=Distance/100; //因为上面的time_end的单位是10微秒,所以要得出单位为毫米的距离结果,还得除以100
}
return Distance_mm; //返回测距结果
}
float sonar(void) //测距并返回单位为米的距离结果
{
uint32_t Distance,Distance_mm = 0;
float Distance_m=0;
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET);//输出高电平
HAL_Delay(15);//延时15微秒
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET); //输出低电平
while( HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==0);//等待低电平结束
count=0;//计时清零
while(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1)==1);//等待高电平结束
time_end=count;
if(time_end/100<38)
{
Distance=(time_end*346)/2;
Distance_mm=Distance/100;
Distance_m=Distance_mm/1000;
}
return Distance_m;
}