1前期工作
1.1基础工作:
(1)使用控制板实现对电机调速和调相
(2)配置控制板进行CAN通信实现收发信息,以及收到信息后执行的功能
(3)配置上位机(canoe)
1.2相关外设:
(1):控制板
(2):电机
(3):任意下载器(推荐Jlink)
(4):CANoe硬件设备
(5):电源
1.3预期结果:
实现利用CANoe 上位机对电机进行多档位调速并且能够调节方向
2功能实现结果演示:
利用canoe上位机对电机进行调速调相
3开始教学实现:
3.1控制器驱动电机调速
我们可以做这样的实验,以24V直流电机为例,在电机两端接上24V的直流电源,电机会以满速转动,如果将24V电压降至2/3即16V,那么电机就会以满速的2/3转速运转。由此可知,想要调节电机的转速,只需要控制电机两端的电压即可。 而PWM调速相当于对输入电压进行了控制,从而控制电机的调速。
3.2控制板和CANoe之间进行通讯
(1)配置控制板端能够接收指定ID的报文
(2)canoe上位机中发送指定ID的报文
(3)CANoe硬件也是必不可少的;就如同用串口通讯需要有串口线一样。
如果不会用canoe建议先去bilibili看:会开车的鸟哥的:canoe从入门到精通的视频;
如果不懂can通讯也可以去看看相关资料
3.3制作canoe上位机
这里重点介绍canoe上位机
因为细讲如何去建立比较麻烦,如果不会请看教学视频,我已将自己创建的上位机置顶,我的上位机只是一个给辅助的作用,如果你想用我的上位机去控制电机,那么你要注意以下的点:
(1)报文ID一定要和控制板中程序接收程序的ID对应起来
(2) 将CAPL程序中的相关ID 也进行修改
3.3.1 CAPL中的代码:
speed:
dir:
3.3.2 keil中的主要代码
{
if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x0)
{Spindle_WriteAPI_PWMDrive_L(0x0000);}
else if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x1)
{Spindle_WriteAPI_PWMDrive_L(0x1000);}
else if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x2)
{Spindle_WriteAPI_PWMDrive_L(0x2000);}
else if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x3)
{Spindle_WriteAPI_PWMDrive_L(0x3000);}
else if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x4)
{Spindle_WriteAPI_PWMDrive_L(0x4000);}
else if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x5)
{Spindle_WriteAPI_PWMDrive_L(0x5000);}
else if(gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH==0x6)
{Spindle_WriteAPI_PWMDrive_L(0x6000);}
else
{Spindle_WriteAPI_PWMDrive_L(0x7000);}
if(gVar_CanInfoAppRx.MOTOR_DIR==0)
{ Relay_WriterAPI_ON(1);
Relay_WriterAPI_ON(2);
Relay_WriterAPI_ON(3);
Relay_WriterAPI_OFF(4);
Relay_WriterAPI_ON(5);
Relay_WriterAPI_OFF(6);
Relay_WriterAPI_OFF(7);
Relay_WriterAPI_ON(8);}
else if(gVar_CanInfoAppRx.MOTOR_DIR==1)
{
Relay_WriterAPI_ON(1);
Relay_WriterAPI_ON(2);
Relay_WriterAPI_OFF(3);
Relay_WriterAPI_ON(4);
Relay_WriterAPI_ON(5);
Relay_WriterAPI_OFF(6);
Relay_WriterAPI_ON(7);
Relay_WriterAPI_OFF(8); }
else
{}
这里面主要是两个变量:gVar_CanInfoAppRx.MOTOR_DRIVE_SWITCH、gVar_CanInfoAppRx.MOTOR_DIR 当收到外部信号发生改变时这两个变量的值也会随之改变。电机的方向我这边是通过继电器控制的。