基于fpga的无刷直流电机控制软件篇之霍尔信号.docx
- 文档编号:29952865
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:10
- 大小:129.76KB
基于fpga的无刷直流电机控制软件篇之霍尔信号.docx
《基于fpga的无刷直流电机控制软件篇之霍尔信号.docx》由会员分享,可在线阅读,更多相关《基于fpga的无刷直流电机控制软件篇之霍尔信号.docx(10页珍藏版)》请在冰豆网上搜索。
基于fpga的无刷直流电机控制软件篇之霍尔信号
基于fpga的无刷直流电机控制软件篇之霍尔信号)
————————————————————————————————作者:
————————————————————————————————日期:
霍尔信号根据在电机安装位置的不同,有2种不同的时序图,分别是60度和120度。
这个要根据电机的厂家提供的资料。
我这次选型的电机是60度。
时序图如下:
s1-s6分别对应6个状态,每一个状态的电气角度是60度。
霍尔信号在这里不仅要用来换向。
还要用测速,提高电机控制系统的测速反馈。
先来说换向。
s1-s6代表6个状态,每个状态对应6个开关管的开启和关闭。
上图为6个状态对应霍尔信号逻辑电平和对应6个开关管的开关逻辑状态。
软件部分这里很好处理,简单的状态机就可以实现了。
但是,不要忘记我们的集成模块是dvr8312,它的控制接口为pwm_apwm_b,pwm_crst_a,rst_b,rst_c,并不是对应6个开关管。
这是dvr8312手册上给出的用常规6个开关管信号的逻辑图。
我们就按手册的来。
程序如下:
`timescale1ns/1ps
modulePWM_ctrl(clk,rst_n,
pwm_ah,pwm_bh,pwm_ch,
rst_an,rst_bn,rst_cn,
hall_a,hall_b,hall_c
);
inputclk;
inputrst_n;
inputhall_a; //三相霍尔信号
inputhall_b;
inputhall_c;
outputpwm_ah; //a相输出
outputpwm_bh; //b相输出
outputpwm_ch; //c相输出
outputrst_an; //rst_a输出
outputrst_bn; //rst_b输出
outputrst_cn; //rst_c输出
//---------------------------------------------------------------------
//霍尔换相分为6状态每状态只有2相通电
// s1 s2 s3 s4 s5 s6
//hall_a 1 1 1 0 0 0
//hall_b 0 0 1 1 1 0
//hall_c 1 0 0 0 1 1
//pwm_ah 1 1 0 0 0 0
//pwm_al 0 0 0 1 1 0
//pwm_bh 0 0 1 1 0 0
//pwm_bl 1 0 0 0 0 1
//pwm_ch 0 0 0 0 1 1
//pwm_cl 0 1 1 0 0 0
//----------------------------------------------------------------------
reg[2:
0]hall1;
reg[2:
0]hall2;
regpwm_ahr;
regpwm_bhr;
regpwm_chr;
regpwm_alr;
regpwm_blr;
regpwm_clr;
//reg [9:
0]ctrl_reg;
reg pwm_reg;
reg[9:
0]cnt;
parameterctrl_reg=200;
always@(posedge clkornegedgerst_n)
if(!
rst_n)begin
pwm_reg<= 1'b0;
cnt<=10'b0;
end
elsebegin
if(cnt<=ctrl_reg)
pwm_reg<=1'b1;
elsepwm_reg<=1'b0;
end
always@(posedgeclkornegedgerst_n)
if(!
rst_n)cnt<=10'b0;
elsecnt<=cnt+1'b1;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)begin
hall1<=3'b0;
hall2<=3'b0;
end
elsebegin
hall1<={hall_a,hall_b,hall_c};
hall2<=hall1;
end
//------------------------------------------------------------------------
always@(posedgeclkornegedgerst_n)
if(!
rst_n)begin
pwm_ahr<=1'b0;
pwm_bhr<=1'b0;
pwm_chr<=1'b0;
pwm_alr<=1'b0;
pwm_blr<=1'b0;
pwm_clr<=1'b0;
end
elsebegin
case(hall2)
3'b101:
begin
pwm_ahr<=pwm_reg;
pwm_bhr<=1'b0;
pwm_chr<=1'b0;
pwm_alr<=1'b0;
pwm_blr<=pwm_reg;
pwm_clr<=1'b0;
end
3'b100:
begin
pwm_ahr<=pwm_reg;
pwm_bhr<=1'b0;
pwm_chr<=1'b0;
pwm_alr<=1'b0;
pwm_blr<=1'b0;
pwm_clr<=pwm_reg;
end
3'b110:
begin
pwm_ahr<=1'b0;
pwm_bhr<=pwm_reg;
pwm_chr<=1'b0;
pwm_alr<=1'b0;
pwm_blr<=1'b0;
pwm_clr<=pwm_reg;
end
3'b010:
begin
pwm_ahr<=1'b0;
pwm_bhr<=pwm_reg;
pwm_chr<=1'b0;
pwm_alr<=pwm_reg;
pwm_blr<=1'b0;
pwm_clr<=1'b0;
end
3'b011:
begin
pwm_ahr<=1'b0;
pwm_bhr<=1'b0;
pwm_chr<=pwm_reg;
pwm_alr<=pwm_reg;
pwm_blr<=1'b0;
pwm_clr<=1'b0;
end
3'b001:
begin
pwm_ahr<=1'b0;
pwm_bhr<=1'b0;
pwm_chr<=pwm_reg;
pwm_alr<=1'b0;
pwm_blr<=pwm_reg;
pwm_clr<=1'b0;
end
default:
;
endcase
end
assignrst_an=pwm_ahr|pwm_alr;
assignrst_bn=pwm_bhr|pwm_blr;
assignrst_cn=pwm_chr|pwm_clr;
assignpwm_ah=pwm_ahr;
assignpwm_bh=pwm_bhr;
assignpwm_ch=pwm_chr;
//-----------------------------------------------------------------------------
endmodule
如果要换向的话,只需要改变状态切换顺序就可以。
这里就不详细说了。
简要说明,软件思路,计数器计数,pwm_reg为经过控制算法处理后的控制量,和计数器进行比较,如果小于输出高电平,大于输出低电平。
仿真图如下:
占空比为50%时。
可以明显看到每个换向状态只有2个管开,而且分别对应一上一下。
具体计数器的位数选择我会在以后的系统连接中作说明。
没有整个系统的联系这个位数是无法确定的。
位数也同样决定了时钟频率。
作为电机控制的2个环路之一速度环。
这里采用霍尔信号进行测速。
再来看霍尔的时序图
一次高电平对应180度的电气角度。
如果对高电平进行计数,计数值就对应180度的电气角度。
计数时间就是时钟周期与计数值的积,这就得到电气速度。
相对应机械角度要查看电机的磁极对数,电气速度/磁极对数就是相应的机械速度。
利用霍尔信号测速的方法有分两种。
一种就是如我之前说的对高电平计数,还有一种就是固定一个时间内对霍尔信号的高电平计数。
同样也可得到速度。
这部分我参考了很多资料。
最后选用一种对2相霍尔信号取与非,得到一个一个霍尔开关状态下的高电平,用计数器对这个高电平计数的方法。
这部分具体效果如果只能等实际测定后才能下结论。
程序如下:
odulespeed_get(clk,rst_n,hall_a,hall_b,speed
);
inputclk;
inputrst_n;
inputhall_a;
inputhall_b;
//inputhall_c;
output[15:
0]speed;
reghall_ar1,hall_ar2;
reghall_br1,hall_br2;
//reghall_cr1,hall_cr2;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)begin
hall_ar1<=1'b0;
hall_ar2<=1'b0;
hall_br1<=1'b0;
hall_br2<=1'b0;
end
elsebegin
hall_ar1<=hall_a;
hall_ar2<=hall_ar1;
hall_br1<=hall_b;
hall_br2<=hall_br1;
end
wirehall_speed=hall_ar2&&(~hall_br2);
reghall_speed1;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)begin
hall_speed1<=1'b0;
end
elsebegin
hall_speed1<=hall_speed;
end
wirehall_neg=hall_speed1&&~hall_speed;
wirehall_pos=~hall_speed1&&hall_speed;
reg[15:
0]cnt_speed;
reg[15:
0]speed_reg;
reg[1:
0]state;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)begin
cnt_speed<=16'b0;
state<=2'b00;
end
elsebegin
case(state)
2'b00:
begin
if(hall_pos)state<=2'b1;
elsestate<=1'b0;
end
2'b01:
begin
cnt_speed<=cnt_speed+1'b1;
if(hall_neg)
state<=2'b11;
elsestate<=2'b01;
end
2'b11:
begin
speed_reg<=cnt_speed;
cnt_speed<=16'b0;
state<=2'b00;
end
default:
state<=2'b00;
endcase
end
assignspeed=speed_reg;
endmodule
对于这个高电平,我做了边沿检测处理,用这2个检测脉冲来启动和清零计数器。
仿真图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 fpga 直流电机 控制 软件 霍尔 信号