星空体育官方网站 智能车竞赛技术报告 | 智能视觉组 - 哈尔滨工程大学 - 济海追风0队
本文详细阐述了第十六届智能车竞赛智能视觉组的构思方案。该系统以i.mx8芯片作为主控单元,搭配RT1064芯片作为从控单元。通过视觉传感器识别赛道情况。借助光电编码装置测量车轮转速。依据车辆模型与赛道物理特性,制定行驶最优轨迹方案。采用PID等控制方法,对双电机输出以及舵机输出进行调控,从而实现四轮车转向轨迹和行驶速度的闭环管理。采用深度学习技术,运用mobilenetv3模型的人工智能算法,对图片进行识别。
[id_2049701825]
学 校:哈尔滨工程大学
队伍名称:济海追风 0 队
参赛队员:王彦斌
[id_142884016]
李烨
带队教师:许德新 唐墨
引言
这项赛事旨在提升学生能力并激发创新思维,其核心理念是注重成长、提倡参与、鼓励尝试、力求优秀。比赛要求参赛者依托指定的车辆模型,选用飞思卡尔公司的微控制器作为主要控制单元,加装路径感应装置、动力调节部件,并设计配套的控制软件,最终打造出一款可以自主辨认行驶路线的仿真汽车。参赛选手的目标是让模型车依据规定,在最短时间内跑完一圈赛道。
这项赛事由恩智浦半导体公司提供支持,获得了教育部领导层、恩智浦企业负责人以及众多高等院校师生的广泛认可,现已成长为覆盖全国三十个省市自治区的赛事,吸引了四百多所大学参与的大学生智能汽车竞技活动。
本报告由我们团队撰写,内容涵盖了小车制作的全部环节,包括整体构思、电路规划、程序设计、测试过程以及车辆各项指标,全面展示了我们的构思与创意,特别是在电路布局上的新颖方案,还有程序层面的创新思路,而单片机参数的细致调整则耗费了我们大量心力,这份报告是我们集体付出的心血结晶,也是团队协作的最终成果。
备赛期间,我们团队人员知识背景涵盖控制理论、模式辨认、传感装置、车用电子、电气工程、计算机科学、机械工程等诸多领域,此次锻炼对大家知识整合与操作技能提升帮助显著,每位参赛者都为此付出了巨大努力。
第一章 系统总体设计 1.1 系统概述
智能汽车的核心构造包含三个单元:感知单元,运算单元以及驱动单元。感知单元运用视觉传感器来获取环境数据,运算单元以i.mx8为中央处理器,RT1064为辅助处理器进行信息处理。驱动单元负责调节直流电机的运行速度。整个运作过程如下,视觉传感器先侦测前方的道路状况并记录图像,然后将道路数据传输给中央处理器,由中央处理器进行分析并作出响应。此外,借助光电编码器形成的反馈路径,会将车辆行进速率的资讯传递给底层计算机,再由底层计算机转交给顶层计算机。依据获取的赛道状况以及车辆实时的行进速率,顶层计算机会制定应对方案星空·体育中国官方网,再经由与底层计算机的联络,将脉宽调制指令调控直流马达执行对应操作,以此达成车辆转向调控与速率调控的目的。
依照智能车辆的基本规范,我们规划了整体构造图,具体呈现于图 1.1。

