1 Star 0 Fork 34

Arcturus / (2023年)智能汽车竞赛-完全模型组-学习资料

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
Loading...
README

一、开源资料简介

​ 智能汽车竞赛-智控板(也称下位机控制板/CarDo),由 北京赛曙科技有限公司主导研发,是一款针对智能汽车、全面软硬件生态开源的控制主板(MCB)。

​ 此外,为推动AI无人驾驶教育事业快速普及,降低该类高新赛事技术门槛,倡导公平、公正与合作共赢的比赛精神,赛曙科技联合诸位研发工程师历经数月开发与测试验证,开源以下技术方案(供交流学习):

二、智控板简介

​ 大学生智能汽车竞赛开源智控板(CarDo),其核心功能包括阿克曼转向模型(舵机)控制、直流电机闭环(PID)控制、上下位机串口通信(UART)、电池电量监控(SOC)、以及声光电等形式的人机交互(HMI)功能。

​ 图2.1 智控板核心功能拓扑

2.1 智控板外型图纸

​ 智控板外型尺寸如图2.2所示,电路板以4个3mm固定孔与智能汽车底板连接,车模出厂均开孔,参赛队伍自行安装测试。

​ 图2.2 智控板PCB尺寸

​ 智控板的电气接口如图2.3所示,PCB丝印层已标注信号标识,电源输入端已设计防反接和常规EMC保护措施,各调试接口均按最佳人机友好方式设计,确保比赛调试高效可靠。

​ 图2.3 智控板(CarDo)外设接口

2.2 智控板装配效果

​ 智控板在智能汽车上的装配示意图如图2.4所示,其人机交互接口(开关、按键、程序下载口)均对应车壳开孔位置,此外参赛队伍需要额外制作线材:EB电源线x1、电机电源线x1、编码器信号线x1、双头USB-A(公头)x1。

​ 图2.4 智控板装配示意图

三、智控板编程说明

​ 智控板采用GD32F103C8T6-ARM-Cortex-M3单片机作为核心控制器,其最大主频为108MHz(实际使用72MHz), 软硬件均保持与STM32F103C8x单片机一致。源码工程基于Keil-5创建,程序下载及调试可通过J-Link-OB调试器完成。

​ 图3.1 J-Link OB 调试器

​ 注意在使用相关模块功能时,添加相关的线程计数函数在timer.c当中,并在main.c添加相关的初始化函数和处理函数。

3.1 Block模块化设计

​ 如图3.2所示,智控板嵌入式软件基于模块化(Blocks)规则搭建,分别针对硬件底层驱动(BSP)、应用级算法逻辑(Logic)和伪线程逻辑分配(Thread)三部分代码模块化设计。

​ 图3.2 智控板模块化(Blocks)软件架构

​ 源码工程依据模块初始化(Init)→逻辑控制(Handle)→线程控制(Timer)的流程搭建,每类功能块(Block)代码的架构清晰且高效运行。参赛者可按此规则自定义功能块,并协同调度相关资源。

​ 代码初始化部分代码均在程序主入口“main.c”中:

​ 图3.3 智控板程序初始化位置

​ 各功能块逻辑控制部分在程序主入口“main.c”的循环部分(While),这部分代码包含各个模块的核心控制逻辑与数据交互内容。例如蜂鸣器音效的控制逻辑控制,需要根据不同频率和名叫次数产生各项音效(确认/报警/完成等),通过各个标志位和计数器实现。

​ 功能块的逻辑控制代码将封装在一个_Handle()函数中,并且在While循环里持续运行,请注意这部分代码禁止产生任何延时(Delay)或堵塞(Stop)效果,通常认为_Handle()代码中执行的内容零延迟(No Delay!)。程序中所有时序效果都由线程(Timer)控制。

​ 图3.4 智控板功能块逻辑控制代码位置

​ 智控板线程控制代码位于“Timer.c”文件的定时器中断里,终端周期为1ms,所有功能块控制逻辑所需的时序均在此统一控制。

​ 图3.5 智控板线程控制代码位置

3.2 上下位机通信协议

​ 【表1】智控板上下位机USB/UART通信协议

​ 数据解析:上表数据涉及Byte(Char),Float,Uint16,Short(Int16)四种类型,智控板与FZ3B数据编码和解码均通过共用体(Union)实现,例如:

