最近在准备电赛,由于比赛有些题目限制TI板,发现立创商城里有地猛星板子,是MSPM0G3507芯片,想着正好符合电赛的TI板要求,就买了一块尝试做小车。
刚开始我发现立创有地猛星专门的官方教学文档,感觉这个地猛星卖的还是很有诚意的,有这么多模块的示例代码和教程供备战电赛的人使用,真的很不错,不用担心教程问题了。
结果就在我今天准备用地猛星跟着官方文档学习SR04的时候,发现这个官方例程代码完全就是错的!!我今天反复烧录了好多次,可以证明官方教程就是错的!!
因此,今天我足足花费了一下午的时间改代码,才将官方例程的SR04代码改成能用的正常代码。
为了让备战电赛的大家不要再被坑了(能救一个是一个),我在这里分享一下我修改后的SR04代码以及sysconfig配置的具体步骤,希望别再有人死磕那个官方例程代码了,太浪费时间了!!
sysconfig的配置步骤如下:
1.Timer Mode要选择Periodic Up Counting!(立创官方教程的是One-shot,这会导致定时器不能重复计数,使SR04的可测量距离范围变得很小!)
2.Interrupt Configuration的中断事件要选择Load event!(官方教程是Zero event 这会导致输出的距离是反的!)
3.SR04的ECHO口配置外部中断 ,选择上升沿和下降沿都触发中断。
除了上述这些更新后的配置,其他配置和官方教程一样。
紧接着就是我改过的代码了:
gpioA是获取外部中断的信号,由于我写了使用外部中断读取编码器电机速度的代码,因此我这里是编码器的GPIO口和SR04的GPIO口或在一起。
第一行代码:用if进行进一步判断,判断中断信号是否为SR04触发的。
我采取的是通过外部中断+定时器计算返回的高电平时间,后面的代码是这样解释的:
首先,用if判断此次外部中断是否为上升沿:
若是,则开启定时器,开始计时...等待SR04的下一次外部中断。
等到下次外部中断来临时,重新判断外部中断是否为上升沿:
若否,则关闭定时器,获取这段时间定时器所获得的计数值,对计数值进行计算得到距离。
这一个流程下来,正好可以测得返回的高电平脉冲波的时间。
最后需要新定义一个函数:Getlength()
这个函数的作用就是通过将TRIG端口拉高超过10us,再拉低,作为SR04模块的启动函数。每次调用这个函数都可以让SR04工作一次。
最后是main函数里的调用方法:
首先需要使能外部中断(里面的IRQN名字具体要看个人)
在while里面不断调用Getlength函数,然后再将length发送给串口。
记得要延时一定的时间,不然会导致测距不准。
以上就是我改进的MSPM0G3507的SR04测距代码,希望可以帮到大家。
(本人是个备战电赛的小白,有很多地方都不是很懂,如果有哪里说错了请见谅)