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.

[AVR] [C] - Potencjometr na ADC i sterowanie PWM.

majkel01 03 Lut 2013 18:50 4170 10
  • #1 03 Lut 2013 18:50
    majkel01
    Poziom 8  

    Witam
    piszę program do sterowania grupowego grzałką.
    Założenia: w 1s mam 100 połówek sinusa, więc trybie FAST PWM ustawiam sobie częstotliwość na fpwm=1Hz, czyli wybieram odpowiedni prescaler (64) dla fcpu=1000000 i w rejestrze ICR1 ustawiam TOP=15624, następnie w zależności od wartości odczytanej z przetwornika ADC wpisuje odpowiednią wartość do rejestru OSCR1A.

    Kod programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Do testów do układu mam podłączoną diodę pod PB1 przez rezystor do zasilania.
    I mam pytanie dlaczego dioda świeci cały czas niezależnie od wartości ustawionej przez potencjometr?
    A drugie pytanie czy to jest poprawne podejście do implementacji sterowanie grupowego?

    Bardzo dziękuje za wszelaką pomoc

    Pozdrawiam Michał

    0 10
  • #2 03 Lut 2013 19:17
    dondu
    Moderator Mikrokontrolery Projektowanie

    Witaj,

    Nie widzę pętli głównej :)
    Przeanalizuj kod wynikowy, a zobaczysz jaki kod generuje kompilator przy braku pętli głównej.

    BTW nie definiuj F_CPU w kodzie. Dla tego przypadku akurat nie ma to znaczenia, ale w innym może już mieć: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    EDIT:
    Ode mnie 20pkt bo masz zaledwie 5.5 a mogą się przydać.

    0
  • #3 03 Lut 2013 20:18
    majkel01
    Poziom 8  

    A rzeczywiście, nie wiem jak mi to umknęło.

    Teraz owszem dioda miga, nawet jest to w jakiś sposób zależne od potencjometru, lecz te migania są bardzo nie asynchroniczne. np.: miga kilkukrotnie słabo, a następnie gaśnie na kilka sekund. Nie da się również osiągnąć całkowitego zaświecenia albo zgaszenia diody.

    Dodam jeszcze że potencjometr jest podłączony przez rezystor 330Om, więc w rejestrze ADCH nigdy nie pojawi się wartość dokładnie 0, ale ze względu na wielkość licznika i bezwładność oka przy maksymalnie skręconym potencjometrze moim zdaniem powinienem widzieć stan zgaszony.

    Założenie jest takie, by potencjometrem móc ustawiać przez jaką część sekundy ma być stan wysoki na porcie.

    Dziękuje za pomoc

    0
  • #5 03 Lut 2013 20:36
    majkel01
    Poziom 8  

    Atmega8

    Program jest dokładnie taki jak w pierwszym poście, tylko przed ostatnią klamrą dodałem

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 03 Lut 2013 21:19
    majkel01
    Poziom 8  

    Zwiększyłem prescaler do 128.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przy minimalnej wartości ustawionej przez potencjometr świeci światłem ciągłym, czyli jest non stop stan niski co odpowiadałoby zerowemu wypełnieniu, natomiast przy maksymalnej nastawie dalej miga kilka raz słabiej a następnie gaśnie na ok 1s., podobny stan jest w innych położeniach potencjometru. Gdzieś w połowie skali dioda gaśnie całkowicie.

    Schemat na szybko:
    [AVR] [C] - Potencjometr na ADC i sterowanie PWM.
    uP programuje za pomocą usbasp'a.

    0
  • #8 04 Lut 2013 09:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    Może masz inne błędy, ale z pewnością błędem jest to:
    ADCH*15624
    w linii:
    wypelnienie =(uint16_t)((ADCH*15624)/255) ;
    Przekraczasz zakres int już dla ADCH równego 4 i całość jest liczona modulo 65536. Gdybyś napisał 15624UL to byłoby lepiej, ale wtedy masz mnożenia i dzielenia na typie long, czyli dłuższe.

    0
  • #9 04 Lut 2013 23:23
    majkel01
    Poziom 8  

    Poprawiłem to w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I teraz dioda świeci cały czas, nie widać, żadnych mignięć. Gdy potencjometr jest ustawiony na wartość maksymalną to dioda gaśnie.

    Tylko jeszcze teraz pytanie jak z ustawieniem Fpwm, wg datasheeta:
    $$f_{PWM}= f_{CPU}/N*(1+TOP) $$
    natomiast wg książki "Język C dla mikrokontrolerów AVR" wydawnictwa Helion:
    $$f_{PWM}= f_{CPU}/2* N*(1+TOP) $$
    Przeglądałem erratę i tam nie ma nic na ten temat, czyli raczej błąd drukarski?

    0
  • #11 05 Lut 2013 18:15
    tmf
    Moderator Mikrokontrolery Projektowanie

    Zastanów się:
    wypelnienie =(uint16_t)(ADCH/255) ;
    To zawsze, z wyjątkiem sytuacji, kiedy ADCH==255 da ci 0.

    0