Quick Start
新建博文命令
1hexo new 这是一篇新的博文
More info: Writing
新建标签页命令
1hexo new page 新建的标签页
More info: Writing
本地预览
1hexo cl && hexo s
More info: Server
推送更新上线
1hexo cl && hexo g && hexo d
More info: Generating
More info: Deployment
指导文档 文档
可能在学习排序算法的时候会有一个疑惑,无论是c 还是
c++都已经提供了sort函数,为什么还需要花大量的时间去学习排序算法,
还不如把时间都用在学习别的算法上,但是这个想法是片面的
虽然接下来要学的排序算法,在以后做题的一半以上都不会用到,但是不要单纯的想着往后做题会用到他们.
这些算法思想将会伴随着我们学习后面的知识,比如, 堆排序中的贪心思想,
归并排序中的分治思想,
快速排序中的递归思想等等,这些算法能起到预习的作用,后续学习的相应的算法使能够更加的得心应手
除了算法思想,我们在学习这些算法的过程中,还会锻炼:
如何处理写代码时的细节问题, 如何优化算法, 遇见bug如何调试,
分析时空复杂度等等.
后续所有的排序算法, 考虑的都是升序的情况. 只要能搞懂原理,
逆序也是一样的
洛谷排序模板题: https://www.luogu.com.cn/problem/P1177
插入排序
Insert Sort 插入排序类似于玩扑克牌的理牌(插牌)过程:
每次将一个待排序的元素按照关键字大小插入到前面已经有序的序列中,
按照这种方式将所有元素全部插入完成即可
样例代码
1234 ...
哈希表的概念
哈希表的定义 - 什么是哈希表?
哈希表 hash table, 又称散列表,
是根据关键字进行访问的数据结构
这里的关键字的意思就是要使用哈希表中存储的东西,
比如哈希表中存储着字母, 那么关键字就是字母(详细的例子就在后面)
哈希表建立了一种关键字和存储地址之间的映射关系,
这使得每个关键字与结构中的唯一存储位置相对应
在理想情况下, 在散列表中进行查找的时间复杂度为O(1),
即与表中的元素个数无关
其实我们在日常生活中已经不知不觉的使用过哈希表的思想了
案例: 统计一下字符串s = “abcabcc” 中, 每个字符的出现的次数,
字符串只包含小写字母
其实很简单, 我们创建一个大小为 26 的 cnt 数组, 因为只包含小写字母,
所以26就可以放下所有的字母, 我们假想这个 cnt 数组中的每个格子分别是 a 到
z 这 26 个字母. 而每个格子的数字大小就代表了这个字母出现的次数 然后遍历
s, 拿 s 中的每一个字母减去’a’ 得到一个位置 pos(其实就是 ascll 码值相减),
这个 pos 就是这个字母的位置, 最后我们将这个位置 ...
开环与闭环
开环控制是最朴素的控制,
闭环控制是引入了反馈量的控制模式
一个经典的例子是, 一个电机在旋转, 如果开环控制, 因为他没有反馈的获取,
所以如果你用手抓住它, 电机不知道它被抓住了, 电机的力不会改变,
电机就会被你给抓停; 对应的, 如果是闭环控制,
电机会获得一个阻力变大了的反馈, 电机就知道自己被挡住了,
于是根据这个反馈值加大它转动的力度, 实现就算你抓住了它,
它也能继续转动的效果
理解PID
你是超人,手里(隔空)托着一个 1kg
的物块。你唯一能操纵的量是你手臂的力 F
这个力 F 就是控制系统里的控制量, 执行机构是你的手臂, 被控系统是物块,
而物块的位置, 速度是它的系统状态
你想让物块去到某个位置或者稳稳悬停住, 但你不能直接设定位置,
只能通过不断的调 F 来间接实现. 这就是控制问题的本质,
你能控制的东西(F)和你想要的结果(位置)之间隔着一层物理
物块 1kg, 我们来受力分析看看:
重力 G = mg = -10N
空气阻力 F阻 = kv = -v (系数 k 取-1)
手臂力 F
牛二:
ma = F + G + kv
代入 ...
在这个实验中, 电机将 CAN反馈报文发送给 A 板之后, A
板通过串口将信息发送给电脑, 在电脑上看 A
板串口的图像以此知道电机的状态
CubeMX配置
元件与引脚对应关系
24V电源输出控制引脚PMOS: PH2~PH5, 电路原理图中高电平供电
CAN1: PD0, PD1 在APB1总线上
UART2: PD5, PD6 在A板预留蓝牙接口处
配置 CAN1 参数,
并且打开接收中断
再开启USART2设置为异步, 开启中断, 开启 DMA,
配置正确参数
Clion
正确的包含 bsp
文件(byRobowalker)
导入库 123456/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "drv_bsp.h" #include "drv_can.h" #include "dvc_serialplot.h" /* USER CODE END Includes */
...
电机反馈报文是 0x200 + 电调 ID 如电调 ID 为 1, 该标识符为 0x201
***
我们算一算一条 CAN 总线上最多能挂载几个电机 我们可以看到发送频率是
1KHz 一条 CAN 线最高 1Mbps.
首先算一帧标准帧多少数据位: - 裸帧:
SOF(1) + 仲裁11 + 控制6 + 数据64 + CRC15 + CRC界定符1 + ACK2 + EOF7 =
108 bit - 帧间隔(IFS): 3 bit -
位填充(bit stuffing): CAN 每连续 5 个同电平位要插 1
个反相位, 从 SOF 到 CRC 序列结束这段(SOF + 仲裁 + 控制 + 数据 +
CRC)参与; 后面的 CRC界定符, ACK, EOF, IFS 是固定格式, 不参与填充.
那么总共是98bit 参与位填充, floor((98 - 1) / 4) = floor(97 / 4) = 24,
也就是说位填充最坏有 24bit - 实际最坏占用大约 108 + 3 + 24 = 135
bit左右
那么根据 CAN 总线的带宽和发送的频率, 再结合每一帧标准帧最坏 ...
利用 UART, 单片机向电脑端发送数据,
实现指定函数值绘制并显示灯状态
利用 UART 电脑端向单片机发送指令让单片机点亮 LED
LED1: PG1, 原理图中低电平点亮 UART2: PD5 PD6, 在 A
板预留蓝牙接口
时钟树 HSE 配置为 12M 不要忘记
CubeMX
配置LED1:
PG1
配置 UART2, 记得开
DMA
生成代码
代码
把我们要用到的板级支持包 User目录从 GitHub 仓库拷过来.
记得做如下修改
导入库 123456/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */#include <string.h>#include "drv_bsp.h" #include "drv_uart.h" /* USER CODE END Includes */
定义用户变量 123456/* Private variables ------------- ...
接线
手册在我的仓库中也有 ***
CAN通信
请首先分清楚两个不同的概念: CAN ID 和电调 ID CAN ID
是大疆在手册中已经定好了的, 发送控制报文的时候, CAN ID
有两个固定的值0x200 和 0x1ff 电调 ID
是在电调是上我们手动去改的 ID
CAN通信波特率为1Mbps, 一条CAN总线上可以允许有多个电调, 其电调 ID
各不相同
单片机通过标准数据帧控制电调进而控制电机,
我们主要写的就是数据段的内容, 也就是下面表格的数据域
帧的 CAN ID 有两个 0x200 或0x1ff, 这两个是发送帧;
同样电机也会反馈他们的状态给你, 电机给你反馈的帧就是反馈帧, 它的 CAN ID
是 0x201~0x208 这个是根据电机电调 ID 来确定的, 比如电调 ID 是 1,
那么反馈帧就是 0x201, 电调 ID 是 2 反馈帧就是 0x202以此类推
0x200 分管电调 ID 为 1-4 的设备, 0x1ff 分管电调 ID 为 5-8 的设备,
具体看官网手册即可
帧的数据长度(DLC) 为 8 字节
控制电流范围 -1638401638 ...
Robomaster 赛事的电机采用 1Mbps 的 CAN 通信协议,
详细的各个电机种类技术手册请参考官网https://bbs.robomaster.com/wiki/20204847/804051
电机是利用电磁相互作用, 把电能转换为机械能的一种装置
电机有定子和转子两部分, 定子固定,
转子旋转用来输出机械能
按通电属性分:
电机可以分为直流电机和交流电机
直流电机 通电电流不会反向, 但大小可以改变,
这种电机输入直流电即可控制
交流电机 利用交流电驱动,
需要输入适当频率的交流电
按有无电刷分:
电机可分为有刷电机和无刷电机
有刷电机 磁体在定子上, 线圈和转子相连.
通过电刷和换向器实现控制电机转动方向, 防止电机转 180°
之后通过相同电流会反向, 从而实现连续转动. 但是由于需要电刷去刷换向器,
机械磨损较大, 因此寿命较短, 但控制方式简单并且成本低廉
无刷电机 线圈在定子上, 磁体和转子相连.
通过改变电流大小和方向实现控制电机转动方向. 不需要电刷,
因为可以通过变化的电流使磁体与通电的线圈产生的磁场之间产生相互作用实现连续转动.
相对而言, 该 ...















