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

207
0
2020年12月22日 09时07分

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

发表评论

后才能评论