一. 简介
本篇文章将介绍如何使用FPGA实现一个直流有刷电机控制器,主要包括 速度控制 和 角度控制(好像在无刷电机控制中,习惯将其称为环,即速度环 和 角度环(位置环))。因此这是一个闭环系统,需要得到系统的反馈,实时得到电机的转速和角度,所以需要上篇中编码器模块的输出,作为控制器的反馈,通过PID进行调节。
二. 控制器框图设计
在做设计之前,最好先将功能明确下来,然后绘制简单的流程框图,当然这里先将程序实现完了之后,再绘制的流程框图 ̄□ ̄||,框图如下,主要由三大模块组成(控制姿态就不包括在里面了),角度、速度和PID模块,下面将一一介绍各个模块的具体细节。
三. PID模块
PID的原理在之前的文章中有提到过,就不再继续提起了,本次实现的方式方式和之前实现的方式一样,将PID系数扩大100倍取整,然后相乘,将得到的结果再右移7位 加速 右移 9位,约等于除以了100。
四. 速度控制器
速度控制器里面主要做期望速度的输出和电机运动方向切换的控制。期望速度主要由外部输入和方向切换来控制,如果说需要进行方向切换的话,为了保护电机,不能立马进行电机的转向,而要等待速度降低到安全速度后,再进行方向切换。
所以如果电机不需要转向,那么期望速度就是外部设置的速度。
如果需要转向的话,先将期望速度设置为0,待速度降低到安全速度后,例如5RPM,就切换方向 和 将期望速度设置为外部设置的速度。
module controller_Speed_loop(
input sys_clk_i , //时钟输入
input sys_rst_n_i , //复位输入
input c_speed_loop_en_i , //速度环使能信号
input motor_spin_dir_i , //设置旋转方向
input[15:0] motor_rpm_set_i , //设置速度
input encoder_direction_i , //电机实际的运动方向
input[15:0] encoder_speed_i , //编码器速度
output reg c_speed_loop_dir_o , //速度环方向输出
output reg[15:0] c_speed_loop_rmp_o //速度环RPM输出
);
五. 角度控制器
控制过程和速度控制过程一样,将当前角度值和期望角度值输入角度PID进行计算,然后将计算后的结果输入到速度PID进行计算,得到PWM的变化值。
这一控制回路是比较简单的,如果说需要在角度旋转的时候,还需要对速度进行控制的话,就会复杂一点点(串级),等后面有需求了再进行实现。
六. 小结
本次实现的控制器 和 上次实现的 编码器,共同组成了一个简单的电机控制器,可用于对电机的速度 和 角度进行控制。
top层的控制信号如下,在速度模式下,只需要设置rmp的值,电机就可以进行转动,而在角度模式下,需要先设置旋转的角度值,然后在使能角度旋转,电机就会旋转对应的角度后,停止。
//控制信号
.motor_mode_set_i ( motor_mode_set ), //设置电机模式 2'b00 = 速度模式 2'b01 = 角度模式
.motor_spin_dir_i ( motor_spin_dir ), //电机运动方向控制 1'b0 正向 1'b1 反向
.motor_rpm_set_i ( motor_rpm_set ), //设置电机转速 RPM
.motor_acc_set_i ( motor_acc_set ), //设置电机加速度
.motor_angle_en_i ( motor_angle_en ), //角度旋转使能
.motor_angle_ack_o ( motor_angle_ack ), //角度旋转应答
.motor_angle_set_i ( motor_angle_set ), //设置电机旋转角度
电机驱动1.0 获取,
已在MG370电机上进行验证(编码器是500线)
后面会根据需求对该版本进行完善与优化,并且会将接口封装为AXI4接口,便于作为集成到ZYNQ中进行使用。