FPGA实现直流电机驱动(速度位置控制)-FPGA开源项目社区-FPGA CPLD-ChipDebug

FPGA实现直流电机驱动(速度位置控制)

一. 简介

本篇文章将介绍如何使用FPGA实现一个直流有刷电机控制器,主要包括 速度控制 和 角度控制(好像在无刷电机控制中,习惯将其称为环,即速度环 和 角度环(位置环))。因此这是一个闭环系统,需要得到系统的反馈,实时得到电机的转速和角度,所以需要上篇中编码器模块的输出,作为控制器的反馈,通过PID进行调节。

 

二. 控制器框图设计

在做设计之前,最好先将功能明确下来,然后绘制简单的流程框图,当然这里先将程序实现完了之后,再绘制的流程框图 ̄□ ̄||,框图如下,主要由三大模块组成(控制姿态就不包括在里面了),角度、速度和PID模块,下面将一一介绍各个模块的具体细节。

图片[1]-FPGA实现直流电机驱动(速度位置控制)-FPGA开源项目社区-FPGA CPLD-ChipDebug

   

三. 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中进行使用。

 

请登录后发表评论