logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega Bascom AVR - ADC nie zawsze wyłącza silnik, możliwe błędy w getadc?

satanistik 02 Lip 2017 18:37 1470 13
  • #1 16564884
    satanistik
    Poziom 27  
    Napisałem sobie prosty program w Bascomie AVR - wiem że bascom nie cieszy się najlepszą opinią ale jeszcze się nie przejechałem, wiele urządzeń działa do dziś i może zła opinia to po części zasługa początkujących którzy zwalają brak umiejętności na kompilator. Program w przerwaniu od timera mierzy wartość z ADC, jest to prąd silnika, i porównuje ją z zadaną aby wyłączyć silnik. Wszystko działa dobrze jednak co jakiś czas silnik nie wyłącza się. Przypadek taki zdarza się bardzo rzadko jednak jeśli już do tego dojdzie silnik ulega spaleniu. Kolega zrobił lutownicę na atmega8 i też kila razy miał taki problem że wskazywana temperatura przestała się zmieniać. Czy ktoś ma jakieś informacje o błędach w bibliotece getadc?
  • #2 16564927
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16564937
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16564945
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16566076
    trol.six
    Poziom 31  
    satanistik napisał:
    Wszystko działa dobrze jednak co jakiś czas silnik nie wyłącza się. Przypadek taki zdarza się bardzo rzadko jednak jeśli już do tego dojdzie silnik ulega spaleniu. Kolega zrobił lutownicę na atmega8 i też kila razy miał taki problem że wskazywana temperatura przestała się zmieniać. Czy ktoś ma jakieś informacje o błędach w bibliotece getadc?

    Mnie się kiedyś zdarzyło tylko na mocno podkręconych ustawieniach zablokować pomiar ADC. Z resztą nie odtworzyłem później tego przypadku.

    A czy program w całości działa? Bo to że czegoś nie włącza wcale nie musi być kwestią pomiaru ADC.
    Może kwestia złej filtracji zasilania atmegi?

    niveasoft napisał:
    Getadc() jest w bibliotece głównej mcs.lib
    Nie ma tam nic nadzwyczajnego. Zwykłe ustawienie MUX i dwukrotne wyzwolenie pomiaru.

    No właśnie, nie wiem jak wyglada obsługa ADC w bascomie, ale z tego co czytam na forum jest ona zrobiona w sposób prosty (tzn blokujący). Nawet za długa obsługa w przerwaniu timera nie powinna zaszkodzić. Ale może szkodzi co innego.

    Niestety bez bardziej szczegółowego opisu i bez kodu chociażby schematycznego nie da się nic powiedzieć. Czasami wychodzą zaskakujące błędy w zupełnie innych miejscach.
  • #6 16566132
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16566348
    trol.six
    Poziom 31  
    R-MIK napisał:
    Auto napisał:
    satanistik napisał:

    Program w przerwaniu od timera mierzy wartość z ADC

    Rozwiązanie dość kiepskie. Wchodzi w przerwanie, wyzwala pomiar, czeka na wynik W PRZERWANIU!,
    Nie twierdze że to jest rewelacja, ale samo w sobie nie powinno prowadzić do błędu w stylu "brak kolejnych pomiarów ADC". Co najwyżej do błędów czasowych i tylko wtedy kiedy czas obsługi przerwania jest dłuższy niż czas pomiędy kolejnymi przerwaniami.

    Natomiast dużo zależy od szczegółów całości programu. W Bascomie też są jakieś stosy itp itd. Pozostaje dopisać program diagnostyczny, sprawdzanie np kilku ostatnich pomiarów, czy nie odbiegają od jakiś norm :)

    Błąd może być też sprzętowy, zła filtracja zasilania atmegi itp. itd.
  • #8 16566418
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16568471
    satanistik
    Poziom 27  
    Z tym Bascomem nie może byś aż tak źle - znalazłem w sieci opis pojazdu typu segway na silnikach BLDC i wszystko w Bascomie.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Program nie zawiesza się notorycznie - raczej jeden na kilka tysięcy razy.
    Myślałem nad zrzutem rejestrów po awarii np uartem ale nie mogę wywołać tej usterki "na sole". Możliwe że przepięcia z silnika zakłócają uP.
  • #10 16569005
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16569071
    satanistik
    Poziom 27  
    Nie do końca tak to działa.
    Silnik jest załączany i faktycznie wyłącza się gdy prąd przekroczy wartość graniczną.
    Musi to być szybko zrobione bo przekaźnik sterujący silnikiem jest wolny i przy dłuższym czasie zabezpieczenie zasilacza wyłącza wcześniej zasilacz.
    Licznik błędów jest tylko po to że gdyby przekaźnik się skleił to po czasie awaryjnym program przechodzi do nieskończonej pętli, załącza oba przekaźniki co powinno odciąć prąd. Z tej pętli niema powrotu więc silnik nie załączy się ponownie.

    Cały program opiera się o maszynę stanu na zmienne kier i select case. Stan tej zmienne decyduje o kierunku obrotów. Jeżeli pod wpływem wykrycia prądu stan zmiennej się zmieni to w pętli głównej silnik nie zostanie ponownie załączony.

    Schemat działania:

    Po włączeniu czeka i włącza silnik.
    Po wykryciu prądu zatrzymuje silnik
    Przyciskiem reset można zawsze wyłączyć silnik i uruchomić go ponownie w przeciwnym kierunku.
    Potencjometrem można ustawić prąd - wartość aktualizuje się po każdej zmianie stanu przycisku i po starcie.
    Jest jeszcze czas ograniczenia maksymalnego biegu silnika np na wypadek awarii przekładni.
  • #12 16576874
    trol.six
    Poziom 31  
    Ja nie znam dokładnie bascoma ale moge dorzucić kilka uwag, i dołaczę się z pytaniem? Czy bascom atomizuje zmienne?

    Jeśli nie, to w petli głównej masz: I_count = 0
    a w przerwaniu: Incr I_count
    istnieje ryzyko że przerwanie nie nadpisze zmiennej I_count.

    Generalnie dotyczy to wszystkich zmiennych używanych w przerwaniu. Wyjątkiem jest gdy bascom umieści zmienną jest w rejestrze. Ale nie ma chyba takiej gwarancji. Np.: na czas modyfikacji w pętli głównej należy wyłączyć przerwania od tej zmiennej.

    Również Incr I_count w przerwaniu może się przepełnić jeśli w pętli nie obsłużysz na czas. Akurat to jest mało prawdopodobne, jeśli pętla działa dostatecznie szybko.

    Generalnie ta zmienna I_count kooperuje ze zmienną Kier, dla mnie nie jest to dość czytelne. Bo niby w jakim przypadku silnik ma się zatrzymać?
    Gdy Kier==2 Blok==0 Blokz==1, to I_count będzie zawsze zerowany. Dobrze widze? tak ma być?

    satanistik napisał:
    Musi to być szybko zrobione bo przekaźnik sterujący silnikiem jest wolny
    Masz tam tranzystor i zwykłą diode? Możesz dać/dodać tam stosowną diode zenera na napięcie mniejsze od przebicia tranzystora np 12V, tudzież z dobranym gasikiem RC, gdyby siało zakłóceniami. Powinno być szybciej.
  • #13 16578490
    satanistik
    Poziom 27  
    Faktycznie jest błąd - bo po wykryciu przeciążenia wyłączane są przekaźniki a zmienna kierunku zmienia się dopiero przy Icount = 2, wynika to z tego że wyrzucałem wszystko z przerwania bo było tam sporo if-ów i mogło się zapętlić.
  • #14 16585133
    trol.six
    Poziom 31  
    Ja staram się unikać (zapisu i czytania) tych samych zmiennych w przerwaniach, bo potem czasem ciężko to ogarnąć.

    W twoim programie jedyną istotną informacją z przerwania jest fakt przekroczenia prądu. Powinna być obsługiwana w przerwaniu, a w pętli jedynie czytana.
    Fakt, można i czasem trzeba ustawić ja z początku programu.
REKLAMA