Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 24 mar 2026, o 23:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 25 paź 2015, o 17:22 
Offline
Nowy

Dołączył(a): 04 maja 2015
Posty: 4
Pomógł: 0

Witam,
Projektuje sterowniki do unipolarnego sterowania silnikami krokowymi do frezarki CNC sterowanej z programu Mach3 (step/dir). Ze względu na małą dostępność gotowych aplikacji dla prądów >3A i nieograniczone możliwości zmian postanowiłem zastosować procesor ATMega8 i podwójny mostek H na mosfetach IRFPZ44.
Napisałem banalny program, który wydaje się działać bardzo dobrze, ale brakuje mi pomysłu na rozwiązanie jednego problemu. Mianowicie kiedy z komputera przychodzą impulsy step w jakiejś tam częstotliwości układ przełącza kombinacje tranzystorów zasilając odpowiednio cewki silnika. Problem powstaje gdy impulsy chwilowo nie dochodzą (dana oś nie jest w użyciu) - wtedy ostatnio użyta kombinacja cały czas zasila jedną lub dwie cewki silnika (sterowanie półkrokowe), przez uzwojenie płynie stały prąd o dużym natężeniu i silnik oraz tranzystory się grzeją, a nie ma takiej potrzeby gdyż śruby napędowe będą zamocowane na stałe. Nie wiem w jaki sposób najlepiej wykryć brak przychodzących impulsów wyzwalających przerwanie INT0.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Próbowałem od przepełnienia timera0 w stałym interwale czasowym generować następne przerwanie, które będzie sprawdzało stan pinu INT0 i jeżeli jest on niewysterowany przez okres dłuższy niż okres przy najmniejszej używanej częstotliwości silnika będzie wprowadzało zmienną step w krok nr 9 - wszystkie klucze niewysterowane, ale nie mogę dobrać częstotliwości wyzwalania tego przerwania tak, aby zawsze "trafiało" w ewentualne pojawienie się sygnału step na pinie INT0.
Badanie czy zmienna step pozostaje bez zmian przez jakiś okres czasu też wydaje się być nie najlepszym rozwiązaniem bo ona może się zmieniać ale akurat mogę trafić dwukrotnie przypadkowo na tą samą wartość. W jaki sposób można rozwiązać ten problem tak, aby rozwiązanie zawsze się sprawdzało bez względu na częstotliwość sygnału STEP ?

Z góry dzięki za każde sugestie odnoście programu, pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 paź 2015, o 12:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

może w tym while() daj sobie jakąś zmienną volatille uint8_t timeout++; którą zerujesz sobie w obsłudze przerwania, a w tym while dodatkowy warunek że if(timeout>=xx) step=9;


Autor postu otrzymał pochwałę

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 paź 2015, o 23:42 
Offline
Nowy

Dołączył(a): 04 maja 2015
Posty: 4
Pomógł: 0

i to jest rozwiązanie :) Dzięki piękne !



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 01:16 
Offline
Nowy

Dołączył(a): 04 maja 2015
Posty: 4
Pomógł: 0

@edit: Mam jeszcze jeden problem - dodałem opcję pomiaru prądu na rezystorze między źródłami mosfetów a masą wzmocnionego przez op amp. Wszystko działa pięknie do wartości ~400, potem na wyświetlaczu pojawiają się krzaki i cały wyświetlacz się wysypuje. Skąd to ograniczenie ?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 22:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

W przerwaniu
Kod:
ISR(TIMER0_OVF_vect) //struktura przerwania wyzwalanego przepelnieniem timera 0 (raz na 1024 * (255-250) = 5120 cykli)
masz
Kod:
if(z==9) LCD_Clear();
...
LCD_GoTo(0,0);
LCD_WriteText(adcbuf1);
LCD_GoTo(0,1);
LCD_WriteText(adcbuf2);

:o

Chyba powinieneś poczytać o zasadach tworzenia kodu dla przerwań ...

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 23:32 
Offline
Nowy

Dołączył(a): 04 maja 2015
Posty: 4
Pomógł: 0

zamieniłem i dokładnie ten sam problem...nie wiem czy ten program można napisać dobrze.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO