第二十一届全国大学生智能车竞赛---走马观碑组技术手册
前言
位参赛的同学们,大家好!新的一届智能车又来临了,和往届相比,第二十一届智能车大赛的赛项发生了很大的变化,走马观碑龙芯组别成为本届赛事的亮点之一。今天,我们将聚焦龙芯赛道,由龙邱工程师为大家带来龙芯赛道的全面讲解。讲解内容包括赛题解析,机械结构,硬件配置,软件基础与控制思路。
撰写这篇手册是帮助新同学快速的了解充满魅力的智能车大赛。同时,会在在这里给大家分享我们龙芯赛道的方案与调车心得。我们深知,没有绝对的最优解,但在手册里,我们会毫无保留地分享我们在龙芯赛道积累的方案经验与调车心得。希望这些内容能为大家提供一条清晰的探索思路,让大家在备赛过程中少走弯路,更加从容地应对比赛挑战。
如果大家想要探讨智能车相关话题,欢迎加入我们的 QQ 讨论群。在这里,无论是智能车的硬件设计、软件编程,还是比赛策略、技术难题,都能展开交流。
龙邱21届智能车综合技术交流群:228227119
龙邱21届智能车走马观碑组(龙芯)交流群:981693198
1. 组别简介
1.1. 规则信息来源
- 智能汽车竞赛官网:http://www.smartcarrace.com/
http://www.smartcarrace.com/ - 卓老师CSDN博客: 第二十一届全国大学生智能汽车竞赛比赛规则
https://blog.csdn.net/zhuoqingjoking97298/article/details/154598625?spm=1001.2014.3001.5501 - 卓老师微信公众号推文及每篇公众号文章的评论区
1.2. 赛题要求


1.3. 规则解析
任务目标:走马观碑组需在室内赛道上完成运行一周的任务,赛道元素包括路障、环岛、坡道等,并且在赛道上存在目标板, 车模识别目标板上的物体,根据类别要求通过。
规则要点:
- 目标板:在赛道上和赛道旁边存在一些目标板上面包括有特定种类的物体和文字图案。
- 负压电机驱动:可以在STC、Infineon、NXP中选用。
- 边界锥桶:车模需要由锥桶内侧运行。 在没有锥桶的部分,允许短暂离开赛道。
- 赛道方面:室内赛道采用PVC耐磨塑胶地板材料制作,材料与前几届比赛相同。需要注意:自制的电路板需在正面覆铜面展示队伍信息,包括学校名称、队伍名称、制作日期。
2. 硬件清单
2.1. 车模
针对走马观碑组赛道,在规则中限制使用三轮车模,推荐使用F车模。

F车模采用四轮结构,有较大的支撑面积,车模在行驶中更加稳定。采用双电机后驱的方式,提供了更大的扭矩,能够更快的达到较高的速度。车模的转向系统经过精心设计,具有较好的转向灵活性,可以实现较小的转弯半径,适应各种弯道和曲线的要求。
2.2. 主控
第二十一届走马观碑赛道可以使用龙芯2K0300核心板作为主控平台,具体开发板限制还需要卓晴老师发布。
2.3. 硬件模块
2.3.1. 模块清单及基本作用介绍
为了更加方便大家的学习,我们在这里给大家提供了一个方案,能够让大家更快速的上手学习,所需要的模块在下面的表格中都列举了出来。如果大家有需要的话可以在龙邱科技淘宝店铺自行选购。店铺链接:龙邱科技汽车电子专业店
https://shop36265907.taobao.com/
| 是否需要自制 | ||||
| 否 | ||||
| 是 | ||||
| 灵眼USB摄像头 | 1 | 实时提供赛道信息 | 是 | 否 |
| 512线mini编码器 | 2 | 检测电机转速以实现速度闭环控制 | 是 | 否 |
| DRV8701双路驱动 | 1 | 驱动车模上的两个电机 | 是 | 是 |
| 摄像头支架 | 1 | 支撑摄像头 | 是 | 否 |
| 1.8寸TFT-SPI屏幕 | 1 | 调试工具,用来显示数据 | 是 | 否 |
| F三轮车模 | 1 | 基础载体 | 是 | 否 |
| MPU6050 V3陀螺仪 | 1 | 姿态反馈 | 是 | 否 |
| 锂电池+充电器+报警器 | 1 | 电源及智能报警,防止过充过放 | 是 | 否 |
| 红外测距模块 | 1 | 红外测距检测坡道 | 是 | 否 |
| 2205无刷电机 | 2 | 负压 | 否 | 否 |
| STC无刷电机驱动 | 2 | 负压 | 否 | 是 |
| 2205无刷电机支架 | 1 | 负压 | 否 | 否 |
| 蓝牙主机和从机 | 1 | 日常调试用,比赛禁用 | 否 | 否 |
| 无线串口模块 | 1 | 日常调试用,比赛禁用 | 否 | 否 |
2.3.2. 龙芯2K0300拓展版

