西交大项目设计实验报告(自动化系)

github地址 link

0 项目设计概述

开发资料百度云网址: 项目设计
开发平台:win10
Freescale Kinetis K60芯片
IAR EWARM开发环境

一、编程软件的安装与使用

1.1下载安装软件

目前最新的IAR for ARM为v6.30,支持更多的Kinetics系列芯片,
因此我们安装最新版,避免因为版本太低而出现不兼容,甚至出
现异常错误的情况

1.2安装 IAR 详细过程

1.下载后解压文件,打开目录,运行安装文件:

在这里插入图片描述

2.IAR的编程界面

在这里插入图片描述

相对于Keil For ARM、CodeWarrior 而言,IAR for ARM的编程界面是最简单的,编译效率高,在嵌入式系统的调试方面提供了可供调试的插件。

3.安装仿真器

又换会原来的安装导航界面:选择Install driver,选择了用jlink作为仿真调试器,因此这里选择jlink,运行安装,运行后,会自动安装驱动,不会有其他提示。另外,为了可以使用擦除芯片等功能,我们可以选择用segger 公司的 j-link。
在这里插入图片描述

二、模块检测与调试

在车辆组装过程中,因为人为原因,可能出现各个问题,需要在利用一些电气设备和程序的情况下,进行模块检测。在模块检测时,各个模块间的线,先不插入插座中,待各个模块检测完后,在按照说明连接线路。

2.1检测的电源模块。

检测方法:给电源模块正常供电后,用万用表测量各个端子的电压是否正常。具体电压,虽然电池上写着是7.2v,但是满充状态下电压是8.3v左右,低于3.5v后,整车不工作。

2.2检测核心板

核心板的检测,需要打开代码检测程序。,用jlink给系统板供电,下载该程序代码,程序下载后,核心板上指示灯会闪烁。如果接上串口,波特率设置为115200,会不断的发数据出来。以证明系统版是能够正常工作的。把系统板插到主板上。这一步上一届学长学姐替我们做过啦,所以这步我们只是简单的点灯看系统版是否正常工作。主板上的外设通过万用表可以检测是否和外设连接正确。

2.3检测电机驱动

2.3.1程序验证

下载电机检测程序[E:\BaiduYunDownload\项目设计\蓝宙飞思卡尔资料\蓝宙电子智能车摄像头套件k60平台资料-更新至20130601\03蓝宙电子智能车竞赛单电机驱动BTS7960资料\蓝宙电子智能车竞赛单电机驱动BTS7960资料\landzoK60单电机检测程序],连接好电源线和驱动线。查看电机是否正反。可以看到此程序包含电机模块的初始化。
在这里插入图片描述

与设置占空比的不同来进行正反转
在这里插入图片描述

我们可以查看电机模块说明书[E:\BaiduYunDownload\项目设计\前三节PPT\2 姚向华]电机使用隔离芯片5V电源(可以与单片机共用5V);单片机到驱动模块用4跟线即可(GND、5V、PWM1、PWM2);最大频率支持15KHz,超过会造成芯片发烫、电机运转不正常。
在这里插入图片描述
从真值表我们可以看到INH是使能标志,IN1与IN2的组合代表着正反转和制动。我们知道FTM模块可以提供定时、计数、输出PWM波等功能。查看程序中FTM模块中相关变量。
在这里插入图片描述
可以看到FIMn与CHn都是枚举变量,两者的组合对应一个引脚。此次程序是:

 FTM_PWM_init(FTM0 , CH1, 80000,0);  //功能定时器模块 通道号 频率 占空比
 FTM_PWM_init(FTM0 , CH2, 80000,0);  

使用的是FIM0与CH1,CH2对应的引脚号为PTC2与PTC3。
打开主板的原理图 [E:\BaiduYunDownload\项目设计\蓝宙 飞思卡尔资料\蓝宙电子智能车摄像头套件k60平台资料-更新至20130601\01蓝宙电子智能车MK60主板资料\蓝宙电子智能车MK60主板资料] 里的主板原理图,看到PTC2与PTC3正好对应着MotorPwm2和MotorPwm4,也就是电机驱动的PWM波。
在这里插入图片描述

