通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。
一、设计思路
前面通过SOPC之NIOS Ⅱ实现电机转速PID控制(调用中断函数)对电机实现了PID控制,然后就可以按照其设计方式将上层的C语言实现的PID控制部分等全部转换成Verilog代码,最终实现纯RTL进行PID控制。
在前文中,电机PWM控制,电机方向和编码器值的获取,卡尔曼滤波是通过Verilog语言编写,而电机速度控制、PID控制是通过Nios Ⅱ系统中的软件部分实现的,因此需要编写电机速度模块,实现对电机PWM控制模块传入速度信息;编写PID控制模块,实现对电机速度模块速度的校正。
Nios Ⅱ中采用Avalon总线对各个底层Verilog代码进行读取和写入数据,因此也要对电机控制,电机方向和编码器值获取相关代码进行修改。
按照思路画出大概框图如下:

二、PWM控制模块
在前文PWM模块中由于需要Avalon总线的控制,因此有片选信号、片选地址、读写地址等变量,而转为纯RTL后只需要输入方向以及PWM值就可以,因此需要对前文代码进行修改
reg motor_movement; // 电机运动,1为开始、0为停止
reg motor_direction; // 电机转向,1为向前、0为向后
reg motor_fast_decay; // 电机减速,1为快制动、0为慢制动
always @(posedge clock or negedge reset_n)
begin
if (~reset_n)
begin
// PWM
high_dur <= 0;
total_dur <= 0;
// MOTOR
motor_movement <= 1'b0;
motor_direction <= 1'b1;
motor_fast_decay <= 1'b1;
end
else if (en)
begin
total_dur <= 32'd2500;
high_dur <= speeddata;
{motor_fast_d

本文详细描述了如何将电机控制、PWM、编码器值获取和PID算法转换为纯硬件描述语言(RTL),通过NiosⅡ与Verilog实现电机转速PID控制,结合卡尔曼滤波和编码器数据处理,最终实现精确的电机速度控制。
最低0.47元/天 解锁文章
8501

被折叠的 条评论
为什么被折叠?



