Witam
Od dłuższego czasu pracuję nad własnym sterownikiem bramy przesuwnej. Może ktoś pamięta jak stawiałem pierwsze kroki w tym kierunku
W zeszłym roku opracowałem teraźniejszą wersję sterownika - dodałem SOFT-START, SOFT-STOP (wykorzystując PWM). I wszystkie aktualne problemy kręcą się w zasadzie w okół tego.
Po pierwsze, nie mogę ustawić częstotliwości PWM większej niż aktualne ok 200Hz. Efekt jest taki, że uC się prawdopodobnie resetuje (staje w miejscu brama, nie mam możliwości debugowania
). Co istotne, gdy sterownik pracuje bez obciążenia (silnik podlaczony, ale działający na biegu jałowym) to wyższa częstotliwość nie wpływa na pracę. Wydaje mi się, że to problem zakłóceń, może źle prowadzonych ścieżek zasilania. Aktualny projekt płytki jest poniżej. Czy przeprojektowanie płytki, prowadzenie odpowiednio mas (z wyszczególnieniem PGM), podzielenie płytki na część sterującą i wykonawczą (większa odległość "prądów" silnika - dwie płytki połączone tulejkami w "kanapkę") czy też dodanie dodatkowych kondensatorów filtrujących?
Drugi problem. Zacznę może od opisu zagadnienia. SOFT-STOP działa na podstawie pomiaru czasu. Mam z góry wprowadzoną ilość czasu jaką pokonuje brama. Dobrane jest to tak, aby brama ładnie przed końcem wyhamowała i delikatnie weszła w gniazdo. Czas jest odmierzany przez Timer. Problem jest taki, że po włączeniu zabezpieczenia przeciążeniowego (na podstawie ADC - włączenie polega na ustawieniu progu zadziałania innego niż maksymalny). Różnica w działaniu kodu jest w zasadzie żadna. Zanim włączę to zabezpieczenie to miga dioda led na płytce ostrzegając o wyłączonym zabezpieczeniu. Aby utrzymać "symetrię" wykonywania kodu, to po włączeniu zabezpieczenia wykonuję się bardzo podobny kod do tego odpowiedzialnego za miganie diody - dioda po prostu jest zapalana na bardzo krótki okres czasu.
A teraz co się dzieje. Otóż po jakimś czasie (rzędu kilku uruchomień) lub tak jak do niedawna po włączeniu zabezpieczenia, sterownik zachowuje się tak jakby czas nastawy był krótszy. To znaczy - brama nie dojeżdża do końca. Zwykle jeśli zaprogramuje uC na nowo to problem znika, brama znowu działa idealnie.
Tutaj jestem bez radny, kilka razy sprawdzałem kod czy przypadkiem to nie jego wina, ale bez rezultatu. Zdażało mi się godzinami siedzieć nad podobnymi dziwnymi problemami i okazywał się problem w kodzie, więc umieszczę go na końcu postu, dla sprawdzenia.
Ostatni problem to uszkodzenia portu ADC. Portu ADC używam do zabezpieczenia przeciążeniowego, o którym mowa wyżej. Mierzy on napięcie na rezystorze, co daje wynik pobieranego prądu. Przy prądzie maksymalnym (w sensie, takim jaki może podać transformator) napięcie na rezystorze może dojść do niecałego 1V (w teorii - 8,33A prąd znamionowy tarfo, rezystancja 0R11 = 0,92V). Port ADC jest bezpośrednio podłaczony z punktem pomiary napięcia. Lecz sygnał ten jest w jakiś sposób zabezpieczony dzięki równolegle doprowadzonej diodzie Zenera 5,1V (jest także kondensator 100n).
Aktualnie już drugi port mi "padł". Kolega po studiach elektronicznych twierdzi, że to jest nie możliwe - wysoka impedancja portu uniemożliwia uszkodzenie go w ten sposób. Nie bardzo wiem jak zabezpieczyć ten port.
Schemat "trochę" niechlujny, ale lepszy taki niż żaden:
Widok płytki drukowanej (masa jest np. na pinie 2 złącza EDG w górnym prawym rogu):
Kod:
Główny:
adc.h:
Timer.h:
Od dłuższego czasu pracuję nad własnym sterownikiem bramy przesuwnej. Może ktoś pamięta jak stawiałem pierwsze kroki w tym kierunku
W zeszłym roku opracowałem teraźniejszą wersję sterownika - dodałem SOFT-START, SOFT-STOP (wykorzystując PWM). I wszystkie aktualne problemy kręcą się w zasadzie w okół tego.
Po pierwsze, nie mogę ustawić częstotliwości PWM większej niż aktualne ok 200Hz. Efekt jest taki, że uC się prawdopodobnie resetuje (staje w miejscu brama, nie mam możliwości debugowania
Drugi problem. Zacznę może od opisu zagadnienia. SOFT-STOP działa na podstawie pomiaru czasu. Mam z góry wprowadzoną ilość czasu jaką pokonuje brama. Dobrane jest to tak, aby brama ładnie przed końcem wyhamowała i delikatnie weszła w gniazdo. Czas jest odmierzany przez Timer. Problem jest taki, że po włączeniu zabezpieczenia przeciążeniowego (na podstawie ADC - włączenie polega na ustawieniu progu zadziałania innego niż maksymalny). Różnica w działaniu kodu jest w zasadzie żadna. Zanim włączę to zabezpieczenie to miga dioda led na płytce ostrzegając o wyłączonym zabezpieczeniu. Aby utrzymać "symetrię" wykonywania kodu, to po włączeniu zabezpieczenia wykonuję się bardzo podobny kod do tego odpowiedzialnego za miganie diody - dioda po prostu jest zapalana na bardzo krótki okres czasu.
A teraz co się dzieje. Otóż po jakimś czasie (rzędu kilku uruchomień) lub tak jak do niedawna po włączeniu zabezpieczenia, sterownik zachowuje się tak jakby czas nastawy był krótszy. To znaczy - brama nie dojeżdża do końca. Zwykle jeśli zaprogramuje uC na nowo to problem znika, brama znowu działa idealnie.
Tutaj jestem bez radny, kilka razy sprawdzałem kod czy przypadkiem to nie jego wina, ale bez rezultatu. Zdażało mi się godzinami siedzieć nad podobnymi dziwnymi problemami i okazywał się problem w kodzie, więc umieszczę go na końcu postu, dla sprawdzenia.
Ostatni problem to uszkodzenia portu ADC. Portu ADC używam do zabezpieczenia przeciążeniowego, o którym mowa wyżej. Mierzy on napięcie na rezystorze, co daje wynik pobieranego prądu. Przy prądzie maksymalnym (w sensie, takim jaki może podać transformator) napięcie na rezystorze może dojść do niecałego 1V (w teorii - 8,33A prąd znamionowy tarfo, rezystancja 0R11 = 0,92V). Port ADC jest bezpośrednio podłaczony z punktem pomiary napięcia. Lecz sygnał ten jest w jakiś sposób zabezpieczony dzięki równolegle doprowadzonej diodzie Zenera 5,1V (jest także kondensator 100n).
Aktualnie już drugi port mi "padł". Kolega po studiach elektronicznych twierdzi, że to jest nie możliwe - wysoka impedancja portu uniemożliwia uszkodzenie go w ten sposób. Nie bardzo wiem jak zabezpieczyć ten port.
Schemat "trochę" niechlujny, ale lepszy taki niż żaden:
Widok płytki drukowanej (masa jest np. na pinie 2 złącza EDG w górnym prawym rogu):
Kod:
Główny:
Kod: C / C++
adc.h:
Kod: C / C++
Timer.h:
Kod: C / C++