2.3.2电路连接

如果认为这个猜想不正确,那么可以继续验证一下,我们可以看到主板的背面,
在这里插入图片描述
4这里的5个引脚分别于电机的控制电路的5个引脚相连,而PWM2、PWM3与电机模块的IN1与IN2相连,这也就是解释了为什么

	 FTM_PWM_Duty(FTM0 , CH1,0); 
 FTM_PWM_Duty(FTM0 , CH2,50);

01是正传,10是反转,00与11都是制动,有人也许会说这个正反转和上面的真值表有所不同,是这样,有些车就是01正传,10反转,试一下就知道。
在这里插入图片描述
改变占空比,占空比越大,转速越快。在我们的最终程序中,占空比在25%左右。

2.3.3 PCB与对应引脚

打开主板的原理图 [E:\BaiduYunDownload\项目设计\蓝宙 飞思卡尔资料\蓝宙电子智能车摄像头套件k60平台资料-更新至20130601\01蓝宙电子智能车MK60主板资料\蓝宙电子智能车MK60主板资料] 里的主板原理图,看到PCB电路图中
在这里插入图片描述
P9对应着电机模块,怎么看的,就是根据引脚数量和大致位置就可以知道啦,5个引脚的就p9这一个,然后向上翻找到P9模块,
在这里插入图片描述
可以看到四路PWM波中PWM2、PWM3对应着MotorPwm2和MotorPwm3,而MotorPwm2和MotorPwm3连接着电机模块的IN1与IN2,这样一切就解释都很合理了。

2.4检测舵机和舵机对正

机械安装好后,先把舵机上面的黑色小圆盘从舵机上拔出来。改装舵接的连接线,舵连接线的改装方法参考主板原理图。把舵机连接线插入主板上,下载舵机测试程序,舵机测试程序会让舵机左右转动。如果舵机能够正常工作,下载舵机对中程序,让舵机对中,安装上黑色小圆,说完这些是不是不知道我在说什么,好我们回到电机调试的思路来。

2.4.1 舵机概述

首先看一下舵机的材料 [E:\BaiduYunDownload\项目设计\前三节PPT\2 姚向华] :
一组减速齿轮;
电源线:一般为4.8v或6v。一般为红色;
地线:一般为黑色
控制线:周期是20ms(也就是50HZ)的脉宽调制(PWM)信号 (FUTABA为白色)
脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。从这里可以得到占空比从0.5/50-2.5/50,也就是2.5%到12.5%。
重点是,控制线提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。不是说各个占空比他就一直转,而是一个占空比对应一个角度的。

2.4.2 舵机的电路连接

依旧看主板,可以看到主板的后面有舵机1与舵机2,我们任意选一个,以舵机1为例。
在这里插入图片描述
我们选择舵机1模块,在PCB电路图中为:
在这里插入图片描述
可以看到舵机1是P4模块,怎么看出来,根据相对位置猜的,因为舵机1靠外面一点。我们向上翻可以看到P4模块:
在这里插入图片描述
它标的SteeringPwm2,不过不用管他,可能就是想把P3标成SteeringPwm1,把P4标成SteeringPwm2,这时候也该反应出来这应该和电机一个套路,用的是FTM模块,我们具体看一下SteeringPwm2是哪个引脚?
在这里插入图片描述
可以看到SteeringPwm2对应的是PTA9。

2.4.3 舵机调试

我们回到电机的调试程序中,看到FTM2与CH1正好对应着PTA9,
在这里插入图片描述
那么我们只需要在电机的调试程序里加入舵机的初始化与占空比的改变就完成了对舵机的调试。怎么加呢?如下图:
在这里插入图片描述
在电机模块初始化完成后,进行舵机模块的初始化,注意频率为50HZ。

在80ms中断里,改变舵机的占空比因此使得舵机向左与向右,由于舵机的占空比为2.5%-12.5%,5和7是试出来的,一个向左偏,另一个向右偏。
在这里插入图片描述

2.4.4 舵机对正

