杨兴旺, 胡黄水, 卿金晖
(长春工业大学 计算机科学与工程学院, 吉林 长春 130012)
无刷直流电机[1]广泛应用在航空航天、自动化、工农业生产等领域,所以对电机的控制精度有较高要求,PID算法由于结构清晰,可根据实际情况对被控对象实时调节,满足对电机控制的要求,故在电机控制中常采用PID控制算法进行控制。
现阶段PID控制器通常采用单片机、DSP等控制芯片实现算法[2],采用单片机实现PID控制,但受其自身计算速度限制,无法进行复杂控制算法的计算与实现;采用DSP同样可以实现PID控制,但其自身资源有限,同时需要设计大量的外围电路,这会对系统内部造成干扰影响,从而降低系统的精度。随着EDA技术的发展,FPGA芯片与其他芯片相比具有集成度高、体积小、设计电路灵活等优点,适合应用于各种场合[3-4]。文中针对传统PID控制器存在响应速度较慢、精度低等问题,设计了基于FPGA的无刷直流电机PID控制器,仿真结果表明,其具有响应时间短、精度高等优点。
PID控制器的输入是给定输出值r(t)与实际输出值y(t)之间的误差e(t),并对输入的误差e(t)进行比例、积分及微分运算,控制调节输出u(t),对无刷直流电机进行实时控制[5],其原理如图1所示。
输入误差值可表示为
e(t)=r(t)-y(t)。
(1)
连续域内的PID控制算法数学表达式
(2)
式中:Kp----比例系数;
Ti----积分系数;
Td----微分系数。
因在硬件数字电路系统是对数据进行周期性采样,无法得到需要的连续数据,很难实现积分和微分,所以需要采用离散化的方式将式(2)改写成差分方程的形式
u(k)=u(k-1)+
Kp[e(k)-e(k-1)]+Kie(k)+
Kd[e(k)-2e(k-1)+e(k-2)],
(3)
式中:u(k)----第k次采样时刻的输出值;
u(k-1)----第k-1次采样时刻的输出值;
e(k)----当前采样时刻输入与输出的误差值;
e(k-1)----上一次采样时刻输入与输出的误差值;
Kp,Ki,Kd----分别表示比例、积分和微分系数,它们是PID控制器性能的主要决定因素。
对式(3)进一步整理,可得
u(k)=u(k-1)+Δu(k)=
u(k-1)+K0e(k)+
K1e(k-1)+K2e(k-2),
(4)
式中:Δu(k)----控制量的增量;
K0,K1,K2----系数。
K0,K1,K2可通过下式求得
K0=Kp+Ki+Kd,
K1=Kp-2Kd,
(5)
K2=Kd。
通过式(5)可知,只要知道k时刻及前两个时刻的误差,即可计算出k时刻的增量,所以式(4)也可称作增量式PID控制。由于增量式PID控制算法在计算时仅与近两次的误差采样值有关,从而避免了多次的累加计算,因此占用资源较少、计算速度快,在控制领域应用广泛[6]。
通过FPGA实现PID控制器,FPGA芯片采用Altera公司 Cyclone Ⅳ系列的EP4CE115芯片,在Quartus Ⅱ 15.0中通过Verilog HDL对系统控制器进行设计,采用自顶至下的设计方案,主要分为赋值模块、误差模块、输出模块以及控制模块[7-8]。
赋值模块的目的是在程序运行前对程序中各个变量进行初始赋值与计算,如图2所示。
其中,clk表示时钟信号,rst_n表示复位信号,当复位信号为高电平时,赋值模块进行工作,在赋值模块中,对控制器中的各个参数进行估值,在赋值完成后,根据式(5)计算K0,K1,K2的值,输出A、B、C分别对应K0,K1,K2,计算完成后,将完成信号init_flag_on的值置为“1”,并送入控制模块中。
误差模块是计算给定值r(t)与输出值y(t)之间的误差值e(t),如图3所示。
其中,输入引脚rt、yt分别表示无刷直流电机的期望转速与实际转速,当接收到控制模块信号init_flag_on_ctrl为高电平时进行工作,根据式(1),计算PID控制器的误差,输出ek0、ek1、ek2分别对应式(4)中的e(k)、e(k-1)、e(k-2),计算完成后将输出完成信号error_flag_on置为高电平,并送入控制模块。
输出模块计算PID控制器的实际输出,如图4所示。
其中,输入引脚Aek0、Bek1、Cek2分别对应式(4)中的K0e(k)、K1e(k-1)、K2e(k-2),在接收到控制模块信号error_flag_crtl后,将式(4)中的各个参数进行输入计算,在计算过增量后与上一时刻的输出值进行相加,得到实际的输出yt,输出引脚yt_n将此时刻的数值送入寄存器中,以便下次计算使用,其在数值上与输出yt相同,计算完成功能,输出信号yt_flag_on置为1,送入控制模块中。
控制模块主要对赋值模块、误差模块以及输出模块进行控制,如图5所示。
输入为上述各个模块的完成信号,输出为进入下个模块的控制信号。整个PID控制器的设计采用状态机进行设计,各个模块之间的时序通过状态机控制。
程序状态机的状态迁移如图6所示。
首先对设计的各个信号变量进行初始化,全部置为低电平,当信号start_flag_on为高电平时,跳转到赋值模块,否则继续停在Idle状态;当信号init_flag_on为高电平时,表示赋值结束,此时跳转至误差模块,否则,继续在赋值模块中执行赋值程序;在误差模块中,当信号error_flag_on置为“1”时,表示计算完成,跳转到输出模块,否则一直在误差模块中进行计算,与此同时,当公式中的参数计算完成后,通过乘法IP核对公式进行计算,并作为输出模块的输入;当输入模块计算完成,将信号yt_flag_on置为高电平并跳转到Idle状态,表示一次数据计算完成,否则继续在输出模块中计算。
通过Testbench在ModelSim中对编写的程序进行仿真分析[9-10],在Testbench假设期望转速为2 000 r/min,Kp,Ki,Kd分别设置为0.5、0.3以及0.2,硬件系统时钟周期为50 MHz。
ModeSim中的电机转速仿真结果如图7所示。
图7 ModeSim中的电机转速仿真结果
其中,yt_n表示电机的转速值,通过Matlab对PID控制器的输出数据进行拟合得到的控制转速曲线如图8所示。
从图中可以看出,在0.24 s之前,无刷直流电机转速持续增加,大约在0.24 s时,电机转速达到最大值,最终大约在 0.3 s电机转速达到稳定转速值2 000 r/min。
设计了基于FPGA的无刷直流电机PID控制器,首先通过分析无刷直流电机的PID控制原理,利用FPGA实现PID控制器的设计,主要包括赋值模块、误差模块、输出模块以及控制模块,在Quartus Ⅱ中采用Verilog HDL对上述各模块编程实现,最后通过Testbench在ModelSim对程序验证分析,结果表明,采用FPGA设计的PID控制器相比于传统控制器具有响应速度快、稳定性好的优点。