typedef union

{

​ uint8_t U8_Buff[2];

​ uint16_t U16;

​ int16_t S16;

}UNION_BIT16;

typedef union

{

​ uint8_t U8_Buff[4];

​ float Float;

}UNION_BIT32;

​ USB/UART通信帧中,校验和(Check)为包括帧头(Head)开始的10字节数据和,其具体在驱动板中的计算方式为:

uint8_t check = 0;

for(int i=0;i<10;i++)

​ check += UsbStructure.ReceiveBuff[i];

3.3 智能车姿态控制(舵机)

​ 舵机的相关驱动代码在“Servo.c”文件中

​ 图3.6 舵机驱动功能块代码

​ 智控板舵机(Servo)的核心函数(API)及使用说明如下表:

​ 【表2】SERVO对应API说明

API(可使用的程序接口) Function(功能)
SERVO_Init(void) 初始化舵机控制底层,并打舵至车辆居中位置
SERVO_AngleControl(float angle) 舵机角度(Angle)控制,左右最大角度值为±38°(最大角度限制可修改)
SERVO_SetPwmValue(signed int pwm) 舵机输出的PWM控制,值域:500~2500
SERVO_SetPwmValueCorrect(signed int pwm) 舵机PWM控制,根据用户设定的舵机PWM阈值矫正后输出PWM

​ 在程序中,舵机的设定控制量的范围在500~2500(0°~180°),根据实际小车的结构,前向转角限制需要设定限制,比如:设定为1150~1850,目的是防止舵机卡死在限定的角度,舵机在堵转时电流会增大,经过一段时间的发热之后,舵机最后会烧毁。设定切换舵机角度的时间不应该小于舵机本身的响应时间,在不合适的切换周期内快速切换,电流同样逐步增大,最后导致舵机烧毁。

​ 在头文件(Servo.h)中修改配置参数。(注意:舵机在使用时请先进行中值校准)。

​ 图 3.7 舵机阈值设定

3.4 智能车速度控制(直流电机)

​ 智控板针对智能汽车的行驶速度控制任务,涉及到编码器速度采样(Encoder)、闭环速控模型计算(PID)、直流电机全桥驱动电路控制(Motor)三部分内容。其代码构成如下图:

​ 图3.8 车辆速度控制代码文件

3.4.1 编码器采样(Encoder)

​ 编码器采样的程序及API说明如下表:

​ 【表3】ENCODER对应API说明

API(可使用的程序接口) Function(功能)
ENCODER_Init(void); 编码器初始化
ENCODER_RevSample(void); 编码器转速采样

3.4.2 闭环速控模型(PID)

​ 智控板针对智能汽车竞赛的车模(I车模)深度开发调试,给定一版PID模型参数供各位参赛选手学习研究。通常需要根据每辆智能汽车的硬件条件深度调试,匹配最佳的PID参数,参赛选手可在“Pid.h”文件的宏定义部分修改该参数:

​ 图 3.9 PID参数修改

​ PID闭环速控模型的API功能及说明如下表:

​ 【表4】PID对应API说明

API(可使用的程序接口) Function(功能)
PID_Init(void) PID参数初始化
PID_MoveCalculate(PID_Struct *pp) PID速控模型计算输出的pwm(注意:需要编码器转速采样之后,进行处理)

3.4.3 直流电机全桥驱动控制(MOTOR)

​ 据实测,智控板针对智能汽车竞赛车模(I车模)的实际驱动速度为:空载最高14.7m/s,负载最高11.7m/s。在驱动代码的头文件(Motor.h)中限制了车辆的最高速,以保障各项安全。同时参赛队伍可以修改控制周期等参数调试。

​ 图3.10 MOTOR控制头文件

​ 智控板对直流电机全桥驱动器的功能函数说明如下表:

​ 【表5】MOTOR对应API说明

API(可使用的程序接口) Function(功能)
MOTOR_Init(void) 电机控制初始化
MOTOR_SetPwmValue(signed int pwm) 电机输出pwm设置,-2000~2000,绝对值越大,转速越大
MOTOR_ControlLoop(float speed) 电机闭环速度控制,函数输入为速度m/s(需要编码器采样转速后使用)
MOTOR_Timer(void) 电机控制线程,10ms对电机进行一次控制

