版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、四相步进电机定位控制系统四相步进电机定位控制系统功能概述步进电机每接收到一组脉冲数字信号,便旋转一个角度,成为步进角。不同规格的步进电机的步进角不同,这决定于其内部的线圈数量。线圈中的供应电流可以决定线圈所产生的磁场方向。假设有两组线圈A和B,如图一所示。A线圈如果提供A点低电位而A点高电位,电流由A螺旋向上流到A,形成向上的磁场方向;同理,提供B点低电位而B点高电位,电流由B螺旋流到B,形成向左的磁场方向。A和B这两组线圈形成的总磁场方向即为左上方。如果将电动机的转子置于线圈所产生的磁场中,便会受到磁场的作用而产生与磁场方向一致的力,转子便开始转动,直到转子的磁场方向与线圈的磁场方向一致为止
2、。如图二所示。由A和B两组线圈电流方向的排列组合,最多可以产生8种磁场方向,分别是0°、45°、90°、135°、180°、225°、270°、315°。这些方向的电流方向列于表一。图一 图二由表一可知,假设电动机转子刻度原先在0°的位置,想让其转到180°,就必须让端口信号依次由0001、0011、0010、0110到0100变化。但是是否有更快的办法,是否一定要经过4个信号过程呢?其实有更快更省电的方式让电动机从0°达到180°的位置。这就是所谓的激磁方式的不同。四相电动
3、机可以分为3种激磁方式。表一:四相步进电机的8个方向和电流以及电压信号的关系磁场方向0°45°90°135°180°225°270°315°电流方向A线圈B线圈AAAA0AAAAAA0AA0BBBBBB0BBBBBB端口信号000100110010011001001100100010011-相激磁法:当目标角度是90的整数倍时,采用这种方法。例如要从0转到270,只要让端口信号的顺序为0000,0001,0010,0100,1000即可。2-相激磁法:当目标角度是45而非90的整数倍时,可采用这种方法。例如要从0转
4、到225,只要让端口信号的顺序为0000,0011,0110,1100即可。1-2-相混合激磁法:按照表二中所列的信号顺序。表二:四相步进电机3种不同激磁方式对应提供的端口信号磁场方向0°45°90°135°180°225°270°315°端口信号000100110010011001001100100010011-相激磁2-相激磁1-2-相激磁四相步进电机定位控制系统的VHDL源码及注释-四相步进电机示例程序library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_
5、logic_arith.all;use IEEE.std_logic_unsigned.all;entity step_motor isport (reset:in STD_LOGIC; -系统复位信号 dir: in STD_LOGIC; -步进电机正反转方向控制开关(0:逆时针;1:顺时针) clk: in STD_LOGIC; -系统时钟(FPGA内部提供的4MHz的时钟信号) ini: in STD_LOGIC; -使能开关 manner: in STD_LOGIC_VECTOR (1 downto 0); -激磁方式的选择开关(00:自动选择激磁方式;-01:1-相激磁;10:2-相
6、激磁;11:1-2-相激磁) angle: in STD_LOGIC_VECTOR (7 downto 0); -步进角的倍数设定输入键 baBA: out STD_LOGIC_VECTOR (3 downto 0); -步进电机的状态输出end step_motor;architecture stepmotor_arch of step_motor issignal count: INTEGER range 0 to 7; -内部电路的计数累加器,用于产生输出所需对应的状态signal cntInc: INTEGER range -2 to 2; -设定累加器所需的累加/减计数值signal
7、 cntIni: INTEGER range -1 to 0; -设定累加器所需的计数初值signal angleDnCount: INTEGER range 255 downto 0; -设定步进角所需的计数次数signal angleDnCntDec: INTEGER range 2 downto 1; -设定步进角所需的累减计数值begin -步进电机方向设定电路模块该模块的功能是设定步进电机的旋转方向(顺时针或逆时针),并设定电机在顺时针转动或逆时针转动时所需的初值与累加/减值。 process(dir,manner,angle) begin if dir='0' th
8、en case manner is when "01" => -1-相激磁 cntIni<=0; cntInc<=2; angleDnCntDec<=2; when "10" => -2-相激磁 cntIni<=-1; cntInc<=2; angleDnCntDec<=2; when "11" => -1-2-相激磁 cntIni<=0; cntInc<=1; angleDnCntDec<=1; when others => -自动选择激磁方式 -angl
9、e为偶数即角度为90的倍数时,采用1-相激磁,否则2-相激磁 if (angle(0)='1') then -2-相激磁 cntIni<=-1; cntInc<=2; angleDnCntDec<=2; else -1-相激磁 cntIni<=0; cntInc<=2; angleDnCntDec<=2; end if; end case; else case manner is when "01" => -1-相激磁 cntIni<=0; cntInc<=-2; angleDnCntDec<=2;
10、-"10" when "10" => -2-相激磁 cntIni<=-1; cntInc<=-2; angleDnCntDec<=2;-"10" when "11" => - 1-2-相激磁 cntIni<=0; cntInc<=-1; angleDnCntDec<=1;-"01" when others => -自动选择激磁方式 if (angle(0)='1') then -2-相激磁 cntIni<=-1; cnt
11、Inc<=-2; angleDnCntDec<=2; else -1-相激磁 cntIni<=0; cntInc<=-2; angleDnCntDec<=2; end if; end case; end if; end process; -步进电机步进移动与定位控制电路模块该模块的主要功能是利用ini(使能开关),将数值传到该模块中,并配合输入的clk(系统时钟)作为同步控制信号,进行步进电机的步进移动与定位控制。 counting_reset: process(reset,ini, angle, clk) begin if reset='1' t
12、hen -复位低电平有效 count<=0; angleDnCount<=0; elsif clk'event and clk='1' then if ini='0' then -使能高电平有效 count<=0+cntIni; angleDnCount<=CONV_INTEGER(angle); else count <= count+cntInc; if angleDnCount > angleDnCntDec then -判断是否已到达设定位置 angleDnCount <= angleDnCount-an
13、gleDnCntDec; else angleDnCount <= 0; end if; end if; end if; end process; -编码输出电路模块该模块的功能是将count与angledncount产生的数值经过编码,并利用baBA输出连线信号,将结果输出显示。 baBA <="0000" when angleDnCount=0 else "0001" when count=0 else "0011" when count=1 else "0010" when count=2 els
14、e "0110" when count=3 else "0100" when count=4 else "1100" when count=5 else "1000" when count=6 else "1001"- when count>=7;end stepmotor_arch;四相步进电机定位控制系统的模块图四相步进电机定位控制系统的仿真结果自动模式,顺时针,旋转角为45*11的情况:自动模式,顺时针,旋转角为45*16的情况:1-相激磁,逆时针,旋转角为45*7的情况:1-相激磁
15、,顺时针,旋转角为45*7的情况:2-相激磁,逆时针,旋转角为45*17的情况:2-相激磁,逆时针,旋转角为45*17的情况:1-2-相激磁,顺时针,旋转角为45*11的情况:1-2-相激磁,顺时针,旋转角为45*8的情况:直流电机速度控制系统直流电机速度控制系统功能概述驱动电路称为桥式驱动或是H型驱动电路(如右图所示),采用的控制方法称为脉冲宽度调制法(PWM),即利用晶体管on-off(导通-不导通)进行控制的方法。使用FPGA纯数字式的控制时,假设电机速度从静止开始加速,首先Q1、Q2必须维持导通一段时间,此时电机所承受的电压约为供电电压U,称之为强加速。待速度接近目标速度时,加速可以减
16、缓,此时Q1、Q2和Q3、Q4轮流导通,只是Q1、Q2在一个周期内所导通的时间ton比Q3、Q4导通的时间toff长一些,此时称为弱加速。任何时候,电机所承受的平均电压U0可表示为U0=U*(tontoff)(tontoff)。如果速度已经达到目标,便可以调整ton和toff的时间比例使之相等,此时平均电压为零,称为定速控制。由此可知,平均电压若为正值,是加速控制;负值时是减速控制;为0时即达到匀速。当然,还涉及到确定电机目前的速度是多少,比目标速度快还是慢,也就是速度检测的问题,常用的办法是光遮断法,在此就不再论述了。在程序仿真时只简单的输入固定的速度模拟一下。直流电机速度控制系统的VHDL
17、源码及注释library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity motorctrl is port (clk: in STD_LOGIC; -FPGA内部提供的4MHZ的时钟信号 reset: in STD_LOGIC; -系统内部自复位信号 speed_now: in STD_LOGIC_VECTOR (7 downto 0); -速度检测编码器检测到的当前速度 target_speed: in STD_LOGIC_VECTOR
18、(7 downto 0); -设定电机预定达到的目标速度 th_speed: in STD_LOGIC_VECTOR (7 downto 0); -设定电机进入弱加速时的临界速度差值 pwme: out STD_LOGIC); -脉宽调制的输出,负责控制电机转动的信号end;architecture motorctrl_arch of motorctrl is-define the signal_structure and flow of the device定义内部信号signal cnt125: INTEGER range 0 to 124; -125个时钟的计数器signal cnt37
19、5: INTEGER range 0 to 374; -375个时钟的计数器signal cnt500: INTEGER range 0 to 499; -500个时钟的计数器signal dth: STD_LOGIC_VECTOR (7 downto 0); -设定电机进入弱加速时的临界值(dth=target_speed-th_speed)signal pwm: STD_LOGIC; -负责产生脉宽调制的信号,提供正确的输出-相位类型,负责产生正反转两种状态信号,用来控制电机的加速和减速phase有2种状态:状态0:phase<=phb1,电机正转(加速状态); 状态1:phase&
20、lt;=phb2,电机反转(减速状态)。type phase_type is (phB1, phB2);signal phase: phase_type;-速度类型,负责产生加速、弱加速、减速与定速4种状态信号,以控制电机的转速speeding4种状态:状态0:speeding<=upa,电机进行加速动作; 状态1:speeding<=upb,电机进行弱加速动作;状态2:speeding<=dn,电机进行减速动作; 状态3:speeding<=final,电机进行定速动作;type speeding_type is (UPA, UPB ,Dn ,final);signa
21、l speeding: speeding_type;-begin-速度控制模块该模块实现下列的控制功能:1) 如果speed_now = target_speed,则定速控制,即ton = toff = ktclk,on-off的时间均等于clk的k倍周期时间;2) 如果speed_now >= target_speed th_speed ,则进行弱加速控制,ton = (3/4)ktclk, toff = (1/4)ktclk;3) 如果speed_now < target_speed th_speed,进行强加速控制,pwme = 1;4) 如果speed_now > t
22、arget_speed,则减速控制,ton = (1/4)ktclk, toff = (3/4)ktclk;另外,方向控制通过将pwme信号的输出反向。根据上面的分析,需要3个分频器,分别产生ktclk ,(1/4)ktclk 和(3/4)ktclk的周期信号。假设时钟周期tclk为10MHz,电机频率为20kHz,因此k=10MHz/20kHz =500,(1/4)k=125,(3/4)=375,这也就是定义cnt125,cnt375,cnt500三个计数器的原因。peeding_machine: process (reset,clk)begin if reset='1' t
23、hen -复位高电平有效 speeding <= UPA; dth<="00000000" elsif (clk'event and clk='1') then dth<=target_speed - th_speed; -弱加速的临界值 case speeding is -速度控制状态机 when UPA => -情况1 if (speed_now = target_speed) then speeding <= final; elsif (speed_now > target_speed) then speed
24、ing <= Dn; elsif (speed_now < dth) then speeding <= UPA; elsif (speed_now >=dth) and (speed_now < target_speed) thenUPA加速UPB弱加速Dn减速Final匀速现速=限速speed_now = target_speed现速>弱加速临界速度&<限速speed_now >=dth & speed_now < target_speed现速>限速speed_now >target_speed现速<弱加
25、速临界速度speed_now < dth speeding <= UPB; end if; when UPB => -情况2 if (speed_now = target_speed) then speeding <= final; elsif (speed_now < dth) then speeding <= UPA; elsif (speed_now >=dth) and (speed_now < target_speed) then speeding <= UPB; elsif (speed_now > target_spee
26、d) then speeding <= Dn; end if; UPA加速UPB弱加速Dn减速Final匀速现速=限速speed_now = target_speed现速<弱加速临界速度speed_now < dth现速>限速speed_now >target_speed现速>弱加速临界速度&<限速speed_now >=dth & speed_now < target_speed when Dn => -情况3 if (speed_now = target_speed) then speeding <= fin
27、al; elsif (speed_now < dth) then speeding <= UPA; elsif (speed_now > target_speed) then speeding <= Dn; elsif (speed_now >=dth) and (speed_now < target_speed) then speeding <= UPB; end if;UPA加速UPB弱加速Dn减速Final匀速现速=限速speed_now = target_speed现速<弱加速临界速度speed_now < dth现速>限速s
28、peed_now >target_speed现速>弱加速临界速度&<限速speed_now >=dth & speed_now < target_speed when final => -情况4 if (speed_now > target_speed) then speeding <= Dn;elsif (speed_now >=dth) and (speed_now < target_speed) then speeding <= UPB;elsif (speed_now = target_speed) th
29、en speeding <= final;elsif (speed_now < dth) then speeding <= UPA;end if;UPA加速UPB弱加速Dn减速Final匀速现速=限速speed_now = target_speed现速<弱加速临界速度speed_now < dth现速>限速speed_now >target_speed现速>弱加速临界速度&<限速speed_now >=dth & speed_now < target_speed when others => null; e
30、nd case; end if;end process;-相位控制模块该模块具有下列控制功能:1) 如果希望正向转动(即Q1,Q2导通),则使用状态0:phb1;2) 如果希望反向移动(即Q3,Q4导通),则使用状态1:phb2;上面的速度设定模块只是对有关的输入信号进行判断,告知FPGA用何种模式进行速度控制,并不产生输出信号(pwm)。因此,必须设计第二个状态判别器“phase”,负责计数与产生pwm(脉宽调制)信号。phase相位控制器的设计原理如下:phb1状态为Q1,Q2开启(即pwme=1),而Q3,Q4关闭(即pwme=0)的状态,phb2状态为Q1,Q2关闭,而Q3,Q4开启。
31、三极管的开关时间依据所激活的计数器而定。phase_machine: process (reset,clk)begin if reset='1' then -复位高电平有效 cnt500 <= 0; cnt375 <= 0; cnt125 <= 0; pwm<='0' pwme<='0' phase<=phB1; elsif (clk'event and clk='1') then pwme<=pwm; case phase is when phB1 => if (speed
32、ing=UPA) thencnt375<=374;cnt125<=124;cnt500<=499;pwm<='1' -加速状态pwm恒为1,不用计数器 elsif (speeding=UPB) thencnt500<=499;cnt375<=cnt375-1;cnt125<=124;pwm<='1' -弱加速状态pwm输出为1是375个时钟,0为125个时钟 elsif (speeding=Dn) thencnt500<=499;cnt375<=cnt375-1;cnt125<=124;pwm&l
33、t;='0' -减速状态pwm输出0是375个时钟,1为125个时钟 elsif (speeding=final) thencnt500<=cnt500-1;cnt375<=374;cnt125<=124;pwm<='1' -匀速状态下,pwm输出1和0的时间均为500个时钟 else cnt500 <= 0; cnt375 <= 0; cnt125 <= 0;pwm<='0' end if;if (cnt375=0 or cnt500=0) then -计数器记满后,相位转换 cnt500<
34、=499; cnt375<=374; phase <= phB2;end if; when phB2 => if (speeding=UPA) thencnt375<=374;cnt125<=124;cnt500<=499;pwm<='1' elsif (speeding=UPB) thencnt500<=499;cnt375<=374;cnt125<=cnt125-1;pwm<='0' elsif (speeding=Dn) thencnt500<=499;cnt375<=374;c
35、nt125<=cnt125-1;pwm<='1' elsif (speeding=final) thencnt500<=cnt500-1;cnt375<=374;cnt125<=124;pwm<='0' else cnt500 <= 0; cnt375 <= 0; cnt125 <= 0;pwm<='0' end if;if (cnt125=0 orcnt500=0) then -计数器记满后,相位转换 cnt500<=499; cnt125<=124; phase <
36、= phB1;end if; when others => null; end case; end if;end process;end motorctrl_arch;直流电机速度控制系统的模块图直流电机速度控制系统的仿真结果加速情况弱加速情况匀速情况减速情况按键脉冲宽度处理电路设计原理在时钟上升沿检测按键脉冲,并设置一计数器,记录按键脉冲的持续时间。若计数器在按键脉冲变为0(即按键松开)时,计数值小于10,则按键无效,输出保持低电平;计数值大于9(计数从0开始)且小于100,则按键有效,输出一个时钟脉冲的高电平;计数值大于99,则超出按键应持续的时间,err输出高电平用以报错。VHDL
37、源程序及简要注释library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity dithering is port (clk: in STD_LOGIC; -FPGA内部提供时钟信号reset: in STD_LOGIC; -复位信号 put: in STD_LOGIC; -输入按键脉冲err: out STD_LOGIC; -错误指示(题目规定脉冲宽度可能为10100个时钟宽度,超过则报错) get: out STD_LOGIC); -输出
38、脉冲end;architecture arch of dithering issignal cnt: integer; -计数器beginprocess (reset,clk)beginif reset='1' then -复位信号高电平有效 cnt <= 0; get <= '0'err <= '0'elsif (clk'event and clk='1') then if(put='1') then -按键高电平时,计数cnt <= cnt+1;get <= '0&
39、#39;err <= '0'else -按键松开(释放)时,查看计数值if(cnt<10) then -计数值<10(即脉冲宽度小于10),按键无效get <= '0'err <= '0'elsif(cnt<100) then -计数值>10 && <100(即脉冲宽度为10100个时钟宽度之间),按键有效get <= '1'err <= '0'elseget <= '0' -计数值>=100(即脉冲宽度多于10
40、0个时钟宽度),报错err <= '1'end if;cnt <= 0;end if;end if;end process;end arch;仿真结果少于10个时钟脉冲的情况10个时钟脉冲的情况多于10个但少于100个时钟脉冲的情况多于100个时钟脉冲的情况帧同步检测电路设计原理利用一个状态机,根据收到的位宽1位的二进制序列来进行状态之间的转换,从而完成帧同步检测。状态机的状态转换如下图所示:Type0Type0Type0Type0Type0Type0000000111111达到状态5(type5)后,输出一个时钟周期的高电平。VHDL源程序及简要注释library
41、 IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity synchro is port (clk: in STD_LOGIC; -FPGA内部时钟信号 reset: in STD_LOGIC; -复位信号 put: in STD_LOGIC; -位宽1位的二进制序列输入 get: out STD_LOGIC); -检测结果输出end;architecture arch of synchro is-定义状态type synchro_type is (
42、type0, type1, type2,type3,type4,type5);signal phase: synchro_type;beginprocess (reset,clk)beginif reset='1' then -复位信号高电平有效phase <= type0;get<='0'elsif (clk'event and clk='1') then case phase is -状态机 when type0 =>get <='0' if (put='0') thenphas
43、e <= type1;elsephase <= type0; end if; when type1 =>get <='0' if (put='1') then phase <= type2;elsephase <= type1;end if;when type2 =>get <='0' if (put='0') then phase <= type3;elsephase <= type0;end if; when type3 =>get <='0
44、9; if (put='1') then phase <= type4;elsephase <= type1;end if;when type4 =>get <='0' if (put='1') then phase <= type5;elsephase <= type1;end if;when type5 =>get <='1' if (put='0') then phase <= type1;elsephase <= type0;end if;when
45、 others => null; end case; end if;end process;end arch;仿真结果赛跑计时用秒表的设计设计原理利用一个状态机,根据key的输入来进行状态之间的转换,从而完成计时及显示功能。状态机的状态转换如下图所示:图示代表输入(key)/输出(second)Type0Type0Type0Type0Type01/count1/count1/count11/count21/0其中,count指当前计数值,count1,count2分别是第二、三次按下key时记录的时间。VHDL源程序及简要注释library IEEE;use IEEE.std_logic
46、_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity stopwatch is port (clk: in STD_LOGIC; -时钟信号(为了便于仿真,假设100Hz) reset: in STD_LOGIC; -复位信号 key: in STD_LOGIC; -按键信号(已经经过防抖动和脉冲宽度处理) second: out STD_LOGIC_vector(5 downto 0); -输出记录时间end stopwatch;architecture arch of stopwatch
47、issignal c : std_logic_vector(7 downto 0); -分频计数器signal count, count1, count2 : std_logic_vector(5 downto 0); -寄存器用来暂存中间数据signal sec:std_logic; -分频后周期1s的信号-定义状态type stopwatch_type is (type0, type1, type2,type3,type4);signal phase: stopwatch_type;begindiv_sec:process(reset,clk) -分频得到周期1s的信号beginif reset='1' the
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年出版:全球市场标记蛋白总体规模、主要生产商、主要地区、产品和应用细分调研报告
- 2025年农产品期货交易合同协议
- 媒体变革中共进
- 绿色生活实践指南
- 律师的品牌打造
- 检验医学知识历年试题及答案
- 公司防洪度汛应急演练活动方案
- 2025年基层中医药面试题及答案
- 2025年国企竞聘上岗笔考试复习题库干部竞聘上岗笔考试复习题库附答案
- 信息安全应急演练方案及报告网络安全演练方案
- 员工食堂安全培训课件
- 水务行政执法培训课件
- 四川绵竹高发投资集团有限公司招聘笔试题库2025
- 阀门代加工协议书
- DB31/T 384-2014地理标志产品崇明老白酒
- 医院实验室生物安全委员会文件
- 马克思主义与社会科学方法论课后思考题答案
- 军队文职-临床医学 (军队文职)真题库-30
- 大学生职业规划大赛《化学专业》生涯发展展示
- 门岗信件收发管理制度
- 烯酸在重金属污染治理中的应用-全面剖析
评论
0/150
提交评论