图 1 系统框图
第一章 系统总体设计 1.2 整车布局
(1)电池放于车模中部,合理分配重心,方便速度控制。
(2)舵机直立放置,以提高舵机响应速度。
(3)铜柱结合3D打印材料固定摄像头减小摄像头的晃动。
![[id_1882646099]](http://www.zhongxicloud.com/zb_users/upload/2025/01/1759255509462_1.png)
图 2 车模布局
第二章 竞赛目标与设备构造方案 2.1 智能图像处理团队竞赛目标 2.1.1 竞赛目标与具体规范
(1)车模
车模使用 c 型车模,车模作品尺寸不限。
(2)微控制器与传感器
该车模控制器明确要求采用 NXP 品牌的单片机,并且建议选用 i.MX RT 系列中的任意一种型号。
允许使用摄像头、电磁、红外、激光传感器等。
(3)比赛赛道
a.六种标准元素
b.车库
c.视觉识别元素:数字,动物星空体育平台官网入口, 水果
(4)比赛任务
跟从轨迹的任务:车辆模型在赛道上行驶,累计得分,规则与赛道条件同初级四轮车相同,只是每次行驶的时长改为两分钟。
识别任务说明:车模需停放在指定地点,每两分钟对同一位置的照片进行重复辨识,并根据辨识结果执行相应操作以获取积分;具体动作规范请参照图片辨识评分准则中的注释部分进行了解。
第二章 竞赛目标与设备构造方案 2.1.2 第十七场赛场特殊构造
(1) 三岔路口
三岔路口尺寸要求如下图所示:

两个三岔路口相隔较远,彼此间的间隔至少达到一天半以上。
三岔路口的每条支路都足够长,至少达到 45 厘米,而连接两个三岔路口的赛道在形状和距离上没有具体限制。
完成一次三岔路口任务标准:
从第一个三岔路口笔直穿过,然后继续行进超过半米长的直路;从另一个三岔路口沿直线行进,并离开三叉路口出去。
前后两次经过那个三岔路口时,要选择不同的分道前进,双车接力队例外,前后两次可以走一样的路口。
全向移动单元,在经过三岔道口时,必须切换行驶状态;至于车辆是否在三岔道口打转,或是冲出路线,这些情况都不予评判。
(2) 十字路口
十字路口没有规定,两个交叉的赛道中心线在中心点垂直就行。两个十字路口中心点之间的间隔,以及每个十字路口中心点与三岔路口中心点的间隔,都必须大于45厘米。
完成十字路口任务标准:
从交叉点的左边驶入,笔直穿过交叉点;不可以直接朝左转或朝右转; 汽车模型经过这个交叉点有两种状况:
当车辆模型经过交叉路口之后,若无法借助其他赛道构造物,例如斜坡、环行交叉或三路分歧点,直接重返交叉路口时,这种情况即为十字圆环路口
当穿越十字路口之后,会经过别的赛道构造,比如斜坡、环形交叉、三路分歧点,最后再回到那个十字路口继续通行;
以上两种都被视作通过十字路口两次。

(3) 环岛
环岛赛道的核心线径需达到五十厘米或以上,该线与赛道的主线相接。
完成环岛任务标准:进入环岛绕行至少一周以上驶出环岛;
在环岛范围内反复穿行的情况不予处罚。车辆禁止驶入环岛内部地带,一旦违反即算比赛目标未达成。
(4) 坡道
坡道的顶端高度须高于地面十五厘米,其余方面如宽度、长度、形态和建造材料均无限制。
完成坡道测试要求:车辆行进至坡顶位置,其轮胎与地面的间隔须大于十五公分。

在满足上述要求的同时,车模是否从坡道上掉落不进行判罚。
(5) 车库
车棚可在跑道上任意地点安放。对车棚的形态没有约束。必须确保模型车在起跑时,其纵轴线与跑道中心线成直角,且模型车的轮胎位于跑道界线以外。

车辆从车库启动后,需要在赛道上移动至少一米的距离,才算完成车库发车标准。
(6) 识别
识别图像可以获得积分,识别错误会被扣除积分。积分环节允许在两分钟内反复识别以累积分数,时间到后停止计分。扣分环节针对识别失误或未执行正确操作的行为进行惩罚。
当界面上显示特定图形,车辆若无法执行预期操作或操作失误,将损失该任务预设的分数值。举例来说,若呈现可食用的植物图像,车辆若未成功完成辨认及击中目标,则扣除 10 分;倘若展示双数符号图形,车辆若未依照指示行驶约 30 米距离,同样会遭受分数损失
厘米,然后退回到原地,则扣 5 分;
总分由两部分组成,一部分是比赛过程累积的分数,另一部分是人工智能解析的分数。比赛过程和图像解析两个环节各自设有两分钟倒计时,这两个环节的时间不可更改,即便放弃其中一个环节,另一个环节的剩余时间依然限制在两分钟内。
AI 视觉组赛道各元素积分分值、图片识别得分标准见下表:
2.2 机械结构设计 2.2.1 摄像头安装与调试
通过两个镜头来判定道路和影像,镜头装置在车体核心部位。支架部件由铜质支柱与增材制造部件拼合构成。
识别用摄像头高度 17.8cm,符合比赛规则要求。
搜寻路径时,摄像头的垂直位置为14.0厘米,这一数值满足竞赛的相关规范,参见图2.2.2。

2.2.2 编码器的安装
为了更加准确获取电机转速数据,本次车模选用了逐飞 1064 线编码器,并配套使用相关组件。编码器直接安装在车模预留的专用安装位置,具体安装方式参照图 2.2.3 所示。

2.2.3 电池安装
电池能够选用两个串联再并联的21700型锂离子单元。锂离子单元的放电能力很强,而且重量很轻。电池内部配有安全控制装置,因为展示要求需要取下,所以图中没有显示出来。电池的示意图是2.2.4这一张

电池安装如图 2.2.5

2.3 本章小结
本章着重阐述了小车在组装构建和调试环节中涉及到的机械层面的细节问题。我们自参赛以来,始终秉持机械设计与算法优化同等关键的观念,在迭代程序的同时,亦持续优化配套的机械构造与硬件设施以实现匹配。前述内容是我们最可靠的小车原型所积累的实践经验。从最初制作小车到现在,我们在机械构造方面进行了大量形形色色的探索和测试,取得了一定进展,不过当前这个版本是能配合算法并且最为可靠的构造体系。
第三章 硬件设计 3.1 硬件设计方案
该智能车辆管理系统包含三个主要部分:i.mx8主控单元、RT1064从控单元、电机执行机构以及图像传感器处理模块。基础功能板能够接入主控板,实现信号获取、运算处理和动力调节功能。为了降低从控单元和电机驱动部分对主控单元的电磁干扰,我们采取了分离布局方案,将这三个核心模块各自独立部署。
主机端关键线路包含以下部分:数据传输端口、核心电路板连接器、多种通信端口组合、电压调整装置、供电接入点、状态指示装置、数字选择器、电源控制装置、系统重启装置、时间基准单元等。
该设备内部关键构造包含多个部分,具体有供能调节装置、基础功能模块的连接端口、动力执行单元的对接界面、转速检测通道、小型显示屏、供电接入点、状态指示部件、多功能控制按键、以及总控开关等组件。
3.2 传感器选择
本设计中,传感器分为两部分:摄像头传感器、速度传感器。
3.2.1 摄像头
摄像头的运作方式如下:物体经由镜头形成的光学影像会照射到感光元件上,接着转化为电信号,经由模数转换变成数字信号,随后被数字处理芯片加以处理,最终通过特定途径传输给其他装置,
考虑到识别这一环节的加入,并且赛道状况并非完全可知,我们决定运用基于摄像头的识别手段来进行处理。
市面上常见的摄像头主要分为两个类型:数字式和模拟式,数字式的主要有ov7725、ov2640、ov5640、ov7670、MT9V032等,模拟式的主要有
ov5116, BF3003, MT9V136。数字相机多数配备DVP 接口,该接口的数据传输电压标准是
3.3v 的电压值明显小于常规模拟摄像设备所需的 12v,选用模拟摄像设备能够显著提升电路的稳固性,即便出现误操作,也不会导致广泛的硬件损毁情况。
实验表明自动驾驶汽车对视觉图像的清晰度标准并不严苛,然而对其反应速度的期待极高,特别是在车辆快速移动时,画面内容会剧烈变动,同时赛场中的光线状况极为复杂,存在光线过强或过弱的情况,是否有阳光直射,以及照明设备的光色和亮度,都会对镜头的拍摄效果产生显著作用,因此挑选一款性能匹配的相机变得至关重要。
KS2A543属于彩色全局感光设备,它是一种低压COMS,能够利用USB2.0端口传输画面。
3.2.2 编码器
这个车辆依靠编码器获得LM2596S供电的5V运行电压。处理器借助读取编码器脉冲的多少来判定车辆的速度,借助读取编码器方向引脚的电位高低来判断电机的转动方向。编码器以轻巧为佳,逐飞型号比较合适,因此决定采用1024位的逐飞编码器。
3.3 下位机
该微控制器核心板选用了逐飞RT1064开发板,为了节省电路板布局,主板上仅引出了本系统所需的端口,具体涵盖信号连接端口、外部中断端口,以及一些常规输入输出端口。
3.3.1 电源管理部分
电源部分配置了多个转换模块,其中一片LM2596-ADJ负责生成电压,供给单片机与OLED使用,电压为3.3V,另有两片TPS7333完成该任务,输出同样为3.3V,为单片机与OLED提供电力,还有一片LM2596转换为5.0V,为编码器及逻辑芯片提供能源,另外一片LM2596转换为7V,为舵机提供动力,同时还有一片LM2596转换为7V,为上位机提供电力,电源部分电路图展示在图11中

图 11 电源电路 3.3.2 辅助调试部分
为了降低工作强度提升调试效率,我们增设了五向按键和显示屏。显著缩短了操作时长星空体育app下载入口,无需频繁借助电脑进行编程。通过显示屏可以直观调整按键和拨码开关,实时呈现各项参数数值。同时也能清晰查看图像信息及其他相关数据。

3.3.3 电机驱动电路
BTN7971 是专为电机驱动场景设计的集成式大电流半桥芯片。该器件属于 NovalithIC™系列,内含一个 p 型高边 MOSFET 和一个 n 型低边 MOSFET,并将驱动集成电路集成在同一个封装体内。得益于 p 型高边功率开关的应用,无需配置电荷泵电路,因此能够显著减少电磁干扰的强度。集成驱动器 IC 能够便捷地与微控制器对接,配备逻辑电平接口,支持电流检测诊断功能,可以调节转换速度,能够生成死区时间,同时具备针对过热、电压不足、电流过大和短路情况下的防护措施。BTN8982TA 是一款防护性能良好且成本效益高的大电流 PWM 电机驱动器,其电路板占用面积很小。

图 13 电机驱动电路 3.4 上位机
上位机最小系统板选用了NXP i.MX 8M Mini芯片组。该芯片组集成了采用14 FinFET工艺的高性能、高能效核心。上位机主板配备了稳压电源部分,同时将USB端口和通信端口进行了外引。
3.4.1 稳压电源部分
先接入8.4V的电池电压,经由TPS5430转换成5V稳定电压。为保障系统板安全,借助FDS4435芯片将5V电源与供电5V分离,仅当系统板接入时才允许连通。连通后的5V电压继续稳定,提供给接口使用,再进一步降压至3.3V,供给DB连接器和USB设备。

图 14 电源电路 3.4.2 USB接口部分
5V电源(VCC5V)借助 P 沟道场效应管充当的电子开关向 USB 插口提供电力,这个电子开关的控制端是OTG_PWRON,OTG_PWRON呈现高电平状态时,电子开关会接通,一旦该端为低电平,电子开关则断开。三极管的功能在于,当主电路板没有电力供应时,不会探测到经由USB端口传输的电压。

图 15 USB电路
第四章 软件系统构建 4.1. 软件操作流程的总括思路
操控软件的核心,在于确保车模依照竞赛规范,以最高且最可靠的速率穿越全部赛道路径。所有方案的设计思路虽不尽相同,但软件的整体构造却如出一辙。我们的目标始终是稳固运行,同时兼顾效率,具体到软件层面,则包含影像获取、影像解析与识别横向信息,速率调控,速率反馈以及偏差测算等关键环节。
4.2 图像处理
运用opencv对获取的图像实施操作,具体流程包含:首先对图像进行载入,接着执行滤波处理,然后进行边缘检测,最后完成图像的保存。
1. 图像的灰度化以及二值化。
2. 图像的最大连通域的选取。
图片中心线确定,先向两侧扫描,识别黑点并记下其所在列位置;若两侧黑点都找到,则将两侧列值相加后除以二得到中心位置;若仅一侧发现黑点,则参考图像预设的修正量来计算中心点。

图 16 图像处理 4.3 电机以及舵机控制
PID 控制由三个核心要素构成,分别是比例、积分和微分。比例控制属于基础控制方法。它的控制器输出量与输入端的误差信号呈现正比特性。只要偏差出现,调节装置就会立刻响应,促使受控参数朝着缩小误差的方向调整,控制效果的大小由 KP 参数决定。如果系统中只运用比例控制,那么输出结果会带有剩余偏差。

4.4 识别任务处理
MobileNet v3发布于2019年, 这一版本融合了v1的深度可分离卷积, v2的Inverted Residuals和Linear Bottleneck, 以及SE模块, 并且借助NAS技术来搜寻网络的构造和参数。我们研发了一种涵盖水果、动物、奇数、偶数、奇数TAG、偶数TAG、空白及七分类的模型,采集了70000张图片作为数据集,全部通过人工收集完成,训练耗时3小时,其TOP1准确率达到99.92%。

4.5 本章小结
本章着重阐述了智能车竞赛涉及到的视觉识别技术,以及驱动系统调控策略等软件方案。这些方案构成了赛车侦测机制的中枢,我们反复排查故障并实施改进,改进后又发现新的难题。持续探索创新的调控方法,汲取前沿学问,并将这些新知融入智能车辆中。
智能车竞赛的代码无法一蹴而就,也不是简单复制粘贴就能运行,必须反复进行修正,找出错误调整设定,才能达到理想效果。此外若要取得更大进步,需要持续探索新的方法,从不同方向寻求对策,经过比较选择最佳方案。
附录 C:部分代码
#include "headfile.h" 
#define key_up B23 
#define key_left B22 
#define key_down B27 
#define key_mid B24 
#define key_right B26 
int16 left_now_spd = 0; 
int16 right_now_spd = 0; 
int16 left_exp_spd = 0; 
int16 right_exp_spd = 0; 
int u_left_now = 0; 
int u_left_last = 0; 
int u_right_now = 0; 
int u_right_last = 0; 
int u_val = 0; 
float Kp_left = -20; //-3 
float Ki_left = -3; //-0.55 
float Kd_left = -[id_1475008375]; 
float Kp_right = 20; //3 
float Ki_right = 3; //0.55 
float Kd_right = 0.5; 
uint8 mode = 0; 
int16 err_right[3] = {0,0,0}; 
int16 err_left[3] = {0,0,0}; 
int quad_distance = 0; 
int16 turn_servo_angle = 3985; 
int16 up_servo_angle = 3750; 
int16 down_servo_angle = 3550; 
int16 angle = 0; 
int dis1 = 0; 
int pic_pos = 0; 
uint8 imx8_rx_buffer[28] = {0}; 
lpuart数据传输结构体   imx8接收传输; 
imx8的g_lpuart句柄是lpuart_handle_t类型; 
 
int serial_stop_flag = 0; 
int hit_stop_flag = 0; 
//uint8 imx8_uart_data[10] = {0xFF,0xFF,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 
uint8 cam1_ok = 0; 
uint8 cam2_ok = 0; 
uint8 ser_ok = 0; 
uint8 bell_zz = 0; 
void motor_control(int num,int val) 
{ 
//0代表左边,1代表右边 
// u_val -50000----50000 
if(val>=50000) 
{ 
val = 50000; 
} 
else if(val<=-50000) 
{ 
val = -50000; 
} 
u_val = val; 
if(num == 0) 
{ 
if(u_val>=0) 
{ 
pwm_duty(PWM1_MODULE3_CHB_D1,u_val); 
pwm_duty(PWM1_MODULE3_CHA_D0,0); 
/*if(left_exp_spd ==0&&err_left[0]>500) 
{ 
pwm_duty(PWM1_MODULE3_CHB_D1,50000); 
pwm_duty(PWM1_MODULE3_CHA_D0,0); 
}*/ 
 
} 
else 
{ 
pwm_duty(PWM1_MODULE3_CHB_D1,0); 
pwm_duty(PWM1_MODULE3_CHA_D0,-u_val); 
 
} 
 
} 
else if(num == 1) 
{ 
if(u_val>=0) 
{ 
pwm_duty(PWM2_MODULE3_CHA_D2,u_val); 
pwm_duty(PWM2_MODULE3_CHB_D3,0); 
/*if(u_val>25000) 
{ 
pwm_duty(PWM2_MODULE3_CHA_D2,50000); 
pwm_duty(PWM2_MODULE3_CHB_D3,0); 
}*/ 
 
} 
else 
{ 
pwm_duty(PWM2_MODULE3_CHA_D2,0); 
pwm_duty(PWM2_MODULE3_CHB_D3,-u_val); 
/*if(right_exp_spd ==0&&err_right[0]>500) 
{ 
pwm_duty(PWM2_MODULE3_CHA_D2,0); 
pwm_duty(PWM2_MODULE3_CHB_D3,50000); 
}*/ 
 
} 
 
} 
 
} 
void uart1_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData) 
{ 
if(kStatus_LPUART_RxIdle == status) 
{ 
for(int i = 0;i<14;i++) 
{ 
if(imx8_rx_buffer[i] == 0X2F) 
{ 
if(imx8_rx_buffer[i+13] == 0XFF) 
{ 
uint8 sum = 0; 
sum = imx8_rx_buffer[i+1] + imx8_rx_buffer[i+2] + imx8_rx_buffer[i+3] + imx8_rx_buffer[i+4] + imx8_rx_buffer[i+5] + 
imx8_rx_buffer[i+6] + imx8_rx_buffer[i+7] + imx8_rx_buffer[i+8] + imx8_rx_buffer[i+9] + imx8_rx_buffer[i+10] + imx8_rx_buffer[i+11]; 
if(sum == imx8_rx_buffer[i+12]) 
{ 
left_exp_spd = -(imx8_rx_buffer[i+1] << 8  | imx8_rx_buffer[i+2]); 
right_exp_spd = imx8_rx_buffer[i+3] << 8  | imx8_rx_buffer[i+4]; 
turn_servo_angle = imx8_rx_buffer[i+5] << 8  | imx8_rx_buffer[i+6]; 
down_servo_angle = imx8_rx_buffer[i+7] << 8  | imx8_rx_buffer[i+8]; 
up_servo_angle = imx8_rx_buffer[i+9] << 8  | imx8_rx_buffer[i+10]; 
bell_zz = imx8_rx_buffer[i+11]; 
 
} 
} 
 
} 
} 
serial_stop_flag = 0; 
 
} 
handle->rxDataSize = imx8_receivexfer.dataSize;  //还原缓冲区长度 
handle->rxData = imx8_receivexfer.data;          //还原缓冲区地址 
} 
uint8 key_scan(PIN_enum pin) 
{ 
if(!gpio_get(pin)) 
{ 
systick_delay_ms(100); 
if(!gpio_get(pin)) 
{ 
return 1; 
} 
} 
return 0; 
} 
//uint8 laser_flag = 0; 
void laser_run(uint8 flag) 
{ 
if(flag) 
{ 
gpio_set(B20,0); 
systick_delay_ms(4); 
gpio_set(B20,1); 
systick_delay_ms(4); 
} 
else 
{ 
gpio_set(B20,0); 
systick_delay_ms(4); 
} 
 
} 
int oled_cnt = 0; 
float Kp = 8; 
float Kd = 25; 
int16 Max_Vel = 3000; 
int16 Min_Vel = 3000; 
uint8 params_data[13] = {0,0,0,0, 
0,0,0,0, 
0,0,0,0,0};//Kp(4)Kd(4)v_max(2)v_min(2)garage(1) 
uint8 chk_sum = 0; 
uint8 pkg_head[2] = {0xfe,0xef}; 
uint8 pkg_tail[2] = {0x79,0x7e}; 
uint8 pkg_det[4] = {0x11,0x22,0xff,0xee}; 
union Kp_Union 
{ 
float[id_128570001]; 
unsigned char dat[4]; 
}Kp_Union; 
union Kd_Union 
{ 
float Kd; 
unsigned char dat[4]; 
}Kd_Union; 
 
