轮足机器人

因为制作博客之前这个项目就已经做了很多了,所以就先写新的。

CAN总线通信

CAN总线通信filter

上位机是STM32H743IIT6,下位机是两个STM32F103C8T6。

重点是filter的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* USER CODE BEGIN CAN_Init 2 */
CAN_FilterTypeDef can_filtercfg;
can_filtercfg.FilterMode = CAN_FILTERMODE_IDMASK; //屏蔽位模式
can_filtercfg.FilterScale = CAN_FILTERSCALE_32BIT;
can_filtercfg.FilterIdHigh = 0x12<<5; //ID
can_filtercfg.FilterIdLow = 0;
can_filtercfg.FilterMaskIdHigh = 0x7FF;
can_filtercfg.FilterMaskIdLow = 0x06;

can_filtercfg.FilterBank = 0; //过滤器组0
can_filtercfg.FilterFIFOAssignment = CAN_FILTER_FIFO0;
can_filtercfg.FilterActivation = CAN_FILTER_ENABLE;
can_filtercfg.SlaveStartFilterBank = 14; //如果只使用单个CAN,可忽略此成员取值:0 ~ 27
while(HAL_CAN_ConfigFilter(&hcan, &can_filtercfg)!=HAL_OK);
/* USER CODE END CAN_Init 2 */

我的两个电机id分别是0x12和0x13,目前只接受不发送。

CAN总线通信CPU占用

我一直担心的一点是:can通信要以2ms的频率发送一帧8个字节的标准数据帧,2ms的频率接收一帧8个字节的标准数据帧,我担心CPU会不会吃不消?

但是通过简单搜集资料:

CAN通信外设的发送和接收都是非阻塞的,也就是can通信的bit位收发都是由外设自己处理的,不经过CPU,这样就无从谈起CPU占用率。

CAN通信外设模型

即使bit位的发送和接收就是走的CPU,我们经过如下计算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
CAN 通信标准数据帧包含以下部分:

• 帧起始(1 比特)。

• 11 位标识符。

• 1 位远程发送请求位(RTR)。

• 2 位控制域。

• 8 个字节的数据域,1 个字节等于 8 比特,所以数据域为 8×8 = 64 比特。

• 15 位循环冗余校验(CRC)序列。

• 1 位 CRC 界定符。

• 1 位应答位(ACK)。

• 1 位应答界定符。

• 7 位帧结束。

将各部分比特数相加:1 + 11 + 1 + 2 + 64 + 15 + 1 + 1 + 1 + 7 = 104 比特。

所以,CAN 通信发一次含八个字节的标准数据帧总共需要发 104 比特。


已知通信速率是 1M(1Mbps,即每秒 1000000 比特)。

1. 总比特数:

• 八个字节的标准数据帧总共 104 比特。

2. 耗时计算:

• 时间 = 数据量(比特数)÷ 速率。

• 耗时 = 104÷1000000 = 0.000104 秒。

综上所述,含八个字节的标准数据帧总共 104 比特,耗时 0.000104 秒。


1. 计算发送和接收一帧数据的总时间:

• 发送一帧数据耗时 0.000104 秒。

• 接收一帧数据耗时同样为 0.000104 秒。

• 总耗时为 0.000104×2 = 0.000208 秒(因为既要发送又要接收)。

2. 计算在 2ms 内处理 CAN 通信数据的时间比例:

• 2ms = 0.002 秒。

• 处理 CAN 通信数据的时间比例为 0.000208÷0.002 = 0.104。

3. 换算成 CPU 占用率:

• CPU 占用率约为 0.104×100% = 10.4% 。
也就是最差最差,CPU也只占用了10%.所以没什么好担心的,我就是完全被那个买来的破CAN上位机吓傻了。

经过实际测试:

没有加can发送的电机速度波动如下:

没加CAN发送的速度波动

加了can发送四个字节的pid速度环反应如下:

加了CAN发送的速度波动

能看到电机启动的波动有一些增大。说明can发送可能确实会加重对线程占用的负担。。。糟糕

我打算对这个现象多搜集资料,要明确can通信对于线程占用的影响。

无刷电机PID

PID速度环

首先是速度的计算频率,经过实验,4000线的编码器最适合的速度计算周期是50ms,计算频率太小和太大都会影响速度计算。

电机低速段的编码器测速方法可能需要换,比如T法测速,这个待查。

PID速度环我是只用了纯P控制,做到快速无超调达到目标速度。因为轮足的轮只是大致达到速度要求即可,没那么高精度要求,所以我就没加I。

其实这种平衡小车的电机应该是PD控制,确保最大的快速性,不能加I,不能让电机迟滞,这跟普通的汽车轮子是完全不一样的。

平衡PID(与平衡小车一致)

直立环+速度环
加了CAN发送的速度波动
  • a_m1是速度环PID输出

  • pid_out是直立环PID输出

里面的杂点是ozone的bug,不用管。可以看到:

速度环其实是在对直立环进行抑制。