本帖最后由 星辰一方 于 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】在下图位置处定义下面枚举变量,用于超声波测距过程中,状态识别: 下面几个函数是超声波测距触发、计算距离、延时函数、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();函数不能出现在中断中! 重要的事情说两遍! |
哦也有可能是你没选中串口,看下串口设置里面串口那一栏,选中你的串口,或者也有可能是你的串口调试助手有问题,再或者就只有是你驱动没装好了
呵呵……我把帖子发过来,从常理来说就不会发个错的来误导大家,所以有问题自己先仔细查一下,你看看Echo Beginning和Echo Ended这两个数据,虽然没看你代码,你的定时器周期和时钟频率没有和我的设置一致
007.rar
2015-11-19 14:37 上传
点击文件名下载附件
下载积分: ST金币 -122.09 KB, 下载次数: 100, 下载积分: ST金币 -1
原来如此,只知道冲突,没去管它,多谢大神指点!
是我看错了么兄台你的头像……
请看8楼,可以从根源解决问题……