深坑1:基本配置方法;
配置PWM输出,TIM4有四路PWM输出,依葫芦画瓢开始配置,配置完后,开始测试,啥都没有啊,很是伤心,开始查手册,发现也没问题啊。然后又开始求助师傅了,师傅说你开I/O时钟了吗?。。。。。。。。。。。。然后秒解决。
深坑2:基本调试方法;
基本的调试方法,就是printf函数测试逻辑是否正确啦,但是printf是很费时间的,程序会跑飞的。然后就摒弃了这个调试的方法。然后就不知道该如何调试程序逻辑了、然后某一天师傅说你为什么不用printf输出来看你的逻辑是否有问题呢?我说会跑飞啊,然后师傅把定时器时间调到10倍,说好了。。。。。。。。。这也是为什么这么多年多多少做过一些编程,但是一直不精通的原因了,往往是找个视频教程看看,就没在认真仔细的写过代码,这么多坑自己不去跳,不去爬,怎么可能把行程能力呢。
深坑3:硬件基础;
这个基础能力就是你一定要去看硬件手册,stm32中的复用功能可谓博大精深,要死记硬背功能不可能的,所以只能学会方法,用时去查啊。
深坑4:解决问题的方法;
任何编程的问题最后归结为数学和解决问题的思路,某位大牛说的,踩了这么多坑后深深觉得是多么痛的领悟。在掌握了一些基本的思路以后,还是遇到了很多问题,往往遇到问题后就不知道该如何分析。
问题1:一个往复运动的机构,在程序写完后,只能往一个方向运动。
然后我的解决问题的思路——用printf函数在每一个条件语句里放一个printf语句检测是否进入了条件,其中angle_rotation1为绝对值编码器的反馈参数。转动编码器的过程中发现随着反馈值的变化依次进入了三个条件语句,输出的结果是“”正转“、“”停止、“”正转“、“”停止、“”正转“、“”停止、“”“停止”、“”“停止”、“”“停止”、“反转””、“”“停止”这样循环,感觉没有什么问题。能正常进入循环,然后就开始纠结了,都能进循环啊,怎么会没有输出呢,就开始测试I/O口是否没有输出,万用表测完后,真的没有输出额,好开心,然后开始怀疑I/O口坏了,换I/O还是没反应,把能进入的循环里的I/O都置1发现都有输出。这个时候还是没有理睬他继续测试,换驱动器等,然后觉得哪里有问题了,但是我应该是解决不了了,就开始求救师傅。师傅说看看效果,从头开始测逻辑,师傅一看输出,不对啊,你这个怎么一直都输出停止啊?
if((Forward_Cmd_Pos - angle_rotation1)>pos_err )
{
GPIO_ResetBits(GPIOD,GPIO_Pin_13); //forward;
GPIO_SetBits(GPIOD,GPIO_Pin_15);
Forward_Cmd_Spd =4300;
// printf("正转:%d",1);
}
if(abs(Forward_Cmd_Pos- angle_rotation1)<pos_err)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_15); //forward;
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
Forward_Cmd_Spd =0;
//printf("停止:%d",0);
}
if(Forward_Cmd_Pos- angle_rotation1<(-pos_err) &Forward_Cmd_Pos>270)
{
GPIO_SetBits(GPIOD,GPIO_Pin_13); //inversion;
GPIO_ResetBits(GPIOD,GPIO_Pin_15);
Forward_Cmd_Spd =4300;
// printf("反转:%d",2);
}
每进入这个正转就开始输出停止了。好吧,逻辑配置错误了,一进入正转就立马进入停止条件语句里,这样肯定就没有输出了啊,我滴个乖乖,没有输出不一定是I/O坏了还有可能就是程序没有输出啊。这个问题其实我已经把问题的数据输出了,但是在分析的过程中输给了思维定势。获取数据的方式可以人教,但是分析问题的能力不是能手把手教的,要靠自己积累啊。
然后另一个问题是,在驱动器上电后摇摆机构需要先转一圈,然后才能按照设计的程序正常来回运转。这个问题一开始也觉得是无解的,认为是主控程序中的PID来不及把速度拉下来(10ms一个控制周期)。好吧,又把我的小师傅叫了过来,小师傅首先就把控制驱动器的信号给拔了,驱动器带着电机疯狂的转,好吧这个现象其实一开始一直都在,每次烧程序时电机都会疯转,没仔细想这个问题是为什么,觉得他就是个自然而然的问题。然后小师傅说肯定是程序设计有问题、或者驱动器设置有问题,那要是我的其他底盘上电都疯转还不到处撞啊。我去,这么浅显的道理,我竟然认为他是个自然而然的问题。检查了一遍感觉没什么设置错误啊,然后打了个电话给客服,说明问题后,客服妹妹说是因为驱动有个上电自动找零功能,可以去掉这个上电自动找零功能,因为系统中没有接入限位开关找不到零位就疯狂转呗。
解决问题首先要学会分析问题的本质,任何一个现象背后一定是有深层原因支撑的,而拨开这一层一层的云雾去看到本质就不容易啊。这也是为什么有那么多人想学编程,往往知难而退的原因。看不见的原因拦到了很多入门的人。
先写下这几个类再来补全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)