Basys3 ve Step motor.

Başlatan MC_Skywalker, 30 Ekim 2015, 22: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.

Kod Seç

----------------------------------------------------------------------------------
-- 
CompanyMC_Skywalker
-- EngineerMC_Skywalker
-- Create Date26.10.2015 20:56:55
-- Module Namestepmotor Behavioral
-- Project NameStep Motor Driver Demo
-- Target DevicesXC7A35T
-- Tool VersionsVivado 2015.3
-- DescriptionUDN 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(15girişine
end stepmotor
;
-- 
Davarnışla Step motor sürme XC7A35T nin (W15clock 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 / (SYS_CLK_PERIOD);

             
signal counterstd_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

30 Ekim 2015, 23:31:23 #2 Son düzenlenme: 30 Ekim 2015, 23:48:08 MC_Skywalker
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

02 Kasım 2015, 23:30:31 #5 Son düzenlenme: 02 Kasım 2015, 23:32:59 alicavuslu
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
);



alicavuslu

02 Kasım 2015, 23:51:43 #7 Son düzenlenme: 03 Kasım 2015, 00:01:52 alicavuslu
Bence kendi kodumuzu yazmaya çalışırsak daha anlaşılır olur.

mesaj birleştirme:: [time]03 Kasım 2015, 19:55:03[/time]

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

mesaj birleştirme:: 03 Kasım 2015, 00: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

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

18 Nisan 2017, 00:08:00 #12 Son düzenlenme: 18 Nisan 2017, 15:40:48 MC_Skywalker
Step motor döndürmeden önce bir DC motoru PWM benzeri sinyal elde ederek döndürmek.

Kod Seç

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

22 Nisan 2017, 17:57:44 #13 Son düzenlenme: 22 Nisan 2017, 18:03:35 MC_Skywalker
işin içine duty kontrolu katarsak




https://youtu.be/41wp0sONiIY