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

[ATmega32][c] - Porównanie kanałów z ADC. Sterowanie wsp. wypełnienia PWM.

WladRaginis 23 Lut 2013 12:33 1560 2
REKLAMA
  • #1 11974565
    WladRaginis
    Poziom 1  
    Witam !

    Buduję układ detektora zapadów napięć oparty na analizie kąta fazowego. Metoda ta polega, w skrócie, porównywaniu napięcia sieciowego z wzorcowym.
    Układ buduję na mikrokontrolerze ATmega32. Chcem porównać dwa wejścia ADC aby uzyskać informację o procentowej zmianie napięcia względem napięcia wzorcowego. Informacja ta ma sterować współczynnikiem wypełnienia PWM.
    Udało mi się odczytać dane z dwóch kanałów ADC jednak kiedy chcem obliczyć procentową zmianę wartości napięcia współczynnik wypełnienia zawsze wynosi 0.
    Poniżej kod programu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Używam zestawu uruchomieniowego zl3avr. Na wejście ADC podaje napięcie 1-4V.
  • REKLAMA
  • #2 11974598
    mickpr
    Poziom 39  
    WladRaginis napisał:
    wsp_wyp = ((v_ref-v_we)/(v_ref))*255;

    Moim zdaniem nie możesz tak robić.
    Zmienne są typu INT (a ty w wyniku dzielenia otrzymujesz zmienną typu float w zakresie 0...1).
    Zmień typ zmiennych w obliczeniach. Poczytaj o możliwości użycia zmiennych stałoprzecinkowych w AVR.
    Ewentualnie (tak prościej i lepiej) - zwiększ rozmiar zmiennej do 32 bitów i pomnóż przez 100. A potem wynik(po obliczeniach) podziel przez 100.
  • #3 11974608
    BlueDraco
    Specjalista - Mikrokontrolery
    Odczytujesz ADCH po rozpoczęciu konwersji, ale przed jej zakończeniem, czyli czytasz śmieci. Przed odczytem ADC czekaj w pętli na gotowość.

    Wzór na wsp_wyp liczony na liczbach całkowitych da wynik 0 jeśli v_we będzie mniejsze od v_ref. W przeciwnym przypadku wynik będzie jeszcz bardziej bzdurny.
    To problem kolejności operacji.

    Spróbuj tak: (v_ref - v_we) * 255 / v_ref - szanse na sukces lekko wzrosną.

    Nie wiem co prawda, dlaczego mnożysz przez 255, a nie 256, ale z grubsza zadziała.

    No i przypadkiem nie wpadnij na pomysł liczenia tego w zmiennym przecinku.
REKLAMA