- 1、本文档共2页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
基于stm32F407的超声波测距程序及注意事项(HC-SR04)
⽹上的资料太杂太乱,调这个东西的时候⾛了不少弯路,现在分享出来,亲测管⽤!
基本⼯作原理:
(1)采⽤IO⼝TRIG触发测距,给⾄少10us的⾼电平信号;
(2)模块⾃动发送8个40khz的⽅波,⾃动检测是否有信号返回;
(3)有信号返回,通过IO⼝ECHO输出⼀个⾼电平,⾼电平持续的时间就是超声波从发射到返回的时间。测试距离=(⾼电平时间声速
(340M/S))/2;
(4)本模块使⽤⽅法简单,⼀个控制⼝发⼀个10US以上的⾼电平,就可以在接收⼝等待⾼电平输出.⼀有输出就可以开定时器计时,当此⼝变
为低电平时就可以读定时器的值,此时就为此次测距的时间,⽅可算出距离.如此不断的周期测,即可以达到你移动测量的值*
5、操作:初始化时将trig和echo端⼝都置低,⾸先向给trig发送⾄少10us的⾼电平脉冲(模块⾃动向外发送8个40K的⽅波),然后等
待,捕捉echo端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器
的时间,这就是超声波在空⽓中运⾏的时间,按照测试距离=(⾼电平时间
声速(340M/S))/2就可以算出超声波到障碍物的距离。
程序:
超声波端⼝初始化:
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);//使能GPIO时钟
//trig
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOG,GPIO_InitStructure);//
//echo
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//输⼊
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOG,GPIO_InitStructure);//¯
定时器初始化:
TIM4_Int_Init(250-1,8400-1);//定时器时钟84M,分频系数8400,所以84M/8400=10KHZ的技术频率,记⼀次数0.1ms,计数
250次为25ms。
/超声波测距最⼤4⽶,按声速340M/s计算,超声波测量最⼤距离4m时所⽤时间为42/340=23.6ms,这⾥取中断时间为25ms,完全够
⽤!*/
定时器中断程序:
voidTIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)//溢出中断
{
flag=1;//·发⽣中断代表测量范围超出,使flag为1.
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
}
测距程序:
doubles=0;
doublel;
doublep[5];
inti;
for(i=1;i=5;i++)
{
//发出⽅波
trig=1;
delay_us(20);
trig=0;
//等待echo接收⾼电平
while(echo==0);
//开启定时器计时
TIM_Cmd(TIM4,ENABLE);//
TIM4-CNT=0;
while(echo==1);//等待接收完成
TIM_Cmd(TIM4,DISABLE);//完全接收后关闭定时器
//检验
文档评论(0)