2.0 电机反馈 - 实验篇

在这个实验中, 电机将 CAN反馈报文发送给 A 板之后, A 板通过串口将信息发送给电脑, 在电脑上看 A 板串口的图像以此知道电机的状态


CubeMX配置

元件与引脚对应关系

  • 24V电源输出控制引脚PMOS: PH2~PH5, 电路原理图中高电平供电
  • CAN1: PD0, PD1 在APB1总线上
  • UART2: PD5, PD6 在A板预留蓝牙接口处

配置 CAN1 参数, 并且打开接收中断Pasted image 20260712183452 Pasted image 20260712183520

再开启USART2设置为异步, 开启中断, 开启 DMA, 配置正确参数Pasted image 20260712183833

Clion

正确的包含 bsp 文件(byRobowalker)Pasted image 20260712184751

导入库

1
2
3
4
5
6
/* Private includes ----------------------------------------------------------*/  
/* USER CODE BEGIN Includes */
#include "drv_bsp.h"
#include "drv_can.h"
#include "dvc_serialplot.h"
/* USER CODE END Includes */

定义变量

1
2
3
4
5
6
7
/* Private variables ---------------------------------------------------------*/  

/* USER CODE BEGIN PV */
Class_Serialplot serialplot;
int16_t Rx_Encoder, Rx_Omega, Rx_Torque, Rx_Temperature;
float Tx_Encoder, Tx_Omega, Tx_Torque, Tx_Temperature;
/* USER CODE END PV */

定义回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Private user code ---------------------------------------------------------*/  
/* USER CODE BEGIN 0 */
void CAN_Motor_Call_Back (Struct_CAN_Rx_Buffer *Rx_Buffer)
{
uint8_t *Rx_Data = Rx_Buffer->Data;
switch (Rx_Buffer->Header.StdId)
{
case (0x201):
{
Rx_Encoder = (Rx_Data[0] << 8) | Rx_Data[1];
Rx_Omega = (Rx_Data[2] << 8) | Rx_Data[3];
Rx_Torque = (Rx_Data[4] << 8) | Rx_Data[5];
Rx_Temperature = (Rx_Data[6]);
}
break;
}
}
/* USER CODE END 0 */

使能一个电源接口, CAN, UART , 设置 CAN

1
2
3
4
5
6
7
/* USER CODE BEGIN 2 */  
BSP_Init(BSP_DC24_LU_ON);
CAN_Init(&hcan1, CAN_Motor_Call_Back);
Uart_Init(&huart2, NULL, 0, NULL);
CAN_Filter_Mask_Config(&hcan1, CAN_FILTER(13) | CAN_FIFO_1 | CAN_STDID |CAN_DATA_TYPE, 0x201, 0x7ff);
serialplot.Init(&huart2, 0, NULL);
/* USER CODE END 2 */

主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Infinite loop */  
/* USER CODE BEGIN WHILE */
while (1)
{
Tx_Encoder = Rx_Encoder;
Tx_Omega = Rx_Omega;
Tx_Torque = Rx_Torque;
Tx_Temperature = Rx_Temperature;

serialplot.Set_Data(4, &Tx_Encoder, &Tx_Omega, &Tx_Torque, &Tx_Temperature);
serialplot.TIM_Add_PeriodElapsedCallback();
TIM_UART_PeriodElapsedCallback();

HAL_Delay(0);
/* USER CODE END WHILE */

烧录代码, 看到串口绘图如下: Pasted image 20260712202600