本帖最后由 247784937@qq.com 于 2017-10-13 17:39 编辑
本次采用的是HC-SR04超声波模块。产品特点 :
HC-SR04超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,距精度可达高到 3mm ;模块包括超声波发射器、接收器与控制电路。
基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果
设置输入捕获引脚ECHO
设置发射引脚为Trig
输入捕获功能设置:
直接生成IAR程序
以下代码是输入捕获中断,其中执行的是获取高电平的时间
但有高电平信号是,
blue led灯亮,否则灭
red led亮灭提示系统正在运行
uint8_t TIM5CH1_CAPTURE_STA;
uint32_t TIM5CH1_CAPTURE_VAL;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
//printf("HAL_TIM_IC\r\n");
//if(htim->Instance == TIM4)
//{
if( (TIM5CH1_CAPTURE_STA&0x80) == 0)
{
if( (TIM5CH1_CAPTURE_STA&0x40) )
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);
TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
}
else
{
TIM5CH1_CAPTURE_STA = 0;
TIM5CH1_CAPTURE_VAL = 0;
TIM5CH1_CAPTURE_STA |= 0x40;
BLUE_LED(1);
__HAL_TIM_DISABLE(&htim5);
__HAL_TIM_SET_COUNTER(&htim5,0);
TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
__HAL_TIM_ENABLE(&htim5);
}
}
//}
}
下面代码是防止高电平超时
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
//printf("HAL_TIM_Period\r\n");
if( (TIM5CH1_CAPTURE_STA&0x80) == 0 )
{
if( (TIM5CH1_CAPTURE_STA&0x40) )
{
if( (TIM5CH1_CAPTURE_STA&0x3f) == 0x3f)
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = 0XFFFFFFFF;
}
else
{
TIM5CH1_CAPTURE_STA++;
}
}
}
}
}
下面代码是trig引脚发送脉冲信号,开始测距
void TrigPlus(uint16_t xus)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_SET);
delay_us(xus);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_RESET);
}
以下代码是获取了echo反馈信号,把时间转化为距离:距离=高电平时间*声速(340M/S)/2
并通过串口打印数值
TrigPlus(20);
if( (TIM5CH1_CAPTURE_STA&0x80) )
{
TIM5temp = TIM5CH1_CAPTURE_STA&0x3f;
TIM5temp *= 0xFFFFFFFF;
TIM5temp += TIM5CH1_CAPTURE_VAL;
printf("TIM5 Channel_1 Capture rising : %d us \r\n", TIM5temp);
EchoDis = ((double)TIM5temp)/5.80; //距离=高电平时间*声速(340M/S)/2
//1m=1000mm
//为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
printf("HC-SR04 Dis : %f cm \r\n",EchoDis);
TIM5CH1_CAPTURE_STA = 0;
TIM5temp = 0;
BLUE_LED(0);
}
连接运行效果如下所示:
下面是测试输入捕获运行正常
这是利用超声波模块测的数据
实际测试了测试距离,准确度还是可以的,但是当模块倾斜时,误差就非常大。
本帖最后由 247784937@qq.com 于 2017-10-13 17:39 编辑
本次采用的是HC-SR04超声波模块。产品特点 :
HC-SR04超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,距精度可达高到 3mm ;模块包括超声波发射器、接收器与控制电路。
基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果
设置输入捕获引脚ECHO
设置发射引脚为Trig
输入捕获功能设置:
直接生成IAR程序
以下代码是输入捕获中断,其中执行的是获取高电平的时间
但有高电平信号是,
blue led灯亮,否则灭
red led亮灭提示系统正在运行
uint8_t TIM5CH1_CAPTURE_STA;
uint32_t TIM5CH1_CAPTURE_VAL;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
//printf("HAL_TIM_IC\r\n");
//if(htim->Instance == TIM4)
//{
if( (TIM5CH1_CAPTURE_STA&0x80) == 0)
{
if( (TIM5CH1_CAPTURE_STA&0x40) )
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);
TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
}
else
{
TIM5CH1_CAPTURE_STA = 0;
TIM5CH1_CAPTURE_VAL = 0;
TIM5CH1_CAPTURE_STA |= 0x40;
BLUE_LED(1);
__HAL_TIM_DISABLE(&htim5);
__HAL_TIM_SET_COUNTER(&htim5,0);
TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
__HAL_TIM_ENABLE(&htim5);
}
}
//}
}
下面代码是防止高电平超时
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
//printf("HAL_TIM_Period\r\n");
if( (TIM5CH1_CAPTURE_STA&0x80) == 0 )
{
if( (TIM5CH1_CAPTURE_STA&0x40) )
{
if( (TIM5CH1_CAPTURE_STA&0x3f) == 0x3f)
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = 0XFFFFFFFF;
}
else
{
TIM5CH1_CAPTURE_STA++;
}
}
}
}
}
下面代码是trig引脚发送脉冲信号,开始测距
void TrigPlus(uint16_t xus)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_SET);
delay_us(xus);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,GPIO_PIN_RESET);
}
以下代码是获取了echo反馈信号,把时间转化为距离:距离=高电平时间*声速(340M/S)/2
并通过串口打印数值
TrigPlus(20);
if( (TIM5CH1_CAPTURE_STA&0x80) )
{
TIM5temp = TIM5CH1_CAPTURE_STA&0x3f;
TIM5temp *= 0xFFFFFFFF;
TIM5temp += TIM5CH1_CAPTURE_VAL;
printf("TIM5 Channel_1 Capture rising : %d us \r\n", TIM5temp);
EchoDis = ((double)TIM5temp)/5.80; //距离=高电平时间*声速(340M/S)/2
//1m=1000mm
//为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
printf("HC-SR04 Dis : %f cm \r\n",EchoDis);
TIM5CH1_CAPTURE_STA = 0;
TIM5temp = 0;
BLUE_LED(0);
}
连接运行效果如下所示:
下面是测试输入捕获运行正常
这是利用超声波模块测的数据
实际测试了测试距离,准确度还是可以的,但是当模块倾斜时,误差就非常大。