星辰一方 发表于 2015-11-19 14:35:47

【NUCLEO-L476RG开发】+传感器系列第三贴——玩转超声波测距

本帖最后由 星辰一方 于 2015-11-19 14:35 编辑

超声波模块,相信很多人都用过,不难调试,但是这次我却栽了个大跟头!连续调了两天,建了10多个工程才弄下来,下面先来讲下详细过程,后面再讲这次心得体会!
实验内容:使用HAL库,实现超声波测距,并将距离用于LED亮度调节,距离越短,LED越暗,同时串口输出距离,单位mm;
工程创建过程:
【1】创建工程,配置TIM2的CH4为输入捕获,连接超声波模块的Echo引脚,用于捕获脉宽;

【2】配置TIM3的CH1为PWM输出模式,用于连接LED,调节LED亮度;

【3】打开UART2,异步,并配置PB12为推挽输出,连接超声波模块Trig引脚,用于超声波触发;

【4】配置TIM2参数,打开TIM2中断,并配置预分频79,周期59999,触发方式选择上升和下降沿触发,如下图:

【5】配置TIM3,打开中断,并配置预分频与计数周期,配置占空比,如下图:

【6】配置UART2,打开中断,设置8位长度,其他保持默认:

【7】生成工程文件,并打开,找到tim.c中下图选中位置代码,并剪切:

将该行代码粘贴到tim.c下图位置,

然后到 main.c中,在下图位置添加下图阴影部分代码,这一步操作的目的主要是为了在运行过程中修改PWM占空比。

【8】在下图位置处定义下面枚举变量,用于超声波测距过程中,状态识别:
下图代码用于printf重定向,不再详述,

下面几个函数是超声波测距触发、计算距离、延时函数、TIM2捕获中断函数,写在用户代码4区域,别忘记函数声明!

下面是定时器启动函数,卸载main函数内部:

下面是主循环内部函数,主要实现周期测距,并根据距离计算占空比,更新占空比,以改变LED亮度;

硬件电路连接及测试效果:

调试总结:
这个小测试调试比较纠结:
1、首先是cubemx版本问题,不知道4.11+V1.10pack好像有bug,测试按键中断都没成功,找了一晚上原因也没查出来bug在哪里,后来无奈,卸载cubemx4.11,并删除v1.1的pack,然后重装cubemx4.10和v1.0pack,测试通过!就是这样,很神奇,上次调试ADC的时候是4.10有bug,4.11没问题,之前也用过别的板子,从来没碰到过这样的情况,因为开始无论如何想不到这么简单的配置,cubemx还能出问题?
2、然后,同样耗费了我一个晚上的是For_Echo()这个函数中,Trig置位之后要保持一段时间,模块要求好像是40微妙,我想给它来个1ms吧!结果就没多想写了HAL_Delay(1);接下来的情况就是,死活调试不好,因为开始调试时候For_Echo(),被我放在按键的回调函数里面了,也就是说放在中断服务函数里面了!知道今天再看才发现,HAL_Delay();这个函数是不能在中断中出现的!有可能会造成中断冲突!大家引以为戒!很早就了解这个情况,这次大意了!
HAL_Delay();函数不能出现在中断中!
HAL_Delay();函数不能出现在中断中!
重要的事情说两遍!


creep 发表于 2015-11-20 08:54:18

HAL_Delay(1)放在中断中也应该没问题,问题的关键是你按键的中断优先级比SYSTICK的优先级高,所以才导致延时没法进行。生成代码时默认SYSTICK的优先级应该是最低的。

星辰一方 发表于 2015-11-19 14:37:48

工程文件奉上~!

Paderboy 发表于 2015-11-19 16:55:11

多谢分享。。。。辛苦了

pamhood 发表于 2015-11-19 19:21:03

谢谢lz 怪不得老是进HAL_Delay()就卡死,这下有救了

foxglove 发表于 2015-11-19 20:54:51

超声波模块超声波模块

dsjsjf 发表于 2015-11-19 22:05:52

很详细,,顶

安臣 发表于 2015-11-20 08:40:09

兄弟学习能力很不错

星辰一方 发表于 2015-11-20 19:53:14

creep 发表于 2015-11-20 08:54
HAL_Delay(1)放在中断中也应该没问题,问题的关键是你按键的中断优先级比SYSTICK的优先级高,所以才导致延 ...

原来如此,只知道冲突,没去管它,多谢大神指点!

星辰一方 发表于 2015-11-20 19:53:44

安臣 发表于 2015-11-20 08:40
兄弟学习能力很不错

是我看错了么兄台你的头像……
页: [1] 2 3
查看完整版本: 【NUCLEO-L476RG开发】+传感器系列第三贴——玩转超声波测距