鉴于走马观碑赛道需要的模块较多、布线复杂且车模空间有限,故我们为龙芯久久派板卡特制了一款电路板,尺寸仅有 68.3 * 56.3mm,缩小体积的同时也减轻了重量,方便安装。前期学习可直接购买成品使用,后面参加比赛需要更换为自己制作的板子。
拥有的功能如下:
1、两个可编程独立按键:右侧放置,方便调参;
2、电源开关:2档3脚横柄式拨动开关,控制整个母板电路供电;
3、XT30电源输入输出口:可使用XT30电池供电,输入电压范围6V-28V,支持2~6s电池,并可通过另一个XT30接口直接给驱动板供电;
4、两路编码器接口:可同时采集两路编码器信号,方便电机闭环控制和速度采集;
5、IIC接口:可与TOF、陀螺仪等IIC通信模块连接,进行数据传输;
6、UART接口:通过蓝牙模块和上位机通信;
7、Type-C接口:连接核心板UART0,电脑通过Type-C数据线可直接控制核心板,使用更方便;
8、屏幕接口:可使用硬件/软件SPI驱动TFT屏幕,屏幕小巧,显示清晰,速度快,还兼容龙邱IPS和OLED屏幕;
9、舵机+无刷驱动接口:三路PWM信号输出,可同时连接一个舵机控制车模转向和两个无刷电机驱动控制负压电机;(两个无刷电机公用一个PWM信号)
10、ADC接口:预留6路ADC接口,可同时采集6路ADC信号;
11、双路驱动接口:可同时控制两个电机实现调速和正反转;
12、红外接口:可连接龙邱红外测距模块,ADC采集障碍物距离,反应速度快;
13、电源拓展口:电流可达3A以上,方便其他外设供电;
14、可编程控制蜂鸣器:用于声音提示程序状态;
所有元器件都是正面摆放,并设有防反接设计,防止短路和电池反接。
2.3.3. 龙芯赛道学习套件
龙邱科技根据上方提供的方案,为走马观碑赛道所需要的一些模块整合为了学习套件,方便有需要的同学进行购买。学习套件中包括有除车模外,上述表格中的所有模块,大家也可按照学习套件中的模块自行购买。二十一届智能车走马观碑组学习套件
https://item.taobao.com/item.htm?abbucket=14&id=995025509874&mi_id=0000VkpdXllizbzMP-GD0HAWdgGC65zi1qeB5oTE1Dp_cdw&ns=1&priceTId=213e096317660303793215772e175c&skuId=5973642061418&spm=a21n57.1.hoverItem.1&utparam=%7B%22aplus_abtest%22%3A%22fb7931475f70a43f0f16c2dded951ddb%22%7D&xxc=taobaoSearch
2.4. 龙芯赛道方案接线指示图
2.5. 硬件连接
2.5.1. 灵眼USB摄像头
在龙芯2k0300久久派上使用USB摄像头需要根据官方文档《第五卷-qt相关解决方案》先配置内核。在龙芯板卡的内核中配置好,使其支持USB摄像头后,直接将摄像头插到龙芯板卡上就可以直接使用了。
龙邱会将所用到的文件为大家整理出来,放入到龙邱的Gitee仓库中,其他相关资料以及其它组别资料也都会分类放入其中,大家可以持续关注一下。
龙邱Gitee仓库地址:https://gitee.com/lq-tech/
2.5.2. STC无刷电机驱动的连接

其中:
1、电源输入口,外接3S电池,供电电压11-13V;
2、无刷电机连接端口,接无刷电机三相电源线;
3、外部信号输入接口,外界输入信号;
4、下载及串口接口,可通过此接口下载程序;
5、复位按键,下载程序或复位程序使用;
6、RGB彩色指示灯。
STC无刷电机驱动中控制口引脚从左到右依次是GND、5V、PWM。与龙邱的龙芯拓展版从右到左的引脚一一对应,可直接对应连接。


2.5.3. DRV8701双路驱动连接
如果要控制一个直流电机的转速,我们可以通过改变其两端电压即可实现,但是该种方法有很大的局限性,可调直流电源构造复杂、成本高昂,应用起来很不现实。所以我们采用另外的控制方式:电压源→驱动器→直流电机,电压源提供直流电压,不同的驱动器控制不同的直流电机,应用非常灵活。其中驱动器对电机的调速控制是利用的PWM。
该驱动采用门极驱动芯片 DRV8701E + N-MOS 管 TPH1R403NL 方案,无需升压电路,输入电源 5.9V ~ 28V 均可使用,带过流保护功能。
其中PH-6P接口用来隔离供电以及信号输入。红色端子同来提供直流电压输入,输入电压5-28V,一般大小为电机可承受的最大电压。蓝色端子是直流电压输出,输出电压与输入PWM值正相关,连接到电机上。当PWM波的占空比越大时,蓝色端子输出的电压值与红色端子的电压值越接近,反之则与0V越接近。
根据关系公式:
U红×脉宽 = U蓝×周期
两端同时除以周期,得到如下关系式:
U红×占空比 = U蓝
例如当红色端子的幅值为24V,占空比为50%时,与直流电压12V作用到电机上所产生的效果是一模一样的,即速度相同;即24V×50%=12V。
另外,PWM波的频率不可以随意设置,频率太低会导致电机运转不畅,振动大,噪音大;频率太高会导致驱动器开关损耗较大,甚至有电机会啸叫而不转的情况。一般1k~30k的PWM频率较为普遍,几百Hz的也有,实际上需要根据电机功率在测试时确定合适的PWM频率范围为宜。
连接电源的时候要注意,龙邱的龙芯拓展版上连接电池的接口使用的是XT30接口,连接的时候平头处连接正极,圆头处连接负极,千万注意不要连接错误。该模块在学习测试时可以使用,在比赛时需要更换为自己制作的板子。
2.5.4. 512线mini编码器
编码器是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。按照工作原理编码器可分为增量式和绝对式。
绝对式编码器的每一个位置都对应一个确定的数字码,它的示值只与测量的起始和终止位置有关,与测量的中间过程无关,如角度编码器。
增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,本例程使用的是此类编码器。
正交AB相512线编码器通过两个信号线的输出脉冲进行数据处理,一个输出脉冲信号就对应一个增量位移,编码器每转动固定的位移s,就会产生一个脉冲信号,通过读取单位时间t的脉冲信号的数量,便可以达到测速的效果(v=s/t),通过对脉冲信号的累加,和编码器码盘的周长便可以达到计算路程的功能(s=d0+d1+...)。
编码器的线数,是说编码器转一圈输出多少个脉冲,如果一个编码器是512线,说明这个编码器转一圈对应的信号线会输出512个脉冲,AB两相转一圈发出的脉冲数一样的,不过存在90°相位差。

