基础理论
电机是利用电磁相互作用把电能转化成机械能的一种装置,电机有定子与转子两部分,定子固定,转子可以转动来输出机械能。
电机一般需要搭配电机驱动器或电子调速器(电调)以便更好使用。这两种元件可以把我们单片机输出的控制信号通过一定规则(通信协议或电平格式)转换成直接驱使电机转动的控制电流或电压。
电机分类
- 通电属性
- 直流电机:通电电流不会反向,但大小可以改变,这种电机输入直流电即可控制
- 交流电机:利用交流电驱动,需要输入适当频率的交流电
- 有无电刷
- 有刷电机:磁体在定子上,线圈和转子相连。通过电刷+换向器实现控制电机转动方向,防止电机转半周后通相同的电流会反向,从而实现连续转动。由于需要电刷去刷换向器,机械磨损较大,因此寿命较短,但控制方式简单,成本低
- 无刷电机:线圈在定子上,磁体和转子相连。通过改变电流大小和方向实现控制电机转动方向。不需要电刷,因为可以通过变化的电流使磁体与通电的线圈产生的磁场之间产生相互作用控制转动。相对而言,该电机寿命长,但控制方式难度大且成本高
RM中常见电机
电机参数
- 额定电压 (V):电机安全工作的标准电压,确保稳定运行。
- . 电流参数 (A):
- 额定电流:额定负载下的工作电流。
- 空载电流:无负载时的电流(克服内部摩擦损耗)。
- 堵转电流:转子堵转时的最大电流(无反电动势,易过热)。
- 转速参数 (rpm):
- 额定转速:额定电压及负载下的稳定转速。
- 空载转速:无负载时的最高转速(反电动势≈输入电压)。
- 最大转速:允许的机械/电气极限转速(受电压、摩擦限制)。
- 扭矩参数 (N·m):
- 额定扭矩:额定电流产生的有效输出扭矩(与电流正相关)。
- 堵转扭矩:堵转时的最大扭矩(电流最大,理论峰值)。
- 减速比:理想下转速降为1/x,扭矩增x倍;实际因摩擦/效率损失略低。
- 最大效率:最优负载点的能量转换效率(损耗最小)。
- 阻容感参数:绕组电阻(影响发热)、电感(影响响应)、电容(交流电机特性)。
- 转矩常数 (Kt):单位电流产生的扭矩(N·m/A)。
- 转速常数 (Ke):单位电压对应的空载转速(rpm/V或V·s/rad)。
- 最大绕组温度:绝缘材料的安全限值,超温易损坏。
关键关系:
- 转速∝电压(反电动势平衡时),扭矩∝电流(磁场与电流交互)。
- 减速箱:牺牲转速换扭矩,实际效率<100%。
- 堵转工况:电流与扭矩最大,需短时保护。
电机控制方式
- 3508电机需要借助C620电调来控制电流,进而实现转动
- CAN通信为1Mbps
- CAN总线上可以允许有多个电调
- 单片机的CAN通信控制电调进而控制电机(通过标准数据帧进行进行控制)
- 帧的CAN ID为0x200或0x1ff,与电调的CAN ID有关
- 帧的数据长度为8字节
- 每个电调的CAN ID是不一样的,需要在硬件上进行配置
- 不同的CAN ID决定了电调获取了单片机发出控制信号对应的数据帧之后,对数据段哪几处进行处理并转化为电调需要给电机提供的电流
- 不同的CAN ID决定了电调反馈给单片机的反馈信号对应的数据帧的CAN ID,以便单片机加对不同电机运动状态的掌握,以及进一步控制(反馈相关内容在PID应用时讲述)
- 电调的CAN ID不可以相同,否则会有冲突。
- 用于向电调发送控制指令控制电调的电流输出,两个标识符(0x200和0x1FF)各自对应控制4个ID的电调。控制电流值范围-16384 ~ 0 ~ 16384,对应电调输出的转矩电流范围 -20 ~ 0 ~20A
C620电调硬件配置
- 用于向电调发送控制指令控制电调的电流输出,两个标识符(0x200和0x1FF)各自对应控制4个ID的电调。控制电流值范围-16384 ~ 0 ~ 16384,对应电调输出的转矩电流范围 -20 ~ 0 ~20A
- 电调连接好电源和电机
- 用牙签类似的尖锐物体戳如图位置SET表示上方的小洞,内涵一个按键
- 短按一次进入配置CAN ID模式,此时灯灭
- 每按一次进入配置CAN ID模式,此时灯灭
- 短按n次则电调的ID为n,对应CAN报文ID为0x200+n,n在1到8之间
- 长按一次进入自动校准模式
- 此时电机会自动旋转一定的角度,无需干预电机
- 一定时间后灯变绿则正常
- 如果一定时间之后灯变红闪烁,则设备损坏
项目示例
-
元件与引脚对应关系
24V电源输出控制引脚PMOS:PH2~PH5,电路原理图中高电平则供电
CAN1:PD0、PD1,在APB1总线上
CAN2:PB12、PB13,在APB1总线上 -
配置Cube
Serial Wire 、外部时钟、时钟树
24V电源和CAN通信对应引脚配置
CAN参数
-
配置keil
keil里记得打开C99,打开C++指令–cpp11,关闭编译优化,使能Reset And Run
引入c文件,包含h文件路径
尝试编译,删除非法位置(因为bsp的文件有一些配置没有使能找不到条目) -
代码编写
利用板级支持包
利用CAN接口
编写主程序
#include "drv_bsp-boarda.h"
#include "drv_can.h"
void NULL_Call_Back(Struct_CAN_Rx_Buffer *Struct_CAN_Rx_Buffer)
{
}
BSP_Init(BSP_DC24_LU_ON | BSP_DC24_LD_ON | BSP_DC24_RU_ON | BSP_DC24_RD_ON);
CAN_Init(&hcan1,NULL_Call_Back);
int16_t torque = 0;
while (1)
{
while(torque < 1000)
{
torque += 50;
CAN1_0x200_Tx_Data[0] = torque >> 8;
CAN1_0x200_Tx_Data[0] = torque;
CAN_Send_Data(&hcan1,0x200,CAN1_0x200_Tx_Data,8);
HAL_Delay(50);
}
while(torque > -1000)
{
torque -= 50;
CAN1_0x200_Tx_Data[0] = torque >> 8;
CAN1_0x200_Tx_Data[0] = torque;
CAN_Send_Data(&hcan1,0x200,CAN1_0x200_Tx_Data,8);
HAL_Delay(50);
}
我们把世界看错,反说它欺骗了我们。 —泰戈尔