轮足机器人
因为制作博客之前这个项目就已经做了很多了,所以就先写新的。
CAN总线通信
CAN总线通信filter
上位机是STM32H743IIT6,下位机是两个STM32F103C8T6。
重点是filter的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CAN_FilterTypeDef can_filtercfg; can_filtercfg.FilterMode = CAN_FILTERMODE_IDMASK; can_filtercfg.FilterScale = CAN_FILTERSCALE_32BIT; can_filtercfg.FilterIdHigh = 0x12<<5; can_filtercfg.FilterIdLow = 0; can_filtercfg.FilterMaskIdHigh = 0x7FF; can_filtercfg.FilterMaskIdLow = 0x06;
can_filtercfg.FilterBank = 0; can_filtercfg.FilterFIFOAssignment = CAN_FILTER_FIFO0; can_filtercfg.FilterActivation = CAN_FILTER_ENABLE; can_filtercfg.SlaveStartFilterBank = 14; while(HAL_CAN_ConfigFilter(&hcan, &can_filtercfg)!=HAL_OK);
|
我的两个电机id分别是0x12和0x13,目前只接受不发送。
CAN总线通信CPU占用
我一直担心的一点是:can通信要以2ms的频率发送一帧8个字节的标准数据帧,2ms的频率接收一帧8个字节的标准数据帧,我担心CPU会不会吃不消?
但是通过简单搜集资料:
CAN通信外设的发送和接收都是非阻塞的,也就是can通信的bit位收发都是由外设自己处理的,不经过CPU,这样就无从谈起CPU占用率。
即使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发送四个字节的pid速度环反应如下:
能看到电机启动的波动有一些增大。说明can发送可能确实会加重对线程占用的负担。。。糟糕
我打算对这个现象多搜集资料,要明确can通信对于线程占用的影响。
无刷电机PID
PID速度环
首先是速度的计算频率,经过实验,4000线的编码器最适合的速度计算周期是50ms,计算频率太小和太大都会影响速度计算。
电机低速段的编码器测速方法可能需要换,比如T法测速
,这个待查。
PID速度环我是只用了纯P控制,做到快速无超调达到目标速度。因为轮足的轮只是大致达到速度要求即可,没那么高精度要求,所以我就没加I。
其实这种平衡小车的电机应该是PD控制,确保最大的快速性,不能加I,不能让电机迟滞,这跟普通的汽车轮子是完全不一样的。
平衡PID(与平衡小车一致)
直立环+速度环
a_m1是速度环PID输出
pid_out是直立环PID输出
里面的杂点是ozone的bug,不用管。可以看到:
速度环其实是在对直立环进行抑制。