前言
各位参赛的同学们,大家好!新的一届智能车又来临了,和往届相比,第二十届智能车大赛的赛项发生了很大的变化,极速光电组中新增了一项龙芯赛道。今天,我们将聚焦龙芯赛道,由龙邱工程师为大家带来龙芯赛道的全面讲解。讲解内容包括赛题解析,机械结构,硬件配置,软件基础与控制思路。
写这篇手册是帮助新同学快速的了解充满魅力的智能车大赛。同时,会在在这里给大家分享我们龙芯赛道的方案与调车心得。我们深知,没有绝对的最优解,但在手册里,我们会毫无保留地分享我们在龙芯赛道积累的方案经验与调车心得。希望这些内容能为大家提供一条清晰的探索思路,让大家在备赛过程中少走弯路,更加从容地应对比赛挑战。
如果大家想要探讨智能车相关话题,欢迎加入我们的 QQ 讨论群。在这里,无论是智能车的硬件设计、软件编程,还是比赛策略、技术难题,都能展开交流。
龙邱20届智能车综合技术交流群:228227119
龙芯智能车交流群:981693198
1. 组别简介
1.1. 规则信息来源
- 智能汽车竞赛官网:全国大学生智能汽车竞赛
- 卓老师CSDN博客: 《第二十届全国大学生智能汽车竞速比赛规则》
- 卓老师微信公众号推文及每篇公众号文章的评论区
1.2. 赛题要求
1.3. 规则解析
任务目标:极速光电组需在室内赛道上完成运行一周的任务,赛道元素包括路障、环岛、坡道等。
规则要点:
- 允许自行设置路标:预赛路标小于5个,决赛路标小于10个。
- 负压电机驱动:可以在STC、Infineon、NXP中选用。
- 镜头中心与地面垂直距离:龙芯赛道对这方面有限制要求,要求距离小于20厘米。
- 赛道放面:注意20届相较往届,室内赛道不再铺设赛道黑色的边缘。
需要注意:自制的电路板需在正面覆铜面展示队伍信息,包括学校名称、队伍名称、制作日期。
2. 硬件清单
2.1. 车模


