1 工作原理
使用超声波模块之前,先了解其IO口和工作原理:
1.1 IO说明
VCC: 供5V电源
GND: 为地线
TRIG: 触发控制信号输入
ECHO: 回响信号输出
1.2 基本工作原理:
认真看好以下工作原理,后面的代码就是基于工作原理来实现的。
(1)采用IO口TRIG触发测距,给最少10us的高电平信号。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2
时序图:
2 程序编写
2.1 外设配置
根据两个信号引脚来配置两个单片机的IO口
trig: 需要产生一个10us高电平, 配置为推挽输出;
echo: 等待高电平脉冲并测量其脉冲宽度, 配置为下拉输入
测量echo的高电平持续的时间,需要用到定时器, 因此配置一个定时器,用来计时
void UltrasonicWave_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 对应trig引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // 对应echo引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
//定时器初始化,分频系数为71,则频率为1MHZ,每个计数为1us,(频率越高越精确)
//重装载值为65535,溢出时间为1us*65536= 65.536ms=0.065536s
//一个计数周期可以测距 0.065536s * 340m/s / 2 = 11.14112m
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //
}
2.2 测距函数
根据工作原理 :
(1)采用IO口TRIG触发测距,给最少10us的高电平信号。
/***** 启动超声波 *****/
void UltrasonicWave_StartMeasure(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_1); //拉高PB1电平
delay_us(20); //持续20us
GPIO_ResetBits(GPIOB, GPIO_Pin_1); //拉低PB1电平
}
(2)有信号返回, 通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2
/***** 测距 *****/
float UltrasonicWave_Measure(void) //
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1);//echo为高电平时,则等待至低电平,才启动超声波
UltrasonicWave_StartMeasure(); //启动超声波
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0);//等待echo的高电平到来
TIM_SetCounter(TIM2,0); //清零计数器
TIM_Cmd(TIM2, ENABLE); //使能定时器2,开始计数
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 1);//等待echo的高电平结束
TIM_Cmd(TIM52, DISABLE); //失能定时器2,截止计数
return (TIM_GetCounter(TIM2))/1000000*340/2 *100; //此处单位转换为cm
}
2.3 测距
int main()
{
float distance;
UltrasonicWave_Init(void);//初始化
delay_init();
while(1)
{
distance = UltrasonicWave_Measure(void); //完成测距
delay_ms(60);//建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。
printf("distance:%5.2f ",distance);//打印到串口
}
}
还可以使用中断方式进行测距, 大致框架如下, 有兴趣自行研究
//先开启对应引脚双边沿触发中断, 中断服务函数大致如下
float Distance;
void EXTI15_10_IRQHandler(void)
{
if(//发生中断)
{
if(//上升沿)
{
TIM_SetCounter(TIM2,0); //清零计数器
TIM_Cmd(TIM2, ENABLE); //使能定时器2,开始计数
}
if(//下降沿)
{
TIM_Cmd(TIM52, DISABLE); //失能定时器2,截止计数
Distance=(TIM_GetCounter(TIM2))/1000000*340/2 *100;//此处单位转换为cm
}
}
EXTI_ClearITPendingBit(EXTI_Line10); //清除中断标志
}
//主函数
```c
extern float Distance;
int main()
{
UltrasonicWave_Init(void);//初始化
while(1)
{
UltrasonicWave_StartMeasure();//启动超声波
delay_ms(60);//建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。
//Distance 在中断服务函数中被重新赋值
printf("Distance:%5.2f ",Distance);//打印到串口
}
}
以上超声波模块的使用一次记录
上一篇:基于STM32单片机采集数据&数据上云
下一篇:基于STM32的超声波HC-SR04详解
推荐阅读
史海拾趣
随着产品技术的不断成熟和市场竞争的加剧,Davicom开始积极拓展市场,加强品牌建设。公司加大市场推广力度,积极参加国内外各类展会和论坛,与潜在客户建立联系。同时,Davicom还注重提高产品质量和服务水平,赢得了客户的信任和好评。
为了进一步提升产品质量和竞争力,大毅科技积极申请并获得了多项国际品质认证,如ISO9001、ISO14001、TS16949等。这些认证不仅证明了大毅科技在品质管理方面的卓越能力,还为公司打开了通往国际市场的大门。随着认证的不断增多,大毅科技的产品开始出口到全球各地,与索尼、雅马哈等知名企业建立了长期合作关系。
随着业务的不断发展,Clover Display Limited意识到规模化生产的重要性。1993年,公司在中国顺德建立了一座占地8000平方米的工厂,专门从事客户定制的LCD及LCM的工业应用。这一举措不仅大幅提升了公司的生产能力,也使其能够更深入地了解市场需求,开发出更符合客户要求的产品。工厂的建立标志着Clover Display Limited在液晶显示领域的地位进一步巩固。
随着业务的不断发展,Clover Display Limited意识到规模化生产的重要性。1993年,公司在中国顺德建立了一座占地8000平方米的工厂,专门从事客户定制的LCD及LCM的工业应用。这一举措不仅大幅提升了公司的生产能力,也使其能够更深入地了解市场需求,开发出更符合客户要求的产品。工厂的建立标志着Clover Display Limited在液晶显示领域的地位进一步巩固。
Honda Tsushin Kogyo在发展的过程中,可能形成了独特的企业文化和社会责任感。公司注重员工培训和团队建设,为员工提供良好的工作环境和发展机会。同时,公司还积极参与社会公益事业,通过捐赠、志愿服务等方式回馈社会。这些举措不仅提升了企业的社会形象,还增强了员工的归属感和凝聚力。在企业文化和社会责任的引领下,Honda Tsushin Kogyo实现了经济效益和社会效益的双赢。
需要注意的是,由于Honda Tsushin Kogyo的具体发展历程和详细故事可能并不完全公开,以上内容主要基于一般性的电子行业发展趋势和企业发展规律进行推测和整理。
自成立以来,AXTAL公司一直致力于提升产品的技术和品质。公司凭借完善的质量管理体系(QMS)确保产品的高质量和可靠性。在产品设计阶段,AXTAL应用了受控设计流程,并在客户应用程序中进行了大量验证步骤和最终验证。同时,公司还拥有记录良好的制造流程过程控制系统,通过大量的在线测试、检查和筛选,确保每一件产品都符合高标准的质量要求。
现象: 计数分频的方式产生了一个时钟ld1_clk,然后对原时钟clk_24和分频时钟ld1_clk都进行了时钟约束,但是并没有将ld1_clk作为output,奇怪的是,编译完后pin planner里就出现了ld1_clk,手动删掉了之后,再编译还是会 ...… 查看全部问答∨ |
|
我现在用的是IXP420芯片,想对GPIO2进行读写操作,来控制LED灯。我向相应的寄存器设置了输出为1,并输出使能,但无法对LED灯进行操作。不知道遗漏了什么,GPIO模式要选择么,我在数据手册上没有找到,如何设置?… 查看全部问答∨ |
|
怎么通过编程的方式获得Windows CE的QFE的安装情况。 相关的MSDN上已经说了,CEQFECheck.exe操作的是windows目录下的WinCEPB500.ini文件,也看了,但是觉得不足以提供足够的信息。 如何才能判断某个QFE是否安装?或者是列出已经安装的QFE?… 查看全部问答∨ |
|
小弟想把LINUX2.6移植到ARM9上去,通过这个学习 驱动编程以及系统移植 现在基础:能看懂驱动,系统的大概 还请路过的大侠能推荐个性价比比较高的三星的2410的板子给ME, 硬件懂的不多,所以以及焊也没那精力 现在考虑的 U龙的 质量有个保证,但是据 ...… 查看全部问答∨ |
|
LM386电源电压4--12V,音频功率0.5w。LM386音响功放是由NSC制造的,它的电源电压范围非常宽,最高可使用到15V,消耗静态电流为4mA,当电源电压为12V时,在8欧姆的负载情况下,可提供几百mW的功率。它的典型输入阻抗为50K。特性(Features): 静态 ...… 查看全部问答∨ |