基于fpga的无刷直流电机控制软件篇之霍尔信号.docx

上传人:b****5 文档编号:29952865 上传时间:2023-08-03 格式:DOCX 页数:10 大小:129.76KB
下载 相关 举报
基于fpga的无刷直流电机控制软件篇之霍尔信号.docx_第1页
第1页 / 共10页
基于fpga的无刷直流电机控制软件篇之霍尔信号.docx_第2页
第2页 / 共10页
基于fpga的无刷直流电机控制软件篇之霍尔信号.docx_第3页
第3页 / 共10页
基于fpga的无刷直流电机控制软件篇之霍尔信号.docx_第4页
第4页 / 共10页
基于fpga的无刷直流电机控制软件篇之霍尔信号.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

基于fpga的无刷直流电机控制软件篇之霍尔信号.docx

《基于fpga的无刷直流电机控制软件篇之霍尔信号.docx》由会员分享,可在线阅读,更多相关《基于fpga的无刷直流电机控制软件篇之霍尔信号.docx(10页珍藏版)》请在冰豆网上搜索。

基于fpga的无刷直流电机控制软件篇之霍尔信号.docx

基于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个检测脉冲来启动和清零计数器。

仿真图:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1