上面的调试,5%向左偏,7%向右偏。这也告诉我们一个道理,用占空比调试比较麻烦,我们可以进入这个函数
在这里插入图片描述
可以看到,利用公式 占空比 = (CnV-CNTIN)/(MOD-CNTIN+1) ,我们将duty转化为cv值,然后给了寄存器,因为FTM_PRECISON = 0.1%,这样的cv值的范围很大,我们根据cv值和
FTM_CnV_REG(FTMx[ftmn], ch) = cv来调试舵机中值。我们把FTM_PWM_Duty(FTM1 , CH1, duty)改成FTM_CnV_REG(FTMx[FTM1], CH1) = cv
根据2分法来调试舵机中值,cv = 3000时舵机向左转,cv=4000时舵机向右转,舵机等于3500时在中间位置,有时候其实3300,3700都可能是中值,因为我们改变的是寄存器的值,不是很敏感,方便调试舵机。

2.5检测摄像头

连接电源线到主板上,查看核心板的power灯是否亮着。把摄像头排线接到主板上,用万用表测试一下供电电压是不是5V。如果供电正常,把排线插到摄像头上,看摄像头的指示灯是否亮。用视频卡查看,摄像头的图像。下载摄像头测试程序,看串口是否有采集的AD值输出。当然我并没有这样做,看着灯亮,就觉得就开始调试啦。毕竟上一届替我们做过了这些工作。顺着以前的思路,我们先看一下,摄像头的一些资料

2.5.1 摄像头概述

先看一下摄像头的基本资料 [E:\BaiduYunDownload\项目设计\前三节PPT\5 王莹]
在这里插入图片描述
可以看到摄像头主要用到PCLK像素同步信号,HREF水平同步信号,VSYNC垂直同步信号,FOOD奇偶场同步信号没有用到。Y0-Y7是传输一个8bit的像素的,在73ns的PCLK像素同步信号下,一次传一个像素,继续往下看:
在这里插入图片描述
在这里插入图片描述
可以看到摄像头模块隔行扫描时,30帧/s,60场/s,采出来的图像时240*640,它的那种表示方法和我们数字图像处理的不太一样。后期我们每个24行取一行,取10行进行处理。

2.5.2 摄像头的连接

这里我就不细说了,他看PCB图,
在这里插入图片描述
是P1模块的电路图为

在主板上找到相应的引脚号
在这里插入图片描述

调试摄像头就是对这些引脚进行操作。

2.5.3 摄像头例程
1.Ov7620采集初始化

在这里插入图片描述

2.PORTD中断服务程序

在这里插入图片描述

3.DMA中断服务程序

在这里插入图片描述

4.数据搬移

在这里插入图片描述

三、项目设计实现

3.1整体框架

到此我们就可以实现我们自己程序里。我们的流程类似
在这里插入图片描述

1.在摄像头程序采集中,只用了10行数据。
2.找黑线,本历程的找黑线程序,是先二值划,再根据双线特征,进行黑线查找
3.。在用PID算法,算出转向 PWM。计算转向值程序,是需要根据道路的实际情况结合摄像头前瞻和舵机响应时间,计算出来的值。
4.计算转向值,根据视觉中心与赛道中心,给舵机一个适当的占空比,改变舵机角度。
5.速度算法,需要根据自己赛道是直道和转弯半径给出合适的目标车速。还需要对车速响应做出调整,这里主要是看需要不需要刹车和加速候的 PID 值。
起跑线的检测我们就不需要了。

3.2初始化

起初我们进行电机,舵机与摄像头的初始化,程序为:
在这里插入图片描述
初始化之前必须要先关闭中断,之后再打开,以防在程序中跑飞。初始化失败。
对于摄像头的初始化正如前面例程所说:
在这里插入图片描述
我们用全局变量数组AData[10][400]来存放从摄像头采集来的10行数据,
DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTE_BYTE0_IN, ADdata[0], PTD12, DMA_BYTE1, DATACOUNT, DMA_rising_keepon);
DMA_PORTx2BUFF_Init()采用DMA通道4 ,PTE0-PTE7 数据采集,ADdata数据存储位置,PTD12触发通道,DMA_BYTE1数据存储长度1,DATACOUNT数据总个数400,DMA_rising_keepon 触发方式上升沿。其中DMA_CH4与DMA_BYTE1都是枚举变量。
在这里插入图片描述
代表16个DMA通道和DMA每次传输字节数。

