Basys3 ve Step motor.

Başlatan MC_Skywalker, 30 Ekim 2015, 19:44:23

MC_Skywalker

Elimde bir gün denerim diye almış olduğum UDN5804 entegresi ve dağtığım bir printerden kalma 5V lik step motor var.

bu üçlüyü kullanıp bir yeşler yapayım dedim. lakın kafam karıştı kaldı. kod yapısını kuaramadım gitti.

----------------------------------------------------------------------------------
-- Company: MC_Skywalker
-- Engineer: MC_Skywalker
-- Create Date: 26.10.2015 20:56:55
-- Module Name: stepmotor - Behavioral
-- Project Name: Step Motor Driver Demo
-- Target Devices: XC7A35T
-- Tool Versions: Vivado 2015.3
-- Description: UDN 5804 ile step motor kontrol
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
-- 
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity stepmotor is
    Port ( clk : in STD_LOGIC;                              --FPGA clock girişi 100MHz
           yon : out STD_LOGIC;                             --Dönüş yönü çıkışı(14)
           pulse : out STD_LOGIC);                          --UDN 5804 OE pini(15) girişine
end stepmotor;
-- Davarnışla Step motor sürme XC7A35T nin (W15) clock girşinde alınan 100Mhz bölnüp 1Hz elde edilecek
-- Yetkiseç 1 ise işlem yalıpacak 

architecture Behavioral of stepmotor is
             constant SYS_CLK_PERIOD : integer := 10; -- ns cinsinden
             constant NEW_CLK_PERIOD : integer := 100_000_000; -- ns cinsinden
             constant CLK_COUNT : integer := NEW_CLK_PERIOD / (2 * SYS_CLK_PERIOD);

             signal counter: std_logic_vector(3 downto 0):= "0000";
             signal clk_new : std_logic := '0';
             signal count : integer range 0 to 99999999 := 0;

begin
          process(clk)
             begin
               if clk= '1' and clk'event then
                 if count = CLK_COUNT - 1 then
                     count <= 0;
                     clk_new <= not clk_new;
                 else
                count <= count + 1;
              end if;
                 end if;
           end process;
           
        process(clk_new)
          begin
            if rising_edge(clk_new) then
                 if (yetkisec = '1') then
end process;

end Behavioral;

alicavuslu

Hocam öncelikle tasarımından bahsedebilir misiniz? Daha önce step motor ile alakalı çalışmadım. FPGA entegreyi mi sürecek? Yoksa direk motora mı bağlanacak? Entegreyi sürecekse protokol ne olacak?

Bu konularda bilgi verebilir misiniz?

MC_Skywalker

#2
Entegeyi sürecek.  Protokol yok.
3 anahtarı kullanamyı düşündüm. Yön seçimi, Adım seçimi ve enable.  bu anahtarlala ilgili kara verme mantığını kuramadım.

EN anattarı 1 ken işlemler yapılmasını düşündüm. diğer anahtarları nasıl sorgulayacağım.  şimdilik amaçsız sağa sola döndürüsem yeter sonrasın zamanla.



http://pdf1.alldatasheet.com/datasheet-pdf/view/55137/ALLEGRO/5804.html

alicavuslu

Hocam çok zaman ayıramadım kusura bakmayın. O zaman sizinle öncelikli olarak PWM kodu oluşturmaya çalışalım. İşin ana kısmı o gibi duruyor.

MC_Skywalker

evet orayı çözem lazım.  hızlanma ve yavaşlama konusuna baktım kafam iyice karıştı. birde şu anahtarlar için sorgulama

alicavuslu

#5
Aslında güzel bir çalışma olacak. Hemde port map kavramını uygulamış oluruz. Bende step motor konusunda tecrübe kazanırım :)

Port yapımız aşağıdaki gibi uygun olur mu? Hızlanma işlemini nasıl yapacağız bu konuda bilgi verirseniz sevinirim.

port(
in_clk : in std_logic;
in_rst : in std_logic;
in_en : in std_logic;
in_sw_yon : in std_logic;
in_sw1 : in std_logic;
out_en : out std_logic;
out_yon : out std_logic;
out_sw1 : out std_logic;
out_pwm : out std_logic
);


MC_Skywalker

#6
şu dökümanı anlamaya çalışıyorum


https://eewiki.net/pages/viewpage.action?pageId=4096117

alicavuslu

#7
Bence kendi kodumuzu yazmaya çalışırsak daha anlaşılır olur.

mesaj birleştirme:: 03 Kasım 2015, 19:55:03

Soru : Hızlanma PWM doluluğuna göre mi ayarlanıyor yoksa frekansına göre mi?

mesaj birleştirme:: 02 Kasım 2015, 21:01:52

Soru : Sekilde 1-100 Hz yazan kısım sabit mi olacak yada bu aralıkta değişecek mi?

MC_Skywalker

1-100hz motorun adım açısına göre sanırım hesaplayacağız

maksimum devir * puls/ hız çözünürlüğü-1 * hızlanma diye anladım

alicavuslu

O zaman bu değer bizim için sabit olacak. Sisteme constant olarak girebiliriz. Peki PWM doluluğu değişken mi olacak?

MC_Skywalker

#10
IC datasını okuyurum. çözünce yazarım
http://www.seas.upenn.edu/~robo2008/labs/StepperDriver.pdf

MC_Skywalker

Motor hakkında doğru bilgi bulamadım. 30 RPM gibi değerler var internette
18 derce açısı olduğunu varsayrak her adım arası 0,1ms çıkıyor.  360 derece dönmek için 20 adım atması gerekiyor.


MC_Skywalker

#12
Step motor döndürmeden önce bir DC motoru PWM benzeri sinyal elde ederek döndürmek.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity PWMsi is
   port(clk    : in std_logic;       
        en     : in std_logic;                       
        output : out std_logic);
end PWMsi;

architecture Behavioral of PWMsi is

begin
    process(en,clk)
    variable i : integer :=0;
        begin
        if en ='1' then
        if clk'event and clk ='1' then
        if i <= 2010000 then 
        i := i + 1;  
        output <= '0';      
        elsif i > 2000000 and i < 3000000 then 
        i := i + 1; 
        output <= '1'; 
        elsif i = 3000000 then 
        i := 0; 
        end if; 
        end if; 
        end if;
        end process;
end Behavioral;






https://youtu.be/fDac7tS8UAA
https://www.youtube.com/watch?v=fDac7tS8UAA

MC_Skywalker

#13
işin içine duty kontrolu katarsak




https://youtu.be/41wp0sONiIY