3.5 电量计

​ 电池在长时间使用过程中,过充亦或者使用电压持续过低容易对电池造成损坏,电量计用于采集电池的电压和电量,可有效协助参赛队伍合理利用电池。

电量计的相关驱动代码在“soc.c”文件中,其功能API说明如下表:

​ 【表6】SOC对应API说明

API(主要的程序接口) Function(功能)
SOC_Init(void) 初始化电量计 返回值1,i2c读写错误 返回值2,芯片处于sleep模式 返回值3,写入的profile信息读出与代码不一致 返回值4,芯片启动30s内读电量值一直异常
SOC_Timer(void) 电量计计数器,用于控制电量计时序
SOC_Handle(void) 电量计处理函数,每秒采集电量和电压进行更新

​ 用户可根据自身需求,去修改文件中的源码设置,从而实现个性化的功能。例如低电量报警等功能。

四、人机交互功能(HMI)

​ 智控板为参赛队伍设置多项必要的人机交互功能,包括发车和调试所需的按键输入(Key)、传感器光源补偿和状态提醒的RGB彩灯控制、报警及提醒的多功能蜂鸣器音效。

​ 图4.1 人机交互功能

4.1 按键挡位

​ 在“Gpio.c”文件中,已经添加了按键的相关响应接口,在“Icar.c”文件中参赛者可添加相关的按键处理代码来实现个性化的操作,通过精确捕捉按键按下的时长来检索各个模式挡位。比如:可设定在按键按下进行小车发车,可设定按键持续按下3s以上进行小车的自检等等。

​ 图4.2 添加按键处理代码

4.2 RGB全彩灯控制

​ 用户可自己设定RGB灯光的颜色来便于观察小车的运行状态,譬如:在小车静态情况下设置为蓝色,运行过程中RGB灯光切换为绿色,电量较低时RGB切换为黄色或者红色。来展示小车的状态。

​ RGB彩灯规格推荐WS2812系列灯珠(淘宝可买),灯的数量自选,可串联使用,通过单总线协议控制灯效,彩灯供电推荐5V,并接入智控板的扩展IO使用。

​ 图4.3 WS2812系列彩灯

​ 智控板针对WS2812单总线协议控制RGB彩灯的代码在“Rgb.c”文件中,其核心API说明如下表:

​ 【表7】RGB对应API说明

API(可使用的程序接口) Function(功能)
RGB_Init(void); RGB灯初始化
RGB_SetAllColor(unsigned long color); 设置灯光的颜色
RGB_SetColorToColor(unsigned long color0, unsigned long color1); 设置灯管颜色从color0渐变到color1

彩灯的色值在“Rgb.h”文件中有定义,参赛者可自定义添加颜色。

​ 图4.4 RGB彩灯颜色定义

4.3 蜂鸣器音效控制

​ 智控板为参赛队伍设计一颗5V无源蜂鸣器,用户可自己设定蜂鸣器的运行模式进行人机交互。例如:在系统初始化成功之后,设定开机音效;按键按下时,设定提示音效;低电量的情况下进行电量报警的音效。

​ 蜂鸣器使用的函数说明如下表:

​ 【表8】蜂鸣器对应API说明

API(可使用的程序接口) Function(功能)
GPIO_Initialize(void); 初始化一个蜂鸣器,状态LED和按键输入
GPIO_Timer(void); GPIO的线程控制
GPIO_Handle(void); GPIO的处理函数
GPIO_BuzzerEnable(Buzzer_Enum buzzer); 蜂鸣器工作模式设定,可设定为以下5种

空文件

简介

北京赛曙科技,基于百度Paddle、EasyData、Edgeboard-FZ3B、MCU等软硬件平台,根据2023年全国大学生智能汽车竞赛(完全模型组)规则研发测试,开源如下软件和硬件学习资源,旨在促进大赛发展,降低初学门槛。 声明:本资料仅用作个人学习,不涉及任何商业利益,坚持周期性更新! 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/ranunculus/sasu-intelligentcar-kits.git
git@gitee.com:ranunculus/sasu-intelligentcar-kits.git
ranunculus
sasu-intelligentcar-kits
(2023年)智能汽车竞赛-完全模型组-学习资料
master

搜索帮助