本帖最后由 hellokity 于 2016-7-19 15:06 编辑
一、序言 其实,这次申请四驱车有几个目的: 1、本人在高校实验室工作,负责几个实验室的日常管理,同时为各个实验室准备实验器材,实验器材一般是一些常用的工具及一些材料,实验课门类比较多,因此本人的工作量就比较大。本人之前在企业做嵌入式系统软件设计,出于攻城狮的本能,想做一辆智能车来减轻日常的工作量,设想是通过设定不同的目的地,智能车能够把相关的实验器材送到指定的实验室。刚好论坛里搞四驱车的活动,就报名参加了,想通过此次活动做个验证性的实验。 2、之前在企业的时候,做的系统比较简单,只用过基于M0内核系列的恩智浦的单片机,没有接触过M4的。之前一直都想熟悉一下M4的单片机,可是手里没有,加上工作事情比较多,也就搁浅了。刚好这次的活动的主题是开发四驱车,又采用M4内核的单片机,于是怦然心动。 3、虽然在坛子里是“高级会员”了,但是很惭愧,这个“高级职称”靠本人每天勤劳地登陆论坛签到获得的,不是因为在坛子里发有用帖、帮助大家解决问题获得的。所以也想通过这次机会,参与一下社区的活动,和志同道合的朋友共同成长。 虽然有以上的目的驱使我报名参加此次活动,但我也很清楚,参加活动并不是只有激情就可以的,毕竟我能力不及论坛里的很多坛友,至于能够开发到什么程度,说实话呢,我心里没底,因为对我来说,单片机是陌生的,通信模块是陌生的。不过好在我接受能力还比较强,也用过一些常用的单片机,完成此项目应该是没问题的。
二、方案总体设计 本人申请的时候,也想通过手机控制四驱车,但是分析一下自己的条件,发现自己对App的开发还没入门,再加上对K64不熟悉,短期内绝对不可能完成此项目。后来仔细研究了一下FRDM-K64,发现其有个FXOS8700加速度磁力传感器,再想到自己还有一块YL-KL26,现在闲置在抽屉里没有用,于是豁然开朗。何不用KL-26作为四驱车的控制系统,采用K64作为遥控系统呢?K64上有了加速度传感器,完全可以实现手势遥控,于是整体的设计方案就出来了。见图1. file:///C:/Users/ThinkPad/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif
三、详细设计 1、四驱车控制系统设计 IO需求分析 四驱车需要四个驱动电机,因此需要4个H桥驱动,共需4路PWM输出;四驱车在运行时会需要控制前进、后退、转弯儿、刹车等情况,每个TB6612驱动桥需要4个控制信号,共要8个GPO;为便于判断系统的运行状态,需要显示WIFI的连接情况,车辆的转向指示。共计3个GPO,ESP8266WIFI模块用过UART0与单片机通信,需要2个引脚;综上,四驱车需要17个GPIO。其中配置成PWM的为4个,配置成GPO的为11个,配置成TX、RX的各一个。 IO资源分配 YL-KL26引出了48个引脚,因此足够控制四驱车。根据引脚复用情况,资源配置如下表1. 表1 四驱车控制系统引脚配置表
软件设计 软件设计分为主程序设计和中断程序设计,主程序主要完成系统的初始化、遥控数据的解码、电机的控制等三部分内容。中断服务开启了3个,分别是pit,Systick、uart0中断。Pit中断时间为100ms,用于处理指示灯;Systick为m0内核自带滴答时钟,定时为10ms,用于延时控制及通信超时控制;UART0开启了接收中断及OR(overrun)中断,至于为何开启OR中断,接下来会讲。UART0接收中断用于接收从ESP8266获得的遥控指令帧,此处只负责接收,不做解析处理。各部分流程图如图3,图4,图5,图6。 UART0参数:波特率9600,8位数据位,1位停止位,无校验,开启rx及or中断; Pit参数:100ms周期中断; Systick参数:10ms周期中断; TPM0参数:打开CH0、CH1、CH2、CH4通道PWM功能,边缘对齐模式输出; ESP8266配置参数:波特率9600,AP模式,设置无线名称为“romoter”,打开多连接,开启服务器功能,端口号是50000; 遥控解码软件算法:单片机从UART0接收到的遥控指令有帧头和帧尾,首先找到帧头,再判断帧尾,如果正确,则证明是有效的指令帧,进行解析处理,否则丢弃; 四驱车控制算法:根据接收到的指令帧,驱动相应电机的运动方向及速度控制; 指示灯控制算法:同四驱车算法类似; 连接超时控制算法:如果超过1s没有接收到遥控指令,则四驱车停止; file:///C:/Users/ThinkPad/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif file:///C:/Users/ThinkPad/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif file:///C:/Users/ThinkPad/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gif
2、遥控控制系统设计 遥控控制系统采用FRDM-k64开发板,板子上集成了FXOS8700加速度磁力计传感器,采用I2C通信。板子上还集成了一个三色灯,可用于控制器的前进、转弯儿的指示。以上均不需更改硬件,唯一需要更改硬件的地方是在板子上的J199处焊接一个4脚的排针,不再接蓝牙,改成ESP8266WIFI模块。虽然《FRDMK64FUG.pdf》文档已经明确标出,为了便于查看,将资源分配再次列出。见表2 表2 遥控系统硬件资源分配表
软件设计 软件设计分为主程序设计和中断程序设计,主程序主要完成系统的初始化、FXOS8700传感器数据的读取、遥控指令发送、指示灯显示灯几部分内容。Pit中断只要提供定时服务,Systick中断用于控制传感器数据读取的频率及遥控指令发送的频率。 UART4参数:波特率115200,8位数据位,1位停止位,无校验; Pit参数:10ms周期中断; Systick:20ms定时中断; FXOS8700参数:波特率100k,地址0x1D(由于板子上SA0上拉,SA1下拉),其余参数按照FXOS8700数据手册配置即可; ESP8266参数:波特率115200,station模式,创建“TCP”,“192.168.4.1”,50000通信,透传模式下工作,最后不能忘记启动发送。 各程序算法较为简单,此处不重复列出,看源码即可。 file:///C:/Users/ThinkPad/AppData/Local/Temp/msohtmlclip1/01/clip_image014.gif
四、问题及解决方法总结 在开发过程中,本人遇到了这样或那样的问题,有一些是从论坛里获得的,一些是自己研究各种资料后解决的。新手可以参考,高手可以绕道,勿拍板砖。 问题1、没有示波器,只有一台万用表的情况下,如何判断PWM输出是否正常? 解决方法:如果不了解PWM的原理,请先学习相关资料。PWM的周期是固定的,改变占空比,相应引脚输出的电压就会变化(开关电源的原理吧),通过设定已知的占空比,PWM对应引脚的电压即为VCC*占空比。此方法可以简单有效判断PWM功能是否正常。 问题2、KL26开启串口接收中断后,为何只能有限的几次能够进入中断? 解决方法:接收中断正常响应的情况是,接收数据寄存器是空的,当新的数据进入数据寄存器后,向CPU发出中断申请。当有数据要进入数据寄存器,而此时数据寄存器的数据还没有被读取,此时OR(overrun)标志位会被置位,一旦此标志位置位,除非清零,此标志位会一直置位,影响硬件对RDRF置位,RDRF不能置位,就不能够产生接收中断。因此此问题的一个解决方法是打开OR中断,进入OR中断后清除OR的标志位,然后进行再进入接收中断处理函数。 问题3、初始化UART模块时,为何总是进入硬件中断? 解决方法:UART的收发引脚与GPIO通用,进行配置UART模块时,如果没有开启PORT时钟,则相当于非法操作没有使能的硬件设备,因此会进入非屏蔽的硬件中断。所以此问题的解决方法是应先开启PORT的时钟,使能PORT。 问题4、程序初始化正常,但运行时,为何经常会不定时进入默认中断? 解决方法:查找程序中定义的指针变量,检查指向的地址是否会出现违法的情况。如果程序运行在Linux系统上,则会抛出段错误的信息。即:指针越界访问。 问题5、为何坛子里KSDK初始化FXOS8700传感器的例程总是失败? 解决方法:通过单步执行,可以发现,在初始化通信频率的时候,总是不成功,这是因为I2C模块SCL波特率不正确,导致不能够与FXOS8700通信失败,进而对此传感器的各种初始化也不会成功。修改的方法之一是修改I2C_HAL_SetBaudRate (uint32_t baseAddr, uint32_t sourceClockInHz,uint32_t kbps, uint32_t * absoluteError_Hz)函数,不要寻求BF_I2C_F_MULT和BF_I2C_F_ICR寄存器的最优值,自己根据已知I2C模块的时钟进行设置。 问题6、为何开启化了pit的中断,但还是无法进入中断函数? 解决方法:忘记打开nvic里的中断开关。 五、后记 申请下这个项目,使我感到很意外。因为我的方案不怎么优秀,开发的质量也不能够保证,但是小九还是把我的申请pass了,谢谢给我这次学习的机会!在等待四驱车材料的过程中,出现了一个小插曲,那就是材料中只有FRDM-K64开发板和一个小车底盘,带减速机的电机和螺钉都没有,小九再次补发,不小心把地址填错了,当再次收到货时,已经是6.29了。进入7月份,原本要放假了,谁曾想事情反倒多了起来,监考、党员学习、期末考核材料、各种总结会以及为期3天的保密出差(电脑、手机没收)。忙里抽闲,先把各个部分的代码按照以上的方案设计编写完成,再连接调试。调试的过程中,出现了很多问题,先是硬件初始化的时候出错,再是程序莫名其妙进入中断,当然这些都不算什么。 最让我头疼的问题就是FXOS8700传感器的问题,虽说参考了恩智浦官网的例程,但是例程初始化FXOS8700总是失败,坛友们提供了一些建议,但并不能能够解决问题。由于白天工作,晚上调试时间有限,时间不集中加上没有示波器导致调试的效率大大降低了,好在后来凭借几年来的开发直觉找到了问题的根源,但是解决方法不是很好,有时间再研究下。 其次是KL26不能够进入接收中断的问题让我很费神,在坛子里没有搜到与我遇到的问题一致,因此放弃了从外部获得解决方法的想法,仔细地研究了KL26UART的寄存器,才发现这个问题的根源。 现在,软件调试完成,正在调试硬件,这次不可能按时完成项目了。不管怎么样,通过这几天的折腾,自己学习了不少东西。无论小九收走此开发套件还是别的处理方式,我都欣然接受。再次感谢曾经帮忙的各位坛友及小九坛主。
|