DIY智能小车篇(四):常见问题 & BUG汇总

您所在的位置:网站首页 智能小车的循迹功能是依靠什么实现的 DIY智能小车篇(四):常见问题 & BUG汇总

DIY智能小车篇(四):常见问题 & BUG汇总

#DIY智能小车篇(四):常见问题 & BUG汇总| 来源: 网络整理| 查看: 265

此篇对做此项目过程中遇到的所有问题和出现的BUG(包括硬件方面和软件方面)进行总结,告诫自己要养成总结问题,汇总BUG的好习惯。前人说:工作后你会发现你学生阶段所做项目的BUG_list价值千金!

硬件方面 电机驱动

Q:最初测试电机的过程中,出现电机发出滋滋的声音(感觉很无力)但是不转动的情况 A:L298N电机驱动板没有与MCU共地

软件方面 电机驱动

Q:利用STM32的定时器3输出4路PWM波,总是只有随机的1路输出 A:GPIO_PinAFConfig函数必须分步进行复用,不能用一个复用函数并在一起,不然只有一路输出。也就是说像下面这样复用:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); //GPIOA6复用为定时器3 GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM3); //GPIOA7复用为定时器3 GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3); //GPIOB0复用为定时器3 GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM3); //GPIOB1复用为定时器3

而不是下面这样:

GPIO_PinAFConfig(GPIOA,GPIO_PinSource6 | GPIO_PinSource7,GPIO_AF_TIM3);

Q:单片机下载程序或复位过程中总有一个轮子以全速转动,同时其它三个轮子静止不动(我们想要的效果当然是在此过程中四个轮子全部静止,不然像我一开始,每次下载程序都要一只手把小车举的高高的emmm) A:查STM32中文参考手册得知,我用来驱动小车运动所占用的IO口和STM32上面LCD屏的一个引脚冲突啦,改成其他空闲IO后就可以解决,最后四个轮子都安安静静的

巡线功能

Q:使用巡线模块的过程中发现其接收端的指示灯常亮,说明一直检测到线的存在,肯定不正常 A:查STM32中文参考手册得知,用来接收巡线模块信号所占用的IO口和STM32上面其他外设的引脚冲突啦,改成其他空闲IO后就可以解决

避障功能

Q:超声波传感器测距结果不正常 A1:测距函数解算错误,这个函数的结构是和你定时器的设置有关系的,要因地制宜,比如我设置的定时器参数如下:

TIM_TimeBaseInitStructure.TIM_Prescaler = 83;//分频系数83,频率为1MHz,理论测量精度0.34mm TIM_TimeBaseInitStructure.TIM_Period = 50000;//计数周期50000,相当于0.05s,最大测量范围17m

那么测距函数就是这样的:

// distance = measurement/2/1000*340 = measurement/59 (cm) measurement-units:us distance = (float)count / 58.8 ;

A2:中断优先级设置有问题

优先级问题:定时器5->HCSR04_StartMeasure 优先级最低(2,2) 定时器2->计数 优先级中间(1,1) 外部中断3->开始计时 优先级最高(0,0) 最初的测距不准的原因就是因为优先级设置有误,弄反啦 现在所用优先级只是测试版正确的优先级设置方法,暂时没有深究

A3:HCSR04_StartMeasure在定时器5的中断服务函数内部,用来定时发送开始测距信号,但HCSR04_StartMeasure函数内部出现了不可重入的延时函数,所以导致中断不正常。这就是为什么经常说中断服务函数不能加延时的原因,其本质是中断内部不能出现不可重入函数。类似printf函数等标准IO库函数、malloc和free函数、延时函数等都属于不可重入函数,尽量不在中断内部使用,如果一定要用的话将其改成可重入的。所以这里将延时函数优化成可重入的函数之后问题得到解决

A4:外部中断3中出现了printf函数,printf函数属于不可重入函数。

Q:最初版的避障功能不能保证实时性,经常是已经撞上去啦还没发出避障动作 A:避障函数内部用到了大量延时,现已改为根据测距距离进行相应操作的实现方式,实时性问题得以解决

蓝牙模块

Q:使用手机蓝牙串口助手时,对发送到STM32的数据进行IF判断,发现没有动作 A:串口助手发送的是打印字符,真正计算机中对应的ASCII码和我们看到的打印出来的字符并不是一个东西,例如:我们发送了一个数据5,其对应的ASCII码却是0x35。所以if判断语句中应该写0x35而不是5。这个东西折腾了我一下午,看来还是要对计算机的东西有一个更加深入的了解才行

显示功能

Q:使用LCD屏的时候总有bug A:查STM32中文参考手册得知,我用来驱动小车运动所占用的IO口和LCD屏的一个引脚冲突啦,导致LCD初始化不正常,将驱动小车运动所用的IO口改成其他空闲IO后就可以解决



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3