针对极速光电组-龙芯赛道,在规则中限制使用四轮车模,推荐使用C车模或是B车模。C车模和B车模采用四轮结构,有较大的支撑面积,车模在行驶中更加稳定。采用双电机后驱的方式,提供了更大的扭矩,能够更快的达到较高的速度。这两个车模的转向系统经过精心设计,具有较好的转向灵活性,可以实现较小的转弯半径,适应各种弯道和曲线的要求。
2.2. 主控
第二十届极速光电组-龙芯赛道只能够使用龙芯2K0300久久派作为主控平台。
2.3. 硬件模块
2.3.1. 模块清单及基本作用介绍
为了更加方便大家的学习,我们在这里给大家提供了一个方案,能够让大家更快速的上手学习,所需要的模块在下面的表格中都列举了出来。
是否需要自制 | ||||
否 | ||||
是 | ||||
高帧率USB摄像头 | 1 | 实时提供赛道信息 | 是 | 否 |
512线mini编码器 | 2 | 检测电机转速以实现速度闭环控制 | 是 | 否 |
DRV8701双路驱动 | 1 | 驱动车模上的两个电机 | 是 | 是 |
摄像头支架 | 1 | 支撑摄像头 | 是 | 否 |
1.8寸TFT-SPI屏幕 | 1 | 调试工具,用来显示数据 | 是 | 否 |
C车模/NewB车模 | 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. 龙芯赛道学习套件
龙邱科技根据上方提供的方案,为极速光电组-龙芯赛道所需要的一些模块整合为了学习套件,方便有需要的同学进行购买。学习套件中包括有除车模外,上述表格中的所有模块,大家也可按照学习套件中的模块自行购买。
2.4. 龙芯赛道方案接线指示图
2.5. 硬件连接
2.5.1. 高帧率USB摄像头
在龙芯2k0300久久派上使用USB摄像头需要根据官方文档《第五卷-qt相关解决方案》先配置内核。在龙芯板卡的内核中配置好,使其支持USB摄像头后,直接将摄像头插到龙芯板卡上就可以直接使用了。
龙邱会将所用到的文件为大家整理出来,放入到龙邱的Gitee仓库中,其他相关资料以及其它组别资料也都会分类放入其中,大家可以持续关注一下。
龙邱Gitee仓库地址:龙邱科技 (lq-tech) - Gitee.com
2.5.2. 舵机的连接
龙邱的C车模上使用的是S-U400舵机,NewB车模上使用的是S-D7舵机,不管是那款舵机,连接方式都是一样的,对应连接到龙邱的龙芯拓展版左上角有丝印标注舵机1的位置,舵机上棕色/黑色线代表负极,连接到拓展板对应GND引脚。中间红色线代表正极,连接到拓展板对应ADJ引脚;舵机上黄色/白色线代表PWM信号线,连接到拓展板对应IO88引脚。
2.5.3. STC无刷电机驱动的连接
其中:
1、电源输入口,外接3S电池,供电电压11-13V;
2、无刷电机连接端口,接无刷电机三相电源线;
3、外部信号输入接口,外界输入信号;
4、下载及串口接口,可通过此接口下载程序;
5、复位按键,下载程序或复位程序使用;
6、RGB彩色指示灯。
STC无刷电机驱动中控制口引脚从左到右依次是GND、5V、PWM。与龙邱的龙芯拓展版从右到左的引脚一一对应,可直接对应连接。
2.5.4. 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.5 512线mini编码器
编码器是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。按照工作原理编码器可分为增量式和绝对式。
绝对式编码器的每一个位置都对应一个确定的数字码,它的示值只与测量的起始和终止位置有关,与测量的中间过程无关,如角度编码器。
增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,本例程使用的是此类编码器。
正交AB相512线编码器通过两个信号线的输出脉冲进行数据处理,一个输出脉冲信号就对应一个增量位移,编码器每转动固定的位移s,就会产生一个脉冲信号,通过读取单位时间t的脉冲信号的数量,便可以达到测速的效果(v=s/t),通过对脉冲信号的累加,和编码器码盘的周长便可以达到计算路程的功能(s=d0+d1+...)。编码器的线数,是说编码器转一圈输出多少个脉冲,如果一个编码器是512线,说明这个编码器转一圈对应的信号线会输出512个脉冲,AB两相转一圈发出的脉冲数一样的,不过存在90°相位差。
编码器反馈回脉冲信号,定时器引脚接收脉冲信号,通过AB信号的差异判断是正值还是负值,脉冲信号值会在定时器中累计,直到手动清除,所以每次读取编码器值后需要清除累计值,才可以或者速度值。细心的读者可能会发现,相同转速下编码器值读取大小与读取时间间隔有关,读取时间间隔越大,累计值越大,读取到的值也回越大。
连接方式如下图所示:
2.5.6. 1.8寸TFT-SPI屏幕
方案中采用的是TFT显示屏,TFT即薄膜晶体管,是一种有源矩阵液晶显示技术。TFT 技术通过为每个像素点配备一个独立的薄膜晶体管,实现对像素点的精确控制,从而能够呈现出清晰、鲜艳的图像和色彩。与传统的无源矩阵液晶显示相比,TFT 具有响应速度快、对比度高、视角广等优点。屏幕分辨率为128*160,尺寸为1.8寸。
屏幕显示接口采用SPI通信方式,不同的是屏幕不需要返回数据到主机,所以只需要用到一跟数据线(DI),但采用的是标准的SPI协议。
连接方式按照下文中龙芯赛道方案接线指示图所示,连接完成如下图所示:
2.5.7. 陀螺仪
陀螺仪在智能车中的应用:
- 与转向环串级使用,达到更好的控制效果。
- 调整平衡车姿态,使车身平衡且能正常转向和前进。
- 作为角度环闭环控制的输入。
- 积分角度作为元素状态切换条件,例如确定环岛的进环、环内、出环时机。
陀螺仪主要由加速度计与陀螺仪两部分组成,加速度计用于测量物体的加速度,陀螺仪用于测量物体的角速度。通过对加速度和角速度的测量,可以推导出物体的角位移。简单来说就是可以读取物体的偏移角度,以及移动的加速度。可以通过程序处理得到物体的欧拉角以及移动加速度。
使用时,将SDA、SCL、3V3、GND四个引脚,与龙邱的龙芯拓展版对应连接即可,连接位置可看下文中龙芯赛道方案接线指示图所示。
2.5.8. 蓝牙模块
在车模正在运行的时候,我们就可以使用蓝牙模块,将运行时需要观察的一些数据发送到电脑上,方便我们进行调试。要注意的是,该方法仅在日常调试时使用,比赛时可不要使用!
2.6. 注意事项
- 连接模块导线时注意板子上的丝印,一定不要出现正负接反的情况。
- 安装编码器与齿轮时需注意与电机齿轮、轮子齿轮平行安装,避免因不平行导致车轮旋转一周咬合力不同。
- 电机驱动板的端子、排线固定好后,建议用万用表验证一下是否有效接触。
- 全部模块安装完成之后,最好将排线整理整齐,以免车模在运行的时候将排线卷入车轮里。
3. 开发工具
3.1. 硬件设计软件
在绘制电路图时,通常会使用 Altium Designer 或 立创 EDA。关于具体版本的选择及软件的下载方法,建议通过网络搜索引擎或者公众号等途径自行查询获取。对于未曾接触过该软件的用户,B 站和 CSDN 提供了丰富的相关学习资源供初学者学习。
3.2. 搭建开发环境
3.2.1. Linux环境选择
因为龙芯2k0300久久派上搭载的有Linux系统,所以我们想要使用久久派,就需要一个Linux的开发环境,这里我推荐大家使用虚拟机(Ubuntu)或者安装WSL。
安装教程在CSND上有许多,大家可以自行搜索下载安装。
3.2.2. Linux中所需插件的安装
1.该指令用于更新Ubuntu或者WSL上的软件源,在安装新的包之前,执行该指令,能够获取更高版本的软件包,或者能够获取旧源中没有的软件包。
2. 如果使用的是Ubuntu,可以安装一下上面两个包。安装完成之后,可以直接将Ubuntu中的文件拖到Windows中。
3.该指令是安装cmake,用于后续编译OpenCV以及编译项目时使用。
4. 该指令是安装编译内核时对应的依赖库,这个一定要安装,不然就算其他设置好,编译时也会报错。
暂时需要的有这几个包,其他包有需要会在文章后续再给大家说,并且可能会有遗漏的包,遇到这种情况Ubuntu或者WSL都会有提示信息,会告诉你需要安装哪个包。
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,可以按照下面网址中的教程进行环境配置:WSL嵌入式开发系列教程 4 —— 安装VS code_wsl安装vscode-CSDN博客
- 想要在终端启动VSCode,直接在终端输入指令code就可以了,想要进入VSCode的同时打开当前目录,需要输入code .即可。
- 接下来是一些使用VSCode会更加方便的插件:
插件安装方式如下:
3.2.4. 配置交叉编译工具链
1.获取交叉编译工具链,我使用的是1.3-1版本,如果想要其他版本可在官网自行下载。
交叉编译工具下载地址:龙芯 GNU 编译工具链 | 龙芯开源社区
1.解压交叉编译工具链,放置到/opt目录下,也可自己指定解压目录
tar -xvf loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz -C /opt
2. 配置环境变量
Vi /etc/profile # 打开环境配置文件
3. 打开prifile文件后,在最后添加上下面几条指令。
# 设置交叉编译工具链
export PATH=$PATH:/opt/loongson-gnu-toolchain-x86_64-loongarch64-linux-gnu/bin/
# 设置系统架构
export ARCH=loongarch64
# 设置交叉编译工具前缀
export CROSS_COMPILE=loongarch64-linux-gnu-
4.配置完成之后,按下Esc,然后按下Shift + : ,接着输入wq,回车退出。
source /etc/profile # 重新加载配置文件
随后在终端输入一下指令:
source /etc/profile # 重新加载配置文件
3.2.5. 内核编译
1\首先需要根据3.2.2安装所对应的依赖库。
2\获取内核文件,并将内核文件拷贝到指定目录下。当到手久久派后,不管是申请的还是直接在网上购买的,直接在买板子的地方都能获得内核文件或者在龙芯智能车竞速组官方交流群、中科云2k0300久久派技术群中获取内核文件
tar -xvf linux-4.19-0802.tar.gz # 解压内核压缩包
cd linux-4.19 # 进入内核SDK根目录
3\拷贝首先需要根据3.2.2安装所对应的依赖库。
cp arch/loongarch/configs/loongson_2k300_defconfig .config
tar -xvf linux-4.19-0802.tar.gz # 解压内核压缩包
cd linux-4.19 # 进入内核SDK根目录
4\下面这个指令是用来清理内核的,可以先执行一下
make clean ARCH=loongarch CROSS_COMPILE=loongarch64-linux-gnu- -j8
5\进入图像化界面配置内核。
make menuconfig ARCH=loongarch
单独编译设备树。
make ARCH=loongarch dtbs
编译内核。
make vmlinuz ARCH=loongarch CROSS_COMPILE=loongarch64-linux-gnu- -j8
3.2.6. 编译移植OpenCV
这一步可以查看B站UP主要塞姬Ilikara的OpenCV交叉编译教程。
Ilikara交叉编译OpenCV并安装的教程:
交叉编译OpenCV前,需要先安装所需要的依赖,在龙芯官方文档《第五卷-qt相关解决方案》中有提到。
sudo apt-get update
sudo apt-get install libopencv-dev python3-opencv
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
其中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还有久久派中将环境变量再添加一下。
# 指定库文件路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
# 指定C程序头文件路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/opencv4
# 指定C++ 程序头文件路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/opencv4
#指定二进制文件路径
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. 龙芯赛道赛项分享
6.1. GPIO功能
对应教程:久久派学习教程:GPIO输出模式、久久派学习教程:GPIO输入模式
6.1.1. 终端控制设备文件
通过指令可以查看到我们的GPIO设备文件:
其中export用来创建所用引脚的设备文件,unexport用来删除已创建的引脚设备文件,其余文件保存有所有引脚的信息。使用以下终端指令可以进行配置使用(以88引脚为例):
echo 88 > /sys/class/gpio/export # 产生88号引脚设备文件
echo “out” > /sys/class/gpio/gpio88/direction # 设置GPIO为输出模式
echo 1 > /sys/class/gpio/gpio88/value # 设置GPIO为高电平
echo 0 > /sys/class/gpio/gpio88/value # 设置GPIO为低电平
echo “in” > /sys/class/gpio/gpio88/directopm # 设置GPIo为输入模式
cat /sys/class/gpio/gpio44/value # 查看当前引脚的高低电平
echo 88 > /sys/class/gpio/unexport # 删除GPIO88设备文件
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为例):
echo 0 > /sys/class/pwm/pwmchip0/export # 导出节点
echo 0 > /sys/class/pwm/pwmchip0/unexport # 取消导出
echo 100000 > /sys/class/pwm/pwmchip0/pwm0/period # 设置周期
echo 10000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 设置占空比
echo “normal” > /sys/class/pwm/pwmchip0/pwm0/polarity # 设置极性(也可用inversed)
echo 1 > /sys/calss/pwm/pwmchuo0/pwm0/enable # 开启(写0则关闭)
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通道后,要确认所使用通道寄存器的地址正确,确认好控制器基地址、寄存器相对基地址的偏移量以及所配置的功能在对应寄存器的位域。
结语:
到这里,这篇手册分享就结束了,智能车大赛的魅力不仅在于追求胜利,更在于探索过程中的每一次自我突破。大家在参考我们方案的同时,别忘了充分发挥自己的创造力,去挖掘更多可能。
祝愿每一位同学都能在比赛中有所收获,享受智能车带来的乐趣。期待在赛场上看到你们的精彩表现,祝大家都能取得理想的成绩,加油!