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

只谈情不闲聊 提交于 2019-11-29 06:13:17

此篇对做此项目过程中遇到的所有问题和出现的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后就可以解决

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!