3.3 摄像头数据的采集

PTD12触发通道对应着PCLK像素同步信号,之前我们说过,每个24行采集一次,总共采集10行结束,就是对应着这个程序。

在这里插入图片描述
采集到的10*400的数据存放在全局变量数组AData[][]中。

3.4摄像头数据的处理

摄像头的处理包括了图像二值化与寻找黑线,我们的思路与下面的流程图相符合,不过我们每次都采集10行,因此第一个条件就”采集到的黑线行数>5”不用判断啦。
在这里插入图片描述

3.4.1图像二值化

我们可以设置一个全局阈值对图像进行简单的二值化,程序为:
在这里插入图片描述
用两个for循坏遍历一个二维数组,然后if条件做判断,如果此像素大于阈值128则设置为255,否则为0。

3.4.2寻找黑线与赛道中心

我从图像的中心相两边找,如果找到三个连续的点则为黑线。程序为
在这里插入图片描述
两边黑线的1/2出为赛道中心,保存在CenterLine[]数组里,这对于下图的弯道,
在这里插入图片描述
当我们检测不到黑线的位置的时候,我们应该就取图像的中心,也就是视觉中心与赛道中心重合,可以保持前行。

3.5 PID算法

在工业控制中,比例+积分+微分的控制规律是一种常用的方法,可适用于多种被控对象。PID调节器是一种线性调节器,它的实质是将设定值r(t)与输出值c(t)进行比较构成控制偏差
e(t)=r(t)-c(t)
将其按比例、积分、微分运算后,并通过线性组合构成控制量,如图所示,所以简称为P(比例)、I(积分)、D(微分)调节器。

在这里插入图片描述

这个误差我们以视觉中心与赛中中心的距离作为误差
在这里插入图片描述
由此我们便可以计算得到误差,将中间5个error取平均,然后用PID得到u(t)也就是result,程序如图:
在这里插入图片描述

3.6舵机控制

根据视觉中心与赛道中心的误差来进行舵机的控制,我们很自然的想到,将error放大一定倍数加到舵机中值上,如果每次转弯的方向是相反的,我们就用舵机中值减去得到的误差。如下图所示:

在这里插入图片描述
可能会注意到,为什么要对result进行判断,那是因为舵机的占空比取值范围不大,如果大于一定程度,角度超过一定极限容易损伤舵机,而且不一定左右都要在1000范围内,根据具体情况,具体调整。

3.7电机控制

此次项目设计,我们的电机占空比在25%左右,占空比不是很大,程序如图
在这里插入图片描述
但是在转弯的时候,由于舵机在极限位置,小车可能会卡着慢慢移动,这时候我们应该适当的增加速度,以保证在转弯的时候,小车正常行驶,不会出现停下来,缓慢转弯的情况。

四、总结

此次项目设计到这里也算告一段落,其中学到了很多,比如熟悉了一下基本环境的搭建,由于例程比较详细,这里显得轻松了许多。对于整车的调试,需要各模块进行,这样很轻松。在一个就是在海量的信息中找到我们有用的信息,这个很重要,信息爆炸的时代,如果对信息过滤的好,那必然会赢得时代,做一个弄潮儿,可我这种能力有待加强。因为首先是Thomas调试了程序,告诉了我有用的文档,我在开始开发的。在开发过程中,我也是表现出来极大的陌生感,因为对电路以及硬件调试的不熟,自己又好高骛远,不是很情愿动手动脑,导致最后开发速度慢,但在其中也学到了,边看开发文档边写程序,边读例程,找对应引脚,理清逻辑,边修改程序,实现自己想要的功能。未来的路还很长,希望自己静下心来,认认真真做每一件事,要想成功,兴趣与坚持,一直要动手,天生聪明,不如每天动手。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值