2016/1/17 完成原理图,然后开始做PCB,但是存在布线复杂的问题,有的根本就是不合理的引脚分配。 解决方法:根据实际的PCB元器件留出引脚位置,然后更改引脚,为就近的引脚,这样布线简单,而且清晰,不易出错。 LCD1602的问题,是可以通过不同的引脚控制吗?就是是不是可以把控制口的顺序更改,这样,布线变得简单,待解决。 解决方法:明天测试使用不同的口对LCD1602操作。 2016/1/18 完成了PCB,同时也发出去做了,耗费了将近三天的时间才把PCB画出来,并且检查无误,也是有点痛苦的,因为不知道会不会有什么错误。 解决:找学长以及和同学一起查看 2016/1/23 自己的驱动板还没到,所以借了别人不用的小车进行调试。发现驱动电机的PWM是微秒级的,其实是很傻的试出来的,定时器装入的初值应该为 TH0 = (65536 - 1) / 256; TL0 = (65536 - 1) % 256; 这样,每一次中断都是1us,那么这样控制的时候,占空比就比较好控制,而且在慢速的时候,也不会出现明显的快慢交替,比较完美。我设置的小车速度有五级,计数i最大为100,也就是说在100内分等级,但是太低了电机还是会转不起来的,所以,最低应该在40,最高应该在100,其中分五个等级,每个等级递增计数12,也就是40,52,64,76,88,100,这样的话,就有五个速度切换。 解决:尝试! 2016/1/24 问题:由于使用了串口中断,那么肯定要使用到定时器1的中断服务函数,但是定时器1的中断服务函数的优先级很低,一旦定时器0或者其他中断产生时,这个中断服务函数就会被影响,不能正确的配置wifi模块和读取wifi模块的数据。 解决:今天发现,昨天所说的微秒级是没什么问题的,但是,问题出在,定时器0的定时时间太短了,1us就进一次定时器中断,这样频繁的调用,肯定会影响串口中断(也就是我这里所理解的两个服务函数的优先级问题,其实是定时器0的中断服务函数进入的过度频繁)。所以,现在的解决方法就是增加进入定时器0中断服务函数的间隔,增加间隔,至少200us以上,保证串口中断能够进来,才能很好的做以下的功能。 问题:驱动模块上,搞不清哪两个引脚是驱动左边的,驱动左边的电机的时候,又是置哪个引脚为1可以使得小车前进(底盘椭圆的方向)。 解决:逐个尝试。 电机接在哪边,哪边的两个引脚就驱动哪边的电机。 IN2和IN4给高电平时,电机正转,也就是往有圆弧的那一面运动,其实也取决于电机引脚接到驱动板上的顺序。 问题:出现小车前进的时候,我松开按键,小车有时候还是会不断的往前,而且是变为最快速度。 解决:问题出在,当松开按键的时候没有将两个电机的控制引脚都置为0,导致有时候两个电机引脚保持了一高一低,那么就会出现上述情况。 ***当你的代码冗余到一定程度的时候,删除暂时无用功能!!!一步一步的一个个功能调试实现,这样才事半功倍!!!**** 问题:小车的PWM波设为什么样比较合适? 解决:发现采用如下比较好 TH0 = (65536 - 20) / 256; TL0 = (65536 - 20) % 256; 用累计的静态变量i模拟出PWM波。i可以设置从35-100之间,也就是说在35-100之间分出高低电平的比率,现在准备把变速做成用按钮控制,一共分为五个等级,可以在客户端调整(用按钮+,-调整速度,后期制作,前期做基本的控制) 问题:手机客户端的控制是怎么解决? 解决:由于手机现在可以多点触控,就是可以同时按多个键,那么,就要独立前进,后退,往右,往左。一开始我是使用一个键包含两个动作(例:前进同时左转),这样的话做出来很难看,而且不好控制。 ******暂时的命令控制列表****** //不兼容性:往前和往后不能兼容;往左和往右不能兼容;采集数据等与移动无关的数据和移动不兼容! //即Forward和Back只能同时存在一个,Right和Left只能同时存在一个。 #define FORWORD '$'//往前 #define BACK '#'//往后 #define STOP '^'//停止 #define TURN_LEFT '&'//往前同时往左 #define TURN_RIGHT '*'//往前同时往右 #define TURN_STOP '('//转向停止时给小车发送的命令,用来恢复之前的速度,而且要保证恢复的速度是和客户端协同的等级 #define ADD_SPEED '<'//加速设置十个等级的速度,用于定时器的速度控制 #define SUB_SPEED '>'//减速 问题:如何解决错误信号问题,就是有时候会出现不受控制的现象,一直前进或者后退。 解决:想到一个解决方法是,在关闭或者开启定时器0的时候,设置标志位,并且将这个标志位在while(1)中循环判断,通过标志位将电机的引脚置为相应位,这样就能避免在某一时刻,wifi指令发射完成后,电机转动电平还是有效的,这种失控的情况。 问题:避障模块,要是前方有障碍物,out引脚会输出低电平,适合用于外部中断 解决:可以使用外部中断,或者在while(1)中轮询做,个人认为在中断中做比较保险!但是如果采用下降沿触发,只做一次,后面可能还没离开危险区,也不能调节。如果使用低电平触发,那么小车的动作就要受到影响,因为可能一直会触发在外部中断,导致小车动作受限。所以,首先在while中尝试做避障。 注:最后使用外部中断0的下降沿触发方式,进入中断中进行处理,处理方式为:触发的方向的轮子反转,另一个轮子不转,实现后退转动,避开障碍。其实只能在低速的情况下能够实现,因为红外避障模块的极限检测长度大概三厘米,而且小车全速的时候根本刹不住,所以在低速的情况下比较好用有效。 2016/1/27 问题:存在电压不稳定,单片机不能正常工作 解决:从电池开始测量电压,很可能是锂电池报废了,买的时候需要多买备用。 重要问题总结:主要是ESP和单片机之间的问题,其余控制问题比较简单。 1. ESP8266回显内容的获取问题:因为回显内容很快,所以单片机不能将每一句回显内容都传入函数中获取、处理并且显示再清空,有时都不能获取完整的一句字符串,更不用说处理并显示回显信息。*解决方法:等待初始化过程中的回显数据过去,然后等待客户端发来的数据格式的到来,+IPD,0,3,abc,这时可以检测这句话中除开+IPD,逗号,十个数字以外,都可以作为命令符,命令符长度为一个字节,一旦检测到立即在单片机中做出动作,这样时效性比较好,虽然这种处理方法不是很好。 2. ESP回显内容的获取时判断是否一句话结束的问题:由于ESP显示的内容对于SBUF来说,只是一个字符数组,最多也就是多了\r\n,但是\r\n也不是稳定的出现在每一句的句尾,有时是句尾,有时却在句首,对于这就增加了获取内容的难度。*解决方法:把\n作为开始接收符,把\r作为结束接收符,可以比较准确的开始和结束字符串的获取,具体实现在小车中没有实现,将在后续的尝试中实现! 3. ESP所用的单片机定时器1做串口中断和电机PWM波产生所用的定时器0之间的冲突问题:定时器0 和 定时器1 理论上是没有冲突的,但是在ESP初始化的时候,不能开启定时器0,不然会影响定时1也就是串口中断中,导致初始化过程失败。*解决方法:在ESP初始化之前必须关闭定时器0,待ESP初始化完成,才允许定时器0自由工作。
|