Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AtMega8] [C] - Regulator PID do silniczka

Albert91 02 Mar 2013 00:34 2025 5
  • #1 02 Mar 2013 00:34
    Albert91
    Poziom 7  

    Witam , ostatnio naszło mnie na zrobienie sobie regulatora do małego silniczka prądu stałego , wg prostej koncepcji : zasilanie silnika przez mostek jest sterowane PWM z Timer1 , przerwania Int0 zliczają przejście czujnika odbiciowego nad czarnymi kreseczkami znajdującymi sie na sprzężonej z wałem silnika tekturowej tarczy.

    Do obsługi tego użyłem poniższy kod : (przerwania mi zlicza , bo jak zamiast regulatora wrzucam do przerwania T0 funkcję

    Cytat:
    OCR1A=100-i;
    to wszystko działa prawidłowo i napięcie elegancko zmniejsza się od max do niemal 0 tak jak powinno.

    Gdy zaś próbuje zaprogramować układ jako regulator poniższym kodem , nie działa on tak jak powinien , a mianowicie nie reaguje na zmiany obciążenia.
    Co możne być tego przyczyną , czy mam jakiś błąd w kodzie?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 5
  • #2 02 Mar 2013 01:01
    dondu
    Moderator Mikrokontrolery Projektowanie

    Witaj,

    Naważniejsze - volatile: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html

    Nie definiuj F_CPU w kodzie ponieważ: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    Po za tym, zamiast SIGNAL używaj ISR i nowych wektorów przerwań: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

    Popraw, sprawdź i wtedy zobaczymy dalej.

    0
  • #3 03 Mar 2013 00:20
    Albert91
    Poziom 7  

    Przerobiłem wszystko tak jak napisałeś , i teraz nic nawet nie rusza , wydaje mi się , że przerwania nie działają.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 03 Mar 2013 06:57
    dondu
    Moderator Mikrokontrolery Projektowanie

    Rozumie, że schematu nie musimy sprawdzać?

    W Twoim przypadku, wystarczy by tylko zmienna i była volatile, ponieważ jest używana zarówno w przerwaniu jak i poza nim. Ale to że pozostałe także zrobiłeś jako volatile, nie ma wpływu na niedziałanie programu.

    Zmienne liczenia PID używsz tylko w przerwaniu, to możesz zrobić z nich zmienne statyczne i deklarować je właśnie w funkcji tego przerwania:
    Chyba, że będziesz nimi także operował poza tą funkcją, to wtedy volatile.

    Konfigurujesz przerwanie INT1 choć go nie włączasz - fragment zbędny, choć nie wpływający na fakt nie działania programu.

    Dla porządku lepiej ładować do OCR1A tylko poprawne wartości. Dlatego ten fragment bym poprawił:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dodałbym zmienną, następnie ją sprawdzał i dopiero włąsciwą wartość ładował do OCR1A.

    Generalnie nie widzę oczywistego miejsca błędu, ale mogłem coś przeoczyć.
    Zacząłbym od sprawdzenia, czy poszczególne przerwania się wykonują np. dołączając jakiś LED i dodatkowy kod.

    0
  • #5 03 Mar 2013 09:37
    BlueDraco
    Specjalista - Mikrokontrolery

    Jaki jest okres timera 1 i gdzie go programujesz?

    0
  • #6 17 Mar 2013 20:32
    Albert91
    Poziom 7  

    Na 70% problem sprawiało to , że mostek brał zasilanie z tego samego źródła co zasilanie procka , i co chwilę mi go resetował.
    Na razie w przypadku gdy ustawiłem zakres OCR1A do połowy , to układ zaczął reagować mniej więcej tak jak powinien , sprawdzę jeszcze gdy kupię drugi zasilacz.

    0