Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

VHDL Stepper Motor Control

Status
Not open for further replies.

raguna

Junior Member level 3
Joined
Apr 23, 2010
Messages
30
Helped
4
Reputation
8
Reaction score
4
Trophy points
1,288
Location
Earth
Activity points
1,539
Hello all!

I have to control a stepper motor for only 180 degrees range in vhdl. When i coded for the following

0 1 0 1 0.0°
1 0 0 1 7.5°
1 0 1 0 15.0°
0 1 1 0 22.5°
0 1 0 1 30.0°
1 0 0 1 37.5°
1 0 1 0 45.0°
0 1 1 0 52.5°
0 1 0 1 60.0°
1 0 0 1 67.5°
1 0 1 0 75.0°
0 1 1 0 82.5°
0 1 0 1 90.0°
1 0 0 1 97.5°
1 0 1 0 105.0°
0 1 1 0 112.5°
0 1 0 1 120.0°
1 0 0 1 127.5°
1 0 1 0 135.0°
0 1 1 0 142.5°
0 1 0 1 150.0°
1 0 0 1 157.5°
1 0 1 0 165.0°
0 1 1 0 172.5°

with 18 states, its still rotating for complete 360deg.

can you please help me out in my logical errors in the following pgm


architecture rtl of stepper_motor is

type my_state is(idle,state0,state1,state2,state3);--,state4,state5,state6,state7,state8,state9,state10,state11,state12,state13,state14,state15,state16,state17,state18
signal present_state,next_state :my_state;

begin
process(rst,clk,en)
begin
if(rst = '1' and en='0') then
present_state <= idle;
elsif(clk='1' and clk'event and en='1') then
present_state <= next_state;
end if;
end process;
--
--process(present_state,direction,en)
--begin
--case(present_state) is
--
--when idle =>
-- next_state <= state0;
--
--when state0 =>
-- if(direction='0'and en='1') then
-- dout <= "1001";
-- next_state <= state1;
-- elsif(direction='1') then
-- dout <= "0101";
-- elsif(en='0') then
-- next_state <= present_state;
-- end if;
--
--when state1 =>
-- if(direction='0' and en='1') then
-- dout <= "1010";
-- next_state <= state2;
-- elsif(direction='1' and en='1') then
-- next_state <= state0;
-- elsif(en='0') then
-- next_state <= present_state;
-- end if;
--
--when state2 =>
-- if(direction='0'and en='1') then
-- dout <= "0110";
-- next_state <= state3;
-- elsif(direction='1'and en='1') then
-- next_state <= state1;
-- elsif(en='0') then
-- next_state <= present_state;
-- end if;
--
--when state3 =>
-- if(direction='0'and en='1') then
-- dout <= "0101";
-- next_state <= state4;
-- elsif(direction='1'and en='1') then
-- next_state <= state2;
--
-- elsif(en='0') then
-- next_state <=state3;
-- end if;
--when state4 =>
-- if(direction='0'and en='1') then
-- dout <= "1001";
-- next_state <= state0;
-- elsif(direction='1'and en='1') then
-- next_state <= state3;
-- elsif(en='0') then
-- next_state <=present_state;
-- end if;
--
----
----when state5 =>
---- if(direction='0'and en='1') then
---- dout <= "0110";
---- next_state <= state6;
---- elsif(direction='1'and en='1') then
---- next_state <= state4;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state6 =>
---- if(direction='0'and en='1') then
---- dout <= "0101";
---- next_state <= state7;
---- elsif(direction='1'and en='1') then
---- next_state <= state5;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state7 =>
---- if(direction='0'and en='1') then
---- dout <= "1001";
---- next_state <= state8;
---- elsif(direction='1'and en='1') then
---- next_state <= state6;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state8 =>
---- if(direction='0'and en='1') then
---- dout <= "0110";
---- next_state <= state9;
---- elsif(direction='1'and en='1') then
---- next_state <= state7;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state9 =>
---- if(direction='0'and en='1') then
---- dout <= "0101";
---- next_state <= state10;
---- elsif(direction='1'and en='1') then
---- next_state <= state8;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state10 =>
---- if(direction='0'and en='1') then
---- dout <= "1001";
---- next_state <= state11;
---- elsif(direction='1'and en='1') then
---- next_state <= state9;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state11 =>
---- if(direction='0'and en='1') then
---- dout <= "0110";
---- next_state <= state12;
---- elsif(direction='1'and en='1') then
---- next_state <= state10;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state12 =>
---- if(direction='0'and en='1') then
---- dout <= "0101";
---- next_state <= state13;
---- elsif(direction='1'and en='1') then
---- next_state <= state11;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state13 =>
---- if(direction='0'and en='1') then
---- dout <= "1001";
---- next_state <= state14;
---- elsif(direction='1'and en='1') then
---- next_state <= state12;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state14 =>
---- if(direction='0'and en='1') then
---- dout <= "0110";
---- next_state <= state15;
---- elsif(direction='1'and en='1') then
---- next_state <= state13;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state15 =>
---- if(direction='0'and en='1') then
---- dout <= "0101";
---- next_state <= state16;
---- elsif(direction='1'and en='1') then
---- next_state <= state14;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state16 =>
---- if(direction='0'and en='1') then
---- dout <= "1001";
---- next_state <= state17;
---- elsif(direction='1'and en='1') then
---- next_state <= state15;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state17 =>
---- if(direction='0'and en='1') then
---- dout <= "0110";
---- next_state <= state18;
---- elsif(direction='1'and en='1') then
---- next_state <= state16;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
----
----
----when state18 =>
---- if(direction='0'and en='1') then
---- dout <= "0101";
---- next_state <= idle;
---- elsif(direction='1'and en='1') then
---- next_state <= state17;
---- elsif(en='0') then
---- next_state <=present_state;
---- end if;
--
--
--end case;
--end process;
--end rtl;
--

process(present_state,direction)
begin

case(present_state) is

when idle =>
if(en='0') then
next_state<=present_state;
else next_state <= state0;
end if;


when state0 =>
dout <= "0101";
next_state <= state1;

when state1 =>
if(direction='0') then
dout <= "1001";
elsif(direction='1') then
dout <= "0110";
end if;
next_state <= state2;

when state2 =>
dout <= "1010";
next_state <= state3;

when state3 =>
if(direction='0') then
dout <= "0110";
elsif(direction='1') then
dout <= "1001";
end if;
next_state <= state0;
end case;
end process;
end rtl;

Actually, i want my stepper motor to rotate when i give enable signal and stop rotating if enable is 0. Moreover, the stepper motor should move only from 0-180degrees and should stop still in the current position if i dont give enable signal...

I would be grateful for any kind of help in this.

Regards
Raguna

Moved as new thread in PLD, SPLD, GAL, CPLD, FPGA Design section [alexan_e]
 

veiledcavalier

Member level 5
Joined
Feb 26, 2006
Messages
92
Helped
7
Reputation
12
Reaction score
4
Trophy points
1,288
Location
Alexandria-EGYPT
Activity points
1,906
Re: Stepper Motor Control

@ Raguna:
Sorry, but what is ur terminals order? A B A* B* or what?
But firstly I think to get the 7.5 deg, it is a half step
and u r applying full step sequence
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top