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