uint8 car_init(void) 
{ 
oled_p6x8str(20,0,"Mode:"); 
if(mode==0) 
{ 
oled_p6x8str(60,0,"SLOW_Track"); 
} 
else if(mode==1) 
{ 
oled_p6x8str(60,0,"FAST_Track"); 
} 
else if(mode==2) 
{ 
oled_p6x8str(60,0,"Detect"); 
} 
oled_p6x8str(50,1,"RUN"); 
oled_p6x8str(0,oled_cnt,">>"); 
 
if(key_scan(key_up)&&oled_cnt>0) 
{ 
oled_cnt--; 
oled_fill(0x00); 
} 
 
if(key_scan(key_down)&&oled_cnt<1) 
{ 
oled_cnt++; 
oled_fill(0x00); 
} 
 
if(oled_cnt==0) 
{ 
if(key_scan(key_left)&&(mode>0)) 
{ 
mode--; 
oled_fill(0x00); 
} 
else if(key_scan(key_right)&&(mode<2)) 
{ 
mode++; 
oled_fill(0x00); 
} 
} 
if(oled_cnt==1) 
{ 
if(key_scan(key_mid)) 
{ 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
 
uart_putbuff(USART_1,pkg_head,2); 
uart_putchar(USART_1,mode); 
uart_putbuff(USART_1,pkg_tail,2); 
return 0; 
} 
 
} 
systick_delay_ms(5); 
return 1; 
} 
int action = 0; 
int main(void) 
{ 
DisableGlobalIRQ(); 
board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口 
/*串口初始化*/ 
uart_init (USART_1, 500000,UART1_TX_B12,UART1_RX_B13); 
NVIC_SetPriority(LPUART1_IRQn,0);         //设置串口中断优先级 范围0-15 越小优先级越高 
uart_rx_irq(USART_1,1); 
 
//配置串口接收的缓冲区及缓冲区长度 
imx8_receivexfer.dataSize = 28; 
imx8_receivexfer.data = imx8_rx_buffer; 
 
//设置中断函数及其参数 
uart_set_handle(USART_1, &imx8_g_lpuartHandle, uart1_callback, NULL, 0, imx8_receivexfer.data, 28); 
/*舵机电机初始化*/ 
pwm_init(PWM1_MODULE3_CHA_D0 , 7000, 0);//右前 
pwm_init(PWM1_MODULE3_CHB_D1 , 7000, 0);//左前 
pwm_init(PWM2_MODULE3_CHA_D2 , 7000, 0);//左后 
pwm_init(PWM2_MODULE3_CHB_D3 , 7000, 0);//右后转 
 
pwm_init(PWM4_MODULE2_CHA_C30 , 50, turn_servo_angle); 
pwm_init(PWM4_MODULE3_CHA_C31 , 50, down_servo_angle); 
pwm_init(PWM4_MODULE1_CHA_B25 , 50, up_servo_angle); 
qtimer_quad_init(QTIMER_1, QTIMER1_TIMER3_C24, QTIMER1_TIMER2_C2); 
qtimer_quad_init(QTIMER_2, QTIMER2_TIMER1_C4,QTIMER2_TIMER0_C3); 
gpio_init(D12, GPO,0, GPIO_PIN_CONFIG);//beel 
gpio_init(B20, GPO,0, GPIO_PIN_CONFIG);//laser 
gpio_init(key_up, GPI,1, GPIO_PIN_CONFIG);//上 
gpio_init(key_down, GPI,1, GPIO_PIN_CONFIG);//左 
gpio_init(key_left, GPI,1, GPIO_PIN_CONFIG);//下 
gpio_init(key_right, GPI,1, GPIO_PIN_CONFIG);//中 
gpio_init(key_mid, GPI,1, GPIO_PIN_CONFIG);//右 
oled_init(); 
while(car_init()); 
pit_init();                     //初始化pit外设 
if(mode==0) 
{ 
pit_interrupt_ms(PIT_CH0,1);  //初始化pit通道0 周期 
pit_interrupt_ms(PIT_CH1,5);  //初始化pit通道1 周期 
pit_interrupt_ms(PIT_CH2,10);  //初始化pit通道0 周期 
} 
if(mode==1) 
{ 
pit_interrupt_ms(PIT_CH0,1);  //初始化pit通道0 周期 
pit_interrupt_ms(PIT_CH1,5);  //初始化pit通道1 周期 
pit_interrupt_ms(PIT_CH2,10);  //初始化pit通道0 周期 
} 
if(mode==2) 
{ 
pit_interrupt_ms(PIT_CH0,1);  //初始化pit通道0 周期 
pit_interrupt_ms(PIT_CH1,5);  //初始化pit通道1 周期 
pit_interrupt_ms(PIT_CH2,10);  //初始化pit通道0 周期 
Kp_left = -40; //-3 
Ki_left = -4; //-0.55 
Kd_left = -0.5; 
Kp_right = 40; //3 
Ki_right = 4; //0.55 
Kd_right = 0.5; 
} 
NVIC_SetPriority(PIT_IRQn,15);  //设置中断优先级 范围0-15 越小优先级越高 四路PIT共用一个PIT中断函数 
EnableGlobalIRQ(0); 
while(1) 
{ 
////蜂鸣器zzz 
if(bell_zz==0) 
{ 
gpio_set(D12,0); 
} 
else if(bell_zz==1) 
{ 
gpio_set(D12,1); 
} 
if(up_servo_angle==4000) 
{ 
laser_run(1); 
} 
else 
{ 
laser_run(0); 
} 
} 
 
} 
 
相关图表链接:
 鲁ICP备18019460号-4
我要评论