编码器反馈回脉冲信号,定时器引脚接收脉冲信号,通过AB信号的差异判断是正值还是负值,脉冲信号值会在定时器中累计,直到手动清除,所以每次读取编码器值后需要清除累计值,才可以或者速度值。细心的读者可能会发现,相同转速下编码器值读取大小与读取时间间隔有关,读取时间间隔越大,累计值越大,读取到的值也回越大。
连接方式如下图所示:

2.5.5. 1.8寸TFT-SPI屏幕
方案中采用的是TFT显示屏,TFT即薄膜晶体管,是一种有源矩阵液晶显示技术。TFT 技术通过为每个像素点配备一个独立的薄膜晶体管,实现对像素点的精确控制,从而能够呈现出清晰、鲜艳的图像和色彩。与传统的无源矩阵液晶显示相比,TFT 具有响应速度快、对比度高、视角广等优点。屏幕分辨率为128*160,尺寸为1.8寸。
屏幕显示接口采用SPI通信方式,不同的是屏幕不需要返回数据到主机,所以只需要用到一跟数据线(DI),但采用的是标准的SPI协议。


连接方式按照下文中龙芯赛道方案接线指示图所示,连接完成如下图所示:

2.5.6. 陀螺仪
陀螺仪在智能车中的应用:
- 与转向环串级使用,达到更好的控制效果。
- 调整平衡车姿态,使车身平衡且能正常转向和前进。
- 作为角度环闭环控制的输入。
- 积分角度作为元素状态切换条件,例如确定环岛的进环、环内、出环时机。
陀螺仪主要由加速度计与陀螺仪两部分组成,加速度计用于测量物体的加速度,陀螺仪用于测量物体的角速度。通过对加速度和角速度的测量,可以推导出物体的角位移。简单来说就是可以读取物体的偏移角度,以及移动的加速度。可以通过程序处理得到物体的欧拉角以及移动加速度。

使用时,将SDA、SCL、3V3、GND四个引脚,与龙邱的龙芯拓展版对应连接即可,连接位置可看下文中龙芯赛道方案接线指示图所示。
2.5.7. 蓝牙模块


在车模正在运行的时候,我们就可以使用蓝牙模块,将运行时需要观察的一些数据发送到电脑上,方便我们进行调试。要注意的是,该方法仅在日常调试时使用,比赛时可不要使用!
2.6. 注意事项
- 连接模块导线时注意板子上的丝印,一定不要出现正负接反的情况。
- 安装编码器与齿轮时需注意与电机齿轮、轮子齿轮平行安装,避免因不平行导致车轮旋转一周咬合力不同。
- 电机驱动板的端子、排线固定好后,建议用万用表验证一下是否有效接触。
- 全部模块安装完成之后,最好将排线整理整齐,以免车模在运行的时候将排线卷入车轮里。
2.7. 产品链接
若想进一步了解上述提及的产品,可通过以下链接进行查看:
智能车极速光电组 2K0300久久派拓展学习板 DRV8701双路驱动
TFT IPS彩屏液晶屏显示模块 LQ208BLE-M/S蓝牙主从机
3. 开发工具
3.1. 硬件设计软件
在绘制电路图时,通常会使用 Altium Designer 或 立创 EDA。关于具体版本的选择及软件的下载方法,建议通过网络搜索引擎或者公众号等途径自行查询获取。对于未曾接触过该软件的用户,B 站和 CSDN 提供了丰富的相关学习资源供初学者学习。
3.2. 搭建开发环境
3.2.1. Linux环境选择
因为龙芯2k0300久久派上搭载的有Linux系统,所以我们想要使用久久派,就需要一个Linux的开发环境,这里我推荐大家使用虚拟机(Ubuntu)或者安装WSL。
安装教程在CSND上有许多,大家可以自行搜索下载安装。
3.2.2. Linux中所需插件的安装
- 该指令用于更新Ubuntu或者WSL上的软件源,在安装新的包之前,执行该指令,能够获取更高版本的软件包,或者能够获取旧源中没有的软件包。

- 如果使用的是Ubuntu,可以安装一下上面两个包。安装完成之后,可以直接将Ubuntu中的文件拖到Windows中。

- 该指令是安装cmake,用于后续编译OpenCV以及编译项目时使用。

- 该指令是安装编译内核时对应的依赖库,这个一定要安装,不然就算其他设置好,编译时也会报错。

暂时需要的有这几个包,其他包有需要会在文章后续再给大家说,并且可能会有遗漏的包,遇到这种情况Ubuntu或者WSL都会有提示信息,会告诉你需要安装哪个包,如果实在不清楚可以来我们龙邱的技术交流询问,龙邱20届智能车综合技术交流群:228227119。
3.2.3. VSCode的安装
我们编写程序的时候,有一个方便的IDE供我们使用是很重要的,这里我推荐使用VSCode。
如果使用的是Ubuntu,那么推荐使用安装包安装VSCode,不推荐直接在Ubuntu的应用中心安装,那样安装的是阉割版的,可能会有功能缺失。
VSCode的deb包下载地址:Download Visual Studio Code - Mac, Linux, Windows
下载好包之后,在终端deb包的目录下输入指令进行安装:
![]()
后面的code_1.97.2-1739406807_amd64.deb是下载的那个安装包的包名,不一样的话,按下载的名称来就行。
- 如果使用的是WSL,可以按照下面网址中的教程进行环境配置:https://blog.csdn.net/qq_33249042/article/details/113515393
- 想要在终端启动VSCode,直接在终端输入指令code就可以了,想要进入VSCode的同时打开当前目录,需要输入code .即可。
接下来是一些使用VSCode会更加方便的插件:


插件安装方式如下:

3.2.4. 配置交叉编译工具链
- 获取交叉编译工具链,我使用的是1.3-1版本,如果想要其他版本可在官网自行下载。

交叉编译工具下载地址:https://www.loongnix.cn/zh/toolchain/GNU/

-
3.2.5. 内核编译
首先需要根据3.2.2安装所对应的依赖库。
获取内核文件,并将内核文件拷贝到指定目录下。当到手久久派后,不管是申请的还是直接在网上购买的,直接在买板子的地方都能获得内核文件。
龙芯智能车竞速组官方交流群:595018839
中科云2k0300久久派技术群:876920347
-

-

-


3.2.6. 编译移植OpenCV
-
这一步可以查看B站UP主要塞姬Ilikara的OpenCV交叉编译教程。
Ilikara交叉编译OpenCV并安装的教程:https://www.bilibili.com/video/BV1Q2zbYrEvS/
龙邱科技交叉编译OpenCV视频教程:龙芯久久派学习教程十三(OpenCV交叉编译)
- 交叉编译OpenCV前,需要先安装所需要的依赖,在龙芯官方文档《第五卷-qt相关解决方案》中有提到。
-

-
其中libjasper-dev这个包可能找不到,无法下载,直接忽略就行。
- OpenCV安装包下载路径:https://github.com/opencv/opencv/tree/4.10.0
- 可在B站搜索教程进行OpenCV进行编译移植。
- 编译移植OpenCV的最后一点步骤,我在编译完成之后使用make install将编译好的库安装到虚拟机上。



查看安装过程记录可以知道,我的OpenCV库文件安装在/usr/local/lib路径下,相关二进制文件在/usr/local/bin路径下,相关头文件在/usr/local/include/opencv4路径下。
编译安装好OpenCV之后,将安装好的lib目录中的文件和include目录中的文件,复制到久久派相同的目录下,最好是在Ubuntu或WSL还有久久派中将环境变量再添加一下。

4. 软件基础
4.1. 引脚分配
久久派引脚图表(在《龙芯2k0300处理器用户手册.pdf》中有所有引脚复用关系表):

在使用诸如按键、蜂鸣器、编码器、无线模块、TFT屏幕、ADC 采集以及电机驱动等外设时,首要步骤是明确这些设备与单片机之间连接的具体引脚配置。
学习板引脚分配表:

4.2. GPIO
GPIO是通用输入输出(General Purpose Input/Output)端口的简称。通俗来讲就是单片机可控制的引脚,芯片的GPIO引脚与外部设备连接起来,基本上所有的GPIO引脚都有输入输出功能。
最基本的输出功能是由芯片控制引脚输出高、低电平,实现开关控制,如把GPIO引脚接入到LED灯,那就可以控制LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把GPIO引脚连接到按键,通过检测电平高低区分按键是否被按下。
补充说明:所谓的驱动能力,就是指电流的能力。对于驱动大负载(即负载内阻越小,负载越大)时,例如IO输出为5V,驱动的负载内阻为10欧姆,于是根据欧姆定律可以正常情况下负载上的电流为0.5A(推算出功率为2.5W)。显然一般的IO不可能有那么大的驱动能力,也就是没有办法输出那么大得电流。于是造成的结果就是输出电压会被拉下来,达不到标准的5V。当然如果只是数字信号的传递,下一级的输入阻抗理论上最好是高阻,也就是只需要传电压,基本没有电流,也就没有功率,于是就不需要很大的驱动能力。
在我们的久久派上,有三种控制引脚输入输出的方法,下文中会详细说明。
4.3. PWM
PWM是一种用数字信号模拟模拟信号的计数,它通过在一个固定的周期内改变信号的脉冲宽度来模拟电压或电流的变化。PWM信号通常用于控制各种设备,如电机、LED灯、伺服机构等,以调整它们的输出或工作状态。PWM信号具有两个主要的参数:
- 周期/频率(Period):PWM信号的一个完整周期持续的时间,通常以微秒或毫秒为单位。电机通常选择10KHz ~ 20KHz的PWM频率,频率过低会导致噪音和发热,频率过高可能导致超过驱动芯片的相应能力;舵机通常要求50Hz ~ 333Hz,其角度由高电平脉冲宽度界定(0.5ms ~ 2.5ms)。
- 占空比(Duty Cycle):高电平状态所占整个周期的百分比,它决定了PWM信号的平均电压或电流量。
PWM信号的占空比决定了目标设备的输出特性,在智能车竞赛中,PWM是实现电机速度控制和舵机转向调节的核心技术。通过调整PWM信号的占空比,可以精确控制电机的转速和舵机的转向角度。
4.4. ADC
ADC即模拟数字转换器(Analog-to-Digital Converter),是一种能将连续变化的模拟信号转变为离散的数字信号的电子元件。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。具体的转化步骤在这里就不展开说了,如果是开发者使用,我们应该关注以下参数:
1、分辨率:表示AD对输入信号的分辨能力,及数值部分的精度。一般模拟采样中使用12位还是24位的ADC说的就是分辨率。例如:输入模拟电压的变化范围为0~3.3 V,输出12位二进制数可以分辨的最小模拟电压为3.3V / 4095≈0.806 mV;
2、转化误差:表示AD实际电压与理论电压的偏差,一般用最低有效位来表示,单位LSB,通常以相对误差的形式出现,比如相对误差≤±LSB/2,表明实际输出的数字量和理论量误差小于最低位的一半。
3、转换精度:这里一般用转化误差和分辨率来表述,具体就是AD最大量化过程中采用了四舍五入的方法及模拟处理部分的精度问题。
4、转化时间:即从信号输入开始到输出稳定的信号所经过的时间。不同的AD准换的速度不同,根据实际要求来选型。
5、工作电压和基准电压(内部或者外部基准):工作电压是AD芯片工作的额定电压,关键的是基准电压,又叫参考电压,可以来之芯片内部又或者外部接入,其决定了AD的分辨率,所有基准电压一定要稳。
4.5. GTIM控制器
龙芯 2K0300 集成了一个由 32 位自动装载计数器驱动的 GTIM。
它适用于多种应用,可配置为计数模式、输入模式和输出模式,其中输出模式包括电平输出模式和PWM模式,输入模式包括编码器接口模式和霍尔传感器模式。
在方案中就需要使用GTIM控制器的PWM模式,脉冲宽度调制模式可以产生一个由 ARR 寄存器确定频率、由 CCRx 寄存器确定占空比的 信号。
在 CCMRx 寄存器中的 OCxM 位写入 110(PWM 模式 1)或 111(PWM 模式 2),能够独立地设置 每个 OCx 输出通道产生一路 PWM。用户可设置 CCMRx 寄存器 OCxPE 位以使能相应的预装载寄 存器。 仅当发生一个更新事件的时候,被配置为预装载模式的寄存器中的配置值才可生效,因 此在计数器开始计数之前,必须通过设置 EGR 寄存器中的 UG 位来初始化所有的寄存器。
CCER 寄存器中的 CCxP/CCxE 位控制 OCx 输出极性与使能。
根据 CR1 寄存器中 CMS 位的状态,定时器能够产生边沿对齐的 PWM 信号或中央对齐的 PWM 信号。
当 CR1 寄存器中的 DIR 位为低的时候执行向上计数。以 PWM 模式 1 为例,当 CNT<CCRx 时 PWM 信号参考 OCxREF 为高,否则为低。如果 CCRx 中的比较值大于自动重装载值(ARR),则 OCxREF 保持为 1。如果 CCRx 中的比较值为 0,则 OCxREF 保持为 0。
当 CR1 寄存器的 DIR 位为高时执行向下计数。在 PWM 模式 1 时, 当 CNT>CCRx 时参考信 号 OCxREF 为低,否则为高。如果 CCRx 中的比较值大于 ARR 中的自动重装载值,则 OCxREF 保 持为 1。该模式下不能产生占空比为 0%的 PWM 波形。
对于一个给定的通道,设置 CCMRx 寄存器中对应的 OCxCE 位为 1,能够用 ETRF 输入端的高电平把 OCxREF 信号拉低,OCxREF 信号将保持为低直到发生下一次的更新事件 UEV。
该功能只能用于输出比较和 PWM 模式,而不能用于强置模式。
将 CR1 寄存器中的 OPM 位置为 1 将选择单脉冲模式,这样可以让定时器自动地在产生下 一个更新事件 UEV 时清除 CEN 位,从而停止计数。这种模式可用于让定时器响应一个激励, 并在一个程序可控的延时之后,产生一个脉宽可程序控制的脉冲。
4.6. 串口
串口即串行通信接口(Serial Communication Interface),它是一种常用的数据通信接口,用于在设备之间按位(bit)顺序传输数据。
串口通信有两根数据线,一根用于发送数据(Tx),另一根用于接收数据(Rx)。数据在传输时,按顺序一位一位地在传输线上发送或接受。通信双方需要约定相同的波特率(即传输数据速率,单位为bps,如9600bps、115200bps等)、数据位(通常为5 - 8位)、奇偶校验位(用于简单的错误检测,可选择无校验、奇校验、偶校验等)和停止位(用于标识数据帧的结束,通常为1位、1.5位或2位)等参数,以确保数据的准确传输。

应用场景:
- 设备调试:在单片机开发过程中,常通过串口将调试信息发送到电脑端的调试工具(如串口助手,这里久久派推荐使用MobaXterm进行连接),方便开发人员查看程序运行状态、变量值等信息,以进行程序调试。
- 数据传输:用于不同设备之间的数据交换,如传感器与主控板之间的色数据传输。传感器采集到的数据通过串口发送给主控板进行进一步处理。
- 与上位机通信:单片机通过串口与电脑上位机设备进行通讯。
5. 通用控制算法
5.1. PID算法简介
PID 算法是工业应用中最广泛算法之一,是一种常用的反馈控制算法,它是根据系统当前状态与期望状态之间的差异来调整控制器输出的方式。在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID 算法已经有 100 多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。PID 是 Proportional-Integral-Derivative 的缩写,分别代表比例、积分和微分三个部分。
比例(Proportional)部分根据当前误差的大小,直接按比例调整控制器输出。如果误差较大,则输出也较大。
积分(Integral)部分根据误差的累积值来调整控制器输出。它可以用来消除系统的静态误差,即当系统达到稳定状态时,误差不为零的情况。
微分(Derivative)部分根据误差的变化率来提前调整控制器输出。它可以用来预测系统的未来变化趋势,以提前调整控制器输出,避免过冲。
PID 控制算法将比例、积分和微分三个部分的输出进行线性组合,得到最终的控制器输出。通过调整三个部分的权重和参数,可以实现对系统的精确控制。

根据实际系统的特性和需求,调整 PID 控制算法中的比例、积分和微分三个部分的权重和参数,以使系统能够以最佳的性能响应和控制的过程,我们一般称之为“调参”。
在调参过程中:
Kp 过大会对误差的变化做出过大的反应,从而导致系统动作幅度过大,容易引起振荡甚至不稳定。过小意味着对误差的调整力度不足,系统达到目标值的速度变慢,响应滞后。
Kp 即使设置得较好,仅靠 Kp 控制仍会存在部分问题:
Kp 控制对持续存在的小误差没有累计作用,无法完全消除系统的稳态误差。这是因为比例控制的输出直接与当前误差成正比,而当误差较小时,调整力度可能不足。需要 Ki(积分)控制来消除这种误差。
Kp 控制对快速变化的误差反应不足,而 Kd(微分)控制可以预测误差变化趋势,帮助提高系统动态性能,避免过冲,减少超调。
5.2. 电机闭环控制
给定占空比 → 测转速 → 比较实际转速和目标转速 → 重新调整占空比,这样的过程其实就是一个闭环控制,我们发现这个过程形成了一个回环:每次调整的占空比大小都是基于上一次结果得到的。相比开环控制,闭环控制多了信息反馈环节(测电机转速),我们根据反馈信息再做出进一步调整,接着获得调整后的反馈信息,再基于更新过的反馈信息进行新一轮的调控。
6. 龙芯赛道赛项分享
下文中分享的各种功能使用,详细内容可以在B站搜索龙邱科技,观看相关系列教程。
其中部分程序参考B站Up主要塞姬llikara的Github仓库程序:https://github.com/AirFortressIlikara/ls2k0300_peripheral_library
6.1. GPIO功能
对应教程:久久派学习教程:GPIO输出模式、久久派学习教程:GPIO输入模式
6.1.1. 终端控制设备文件
通过指令可以查看到我们的GPIO设备文件:

其中export用来创建所用引脚的设备文件,unexport用来删除已创建的引脚设备文件,其余文件保存有所有引脚的信息。使用以下终端指令可以进行配置使用(以88引脚为例):

6.1.2. 程序控制设备文件
我们就可以像是对待平常的文本文件一样,使用open函数打开文件,使用read、write函数进行读写操作即可。
例如:想要实现echo 88 > /sys/calss/gpio/export这个操作,就可以先使用open函数打开文件,获取文件描述符fd。在使用open函数时记得注意第二个参数的选择:
- O_WRONLY表示只读权限;
- O_RDONLY表示只写权限;
- O_RDWR表示读写权限。
![]()
然后使用write函数将88写入打开的文件描述符fd中,注意要将写入的信息转为字符串形式写入才可以。

例如:想要实现cat /sys/class/gpio/gpio88/value这个操作,同样可以使用open函数打开之后,再使用read函数进行高低电平的读取。

6.1.3. 寄存器实现GPIO控制
久久派上的寄存器相关操作,我们可以参考官方资料《龙芯2k0300处理器用户手册》,以下简称为《处理器手册》。
想要通过硬件寄存器的方式来控制GPIO的输入输出状态,就需要了解GPIO如何复用以及配置输入输出模式需要设置的寄存器,可查看《处理器手册》的P258。
《处理器手册》的P66页以及之后几页,有说明GPIO复用寄存器的地址,以及复用为GPIO模式时寄存器应该填的值。
注意:因为久久派上搭载了Linux操作系统,所以不能像单片机一样直接访问物理地址,我们需要使用mmap函数将物理地址映射为虚拟地址,再对虚拟地址进行操作。mmap中有一个参数需要文件描述符,该描述符对应的文件是/dev/mem,该设备文件作为一个特殊的字符设备文件,代表了系统的整个物理内存空间。

6.2. PWM功能
关于PWM的使用,我们也需要了解其相关设备树的配置方法,设备树文件在内核/arch/loongarch/boot/dts/loongson路径下,相关文件有三个:loongson_2k0300_pai_99_wifi.dts、loongson_2k0300.dtsi、2k0300-pinctrl.dtsi。
以pwm0为例:
- 2k0300-pinctrl.dtsi中存放有pwm0的引脚复用信息。

- loongson_2k0300.dtsi中存放有pwm0的硬件设备信息。

- loongson_2k0300_pai_99_wifi.dts中存放对pwm0节点的引用,并对其属性进行修改和补充,能够进一步配置pwm0设备。属性status表示是否开启pwm0功能,okay代表开启,disabled代表关闭;pinctrl-0中的参数就是在2k0300-pinctrl.dtsi中的引脚复用信息。

6.2.1. 终端控制设备文件
通过指令可以查看我们的PWM设备文件:

通过对设备树的配置,会在/sys/class/pwm目录下生成对应的pwmchipx设备文件,这些设备文件中,export用来生成对应通道的文件,unexport用来删除对应通道的文件。
![]()
在生成的通道文件中,period用来配置周期,duty_cycle用来配置占空比,polarity用来配置极性,enable用来使能或失能PWM。使用终端指令可以进行配置使用(以pwmchip0为例):

6.2.2. 程序控制设备文件
同实现GPIO操作相同,也是使用open函数打开,read、write函数读写即可。
例如:想要实现echo 0 > /sys/class/pwm/pwmchip0/export这个操作,过程如下: 
例如:想要实现echo 100000 > /sys/calss/pwm/pwmchip0/pwm0/period这个操作,过程如下:
6.3. 编码器功能
使用编码器,我们可以配置久久派上PWM控制器的脉冲测量功能,我们查看《处理器手册》P224可知,久久派的脉冲测量功能检测的是编码器两个脉冲之间的脉宽,与常见单片机记录两次读取间的脉冲数是不一样的,要注意这一点。

通过CTRL寄存器对PWM控制器进行配置,通过读取Low_buffer或Full_buffer寄存器来获取两脉冲之间的脉宽。在选择好使用的PWM通道后,要确认所使用通道寄存器的地址正确,确认好控制器基地址、寄存器相对基地址的偏移量以及所配置的功能在对应寄存器的位域。

7. 视觉识别算法分享
第二十一届走马观碑赛题创新性地引入了目标板识别环节——车模需对目标板进行精准分类,并执行相应的通行策略。这对识别准确率提出了极高要求。演示车模采用YOLOv5深度学习框架训练检测模型,结合DNN推理,实现了高效、精准的实时识别效果。接下来,我们将为您详细解读模型训练的完整流程,以及在龙芯平台上的部署与推理实践。
7.1. Windows下模型训练
7.1.1. 安装Anaconda
访问 Anaconda官方下载页面,获取最新发行版并完成安装。
关键步骤:在安装向导中务必勾选"Add Anaconda to my PATH environment variable"与"Register Anaconda as my default Python"两项,可自动完成环境变量配置,省去手动设置的繁琐流程。

安装完成后,启动CMD命令行终端,执行以下指令创建独立运行环境:
conda create -n yolo python=3.9 -y
环境创建成功后,通过 conda info -e 可查看已配置的环境列表。
首次使用前需激活环境:activate yolo
重要提示:后续每次新开命令行终端,均需运行 activate yolo 指令以切换至该环境。
7.1.2. YOLOv5框架获取与依赖安装
从百度网盘下载YOLOv5源码:
链接: https://pan.baidu.com/s/1m_V8bSJwVuGeNxDq3xvcMw?pwd=t868 提取码: t868
随后使用打开YOLO-V5所在文件夹,在上面输入cmd回车,可以直接在该文件夹目录下打开命令行。

在cmd命令行打开之后,执行activate yolo切换到yolo环境下
随后运行pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
系统将自动解析并安装全部依赖项,完成后即进入模型训练准备阶段。
7.1.3. 训练数据集构建
1. 目录架构设计 新建主数据集文件夹,在其下创建两个子目录:
- images/:存放原始样本图像
- labels/:存储标注信息文件

-

将采集到的训练图片全部放入 images/ 文件夹中。
2. 标注工具配置
安装LabelImg图像标注工具:
pip install labelimg
在数据集根目录启动CMD,激活YOLO环境后执行:
labelimg
3. 标注流程标准化
启动LabelImg后,按以下步骤配置:
切换标注模式为 YOLO(关键设置,决定输出格式)
点击 "Open Dir" 指定图像路径 images/
随后提示框中选择标签存储路径 labels/

核心快捷键操作:
W:创建矩形标注框
A:上一张图像
D:下一张图像
完成框选后,输入目标类别名称。所有图像标注完毕后,labels/ 目录将生成对应的YOLO格式 .txt 标注文件,其中 classes.txt 自动汇总所有类别信息。
至此,完整的数据集准备工作已就绪,可正式进入模型训练阶段。
7.1.4. 训练环境配置与参数设置
1. 开发环境搭建
启动 VSCode,打开此前克隆的 YOLOv5 源码根目录。按下 Ctrl+Shift+P 调出命令面板,搜索并选择 "Python: Select Interpreter" 。
在解释器列表中,选择名为 yolo 的 Conda 环境(即我们之前创建的虚拟环境),确保所有依赖运行在隔离环境中。


2. 数据集结构规范
按如下架构整理数据集目录:
dataset/
├── images/
│ ├── train/ # 训练集图像
│ └── val/ # 验证集图像
└── labels/
├── train/ # 训练集标签(与images/train一一对应)
└── val/ # 验证集标签(与images/val一一对应)

关键原则:训练集与验证集的图像和标签文件必须严格对应,且分目录独立存放,避免路径冲突。
3. 配置文件定制
进入 data/ 目录,复制 coco128.yaml 文件并重命名为易于管理的名称(建议与数据集同名,如 dataset03.yaml)。


核心参数修改项:
path:数据集根目录的绝对路径
train:训练集图像路径(如 images/train)
val:验证集图像路径(如 images/val)
test:测试集路径(可选,本方案未启用)
names:按 classes.txt 中的类别顺序,以列表形式填写类别名称
7.1.5. 模型训练
1. 预训练权重准备 访问YOLOv5权重仓库YOLOv5权重文件下载,下载轻量级预训练模型yolov5n.pt。该权重基于COCO数据集训练,包含丰富的通用视觉特征。采用迁移学习策略可在小样本条件下显著加速收敛,同时提升目标检测精度。下载完成后,将权重文件置于YOLOv5项目根目录或指定路径下。
2. 训练脚本配置 使用VSCode打开YOLOv5源码中的train.py文件,定位至参数配置区域。此处提供了丰富的命令行参数选项,支持从数据路径、模型结构到训练策略的全方位自定义,为不同硬件环境与任务需求提供灵活的配置能力。

参数配置文件 train.py 中的命令行参数功能解析如下:
【核心必配参数】
| 参数 | 说明 | 推荐配置 |
| --weights | 预训练权重文件路径,决定初始参数。 | yolov5n.pt(轻量化) |
| --data | 数据集配置文件路径,定义数据集信息 | data/dataset03.yaml |
| --epochs | 训练总轮次,完整遍历训练集的次数 | 100-200(根据数据量调整) |
| --batch-size | 每批训练样本数,影响显存占用与训练效率 | 2-4(-1为自动模式) |
| --imgsz | 输入图像尺寸(像素),训练与验证统一 | 64-96(智能车建议小尺寸) |
| --device | 计算设备选择,cpu或cuda:0 | 取决于自身电脑 |
【推荐调整参数】
| 参数 | 说明 | 推荐配置 |
| --workers | 数据加载线程数,影响数据读取效率 | 0(Windows CPU训练下设为0最稳定,避免多进程崩溃) |
| --project | 训练结果保存的根目录 | runs/train(可保持默认) |
| --name | 本次训练的实验名称 | exp_ls2k(建议标注平台,如exp_win2ls) |
| --patience | 早停机制耐心值,验证集无改进时等待轮次 | 50(避免过拟合,节省训练时间) |
| --cache | 数据缓存策略,ram或disk | disk(我的主机为i7-11700,内存有限,磁盘缓存更稳妥) |
其余参数保持源码默认值,待熟悉训练流程后再行精细化调优。
3. 启动训练任务
进入YOLOv5项目根目录,于文件资源管理器地址栏输入cmd并回车,快速启动命令行终端。激活YOLO环境后,执行训练指令:python -u ".\train.py"
训练过程将实时输出日志,包括损失曲线、验证指标等信息。

4. 模型权重提取
训练完成后,最优模型将自动保存至--project指定目录(如runs/train/exp_win2ls/weights/)。进入该目录,提取best.pt文件,此即为训练所得的最优权重。将其妥善存放,后续将用于龙芯平台的模型转换与推理部署。
7.2. 模型转换
7.2.1. windows下模型转换
训练得到的.pt文件为PyTorch框架专用格式,无法直接在龙芯平台部署。需通过格式转换工具链将其转化为开放神经网络交换格式(ONNX),以实现跨平台兼容与推理加速。
1.转换环境准备
在YOLOv5项目根目录下,安装模型导出依赖库:
pip install onnx onnxruntime
pip install onnxsim
2.执行模型转换
激活YOLO环境后,运行导出脚本:
python export.py --weights best.pt --include onnx --opset 12 --imgsz 64
- 3.参数详解
--weights:待转换的PyTorch模型权重文件路径,指向训练输出的best.pt
--include:指定导出格式,onnx为通用中间表示格式,支持多平台部署
--opset:ONNX算子集版本,12为稳定兼容版本,平衡特性支持与推理兼容性
--imgsz:模型输入尺寸,必须与训练时--imgsz参数完全一致,否则会导致维度不匹配
转换完成后,将在best.pt同级目录生成best.onnx文件,该文件即为可在龙芯平台加载运行的最终模型。
7.3. 模型推理
基于已配置完成的OpenCV DNN环境,我们采用其内置的深度学习推理引擎执行模型预测。在部署前,需先明确模型的输入输出规范。使用可视化工具Netron载入导出的ONNX模型,可直观解析网络拓扑结构:

核心参数解读:
输入节点:images,数据类型为float32[1,3,64,64],表示模型接受单张RGB三通道图像输入,尺寸规范化为64×64像素
输出节点:output0,数据类型为float32[1,252,8],其中252代表预设锚框数量,每个锚框输出8维向量(含边界框坐标、置信度及5个类别概率)
完成模型解析后,即可基于C++与OpenCV DNN模块构建推理流水线,实现从图像预处理、网络前向传播到结果后处理的完整闭环。
随后我们使用C++OpenCV进行推理
百度网盘下载虚拟机:
链接: https://pan.baidu.com/s/1Dj8XznNY9I9UAIukW3UugQ?pwd=h9pu 提取码: h9pu
注:请使用网盘里“新版本VM” 的安装包更新VM为25H2版本,否则虚拟机打开可能出错
启动VSCode,载入预置的推理工程模板(路径:/home/lq/Desktop/Project/YOLO_TSET)。该模板已集成OpenCV DNN推理框架,仅需根据模型训练结果进行五项关键适配即可部署:
1. 类别数量同步
编辑Libraries/Driver/LQ_YOLO.cpp第3行,将宏定义Category_NUM修改为实际训练的类别总数。
2. 数据长度匹配
同文件第5行,更新DATA_LEN为分类数量 + 5(边框4维+置信度1维+类别概率N维),确保与模型输出张量维度一致。
3. 标签名称映射
第9-11行的类别名称数组,需严格按照训练时classes.txt中的顺序逐一定义,保证推理结果的可读性。
4. 置信度阈值调优
第36行,conf变量控制检测灵敏度,建议根据实际场景误检率微调;同步将len_data赋值为分类数量 + 5。
5. 输出层名称指定
第234行,out_name变量定义了网络前向传播时的输出节点名称,需与Netron解析的output0严格一致。若导出模型时自定义了输出层名称,须同步更新此处的字符串标识。
完成上述修改后,编译生成可执行文件,将其与导出的.onnx模型置于同一目录下,即可启动推理程序,实现端到端的检测能力。
结语:
到这里,本手册的基础篇分享暂告一段落,但我们的探索远未结束。后续将持续更新模型优化深度指南,涵盖量化压缩、性能调优等进阶流程,帮助大家将识别精度与推理效率提升至新高度。
更多教程与实战案例,敬请关注龙邱科技的B站视频账号。智能车大赛的魅力不仅在于追求胜利,更在于探索过程中的每一次自我突破。大家在参考我们方案的同时,别忘了充分发挥自己的创造力,去挖掘更多可能。
祝愿每一位同学都能在比赛中有所收获,享受智能车带来的乐趣。期待在赛场上看到你们的精彩表现,祝大家都能取得理想的成绩,加油!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐








所有评论(0)