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

Problemy z PWM i ADC w programie na Atmegę8 – błędy i nieprawidłowe działanie diod

rewers01 03 Wrz 2015 08:34 1590 23
REKLAMA
  • #1 14967715
    rewers01
    Poziom 8  
    Witam,

    Proszę o pomoc w poprawieniu kodu lepiej zorientowanych kolegów. Otóż chciałbym wykorzystać Atmege8 do wysterowania PWM zależnym od pomiaru z ADC.
    Stworzyłem model układu i zamiast odczytu z ADC skupiłem się na napisaniu prostego kodu dla PWM zmieniającego szerokość impulsu od temperatury ( z DS18b20).

    Korzystając z tutoriali znalezionych w internecie oraz z książki Mirka Kardasia skleiłem program który wrzucam poniżej.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Po wgraniu programy efekt jest nastepujący :
    -dioda PD5 świeci cały czas
    -dioda PB0 miga średnio co 1s.
    -dioda PB1 miga z bardzo duza czestotliwościa.
    -Po wysterowniu PWM nastepuje przesyl do terminala temperatury (wtedy również gasnie na chwile dioda PB0)
    -Po odkomentowaniu ADC- terminal nie odczytuje wartosci.
  • REKLAMA
  • #2 14967745
    BlueDraco
    Specjalista - Mikrokontrolery
    W kodzie masz całe mnóstwo błędów, np.:

    - startujesz konwersję ADC przed wybraniem kanału
    - używasz typów zmiennopozycyjnych (niepotrzebnie)
    - czekasz na zatrzymanie przetwornika (bit ADSC), a zaprogramowałeś przetwornik na konwersję ciągłą - nie zatrzyma się nigdy.
  • #3 14967845
    rewers01
    Poziom 8  
    Dziękuje za szybką odpowiedz.
    Poprawiłem inicjalizacje ADC, kod został zauktualizowany.
    Jednak kod dalej nie działa.
    Czy mogłby kolega wyjaśnic co kryje sie pod stwierdzeniem

    w kodzie jest mnóstwo błędów

    ?
  • #4 14968524
    BlueDraco
    Specjalista - Mikrokontrolery
    Napisałem wyżej, ponadto:

    - zbędne przerwanie timera
    - dwie zmienne temp (przykrycie deklaracji)
    - zawieszenie reakcji na klawisz podczas odczytu temperatury

    itd. ;)
  • #5 14968894
    rewers01
    Poziom 8  
    Poprawiłem wcześniejsze błędy i obecnie kod wygląda tak :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jednak dalej nie działa. Panowie gdzie leży problem ?
  • #6 14968960
    Bartosz36
    Poziom 12  
    Witam,
    Musisz najpierw powiedzieć nam jakie są założenia, jak miał zachowywać się układ. Bez tego ciężko będzie określić co masz na myśli mówiąc: "nie działa".
    Możesz też podrzucić schemat i upewnić się że wszystko dobrze podłączyłeś.
    Popraw też formatowanie kodu, bardzo ciężko się to czyta przez co mimo dobrych chęci trudno będzie Ci czasem pomóc.

    Pozdrawiam :)
  • REKLAMA
  • #7 14969478
    rewers01
    Poziom 8  
    Program ma spełniać prostą funkcje. Odczyt z ADC i wysłanie tej wartości do terminala po UARCIE. Planuje by efekt koncowy tego fragmentu wyswietlal na terminalu, wartość z adc oraz tekst

    poniżej załączam inicjalizacje uarta oraz dwie funkcje wysylające.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Może teraz ktoś znajdzie mi powód dlaczego terminal nie pokazuje mi żadnej wartości ?
  • #8 14969669
    Bartosz36
    Poziom 12  
    Z tego co widzę w listingu wysyłającym dane przez UART masz zmienną koniec_kolejki, która to nigdzie nie jest funkcji podana. Jeśli jest to zmienna globalna, to musisz na takie zmienne uważać...
    Masz także tablicę dynamiczną *bajty, której nigdzie nie widzę alokacji. Jesteś pewien, że alokujesz pamięć dla jej wskaźnika (malloc)? Jeśli tak, to na jaki rozmiar?
  • #9 14969675
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie sądzę, by ktoś był w stanie zgadnąć, jak wygląda fragment programu, którego nie pokazałeś, a który miał coś wysyłać przez UART.
  • #10 14969938
    rewers01
    Poziom 8  
    Macie koledzy racje, dlatego zamieszczam cala obsługę mojego UARTA:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Moze teraz znajdziecie bład z którym zmagam sie juz dłuższy czas :/
  • #11 14970047
    BlueDraco
    Specjalista - Mikrokontrolery
    To teraz jeszcze sformatuj kod tak, żeby dawał się czytać - z pojedynczym odstępem między wierszami.
  • REKLAMA
  • #12 14970182
    rewers01
    Poziom 8  
    Poprawiłem format kodu, teraz powinno być ok.
  • #13 14970717
    BlueDraco
    Specjalista - Mikrokontrolery
    Raczej pogorszyłeś - odstępy były podwójne, teraz są potrójne lub poczwórne. Wybacz, ale ja nie mam czasu na przesuwanie kodu w oknie i czytanie go w porcjach po 2 linijki zamiast po 12.

    Sformatuj kod tak, żeby nadawał się do czytania albo zamknij wątek.
  • #14 14971855
    trol.six
    Poziom 31  
    Dodaj biblioteke stdio.h

    I zobacz na razie takie formatowanie w głównej pętli for:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poza tym, ja bym unikał takich rzeczy jak:
    #define VREF 5.05
  • #15 14974746
    rewers01
    Poziom 8  
    #BlueDraco - nie wiem dlaczego ale podczas formatowania sprawdzilem kod przyciskiem "podgląd". Wyglądał duzo lepiej niz w tym momencie. Wkleiłem kod miedzy funkcje syntax=c.

    #trol.six - Dziekuje za zainteresowanie problemem, jutro sprawdze ta funkcje bo dzisiaj nie mam dostępu do układu.
  • #16 14975559
    BlueDraco
    Specjalista - Mikrokontrolery
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 14979904
    rewers01
    Poziom 8  
    #BlueDraco - niestety nie działa, terminal pokazuje jedynie <0>152 w trybie ASCI.

    Jakies pomysły gdzie moze leżeć bład ?
  • REKLAMA
  • #18 14979935
    BlueDraco
    Specjalista - Mikrokontrolery
    Dopóki nie pokażesz czytelnego kodu nie licz na pomoc.
  • #19 14980051
    trol.six
    Poziom 31  
    rewers01 napisał:
    terminal pokazuje jedynie <0>152 w trybie ASCI.

    Jakies pomysły gdzie moze leżeć bład ?

    Skoro terminal coś pokazuje, to coś działa. Może ustawiona jest inna prędkość?
    Poza tym pokaż aktualny kod.
  • #20 14980055
    rewers01
    Poziom 8  
    Poprzedni kod jednak działał, moj błąd. Źle zadeklarowałem zmienna i terminal zaczał pokazywać wartości od 0-1023.
    Jednak mnie zależy by wartość wyświetlała się w przeliczonej na volty postaci. Obecny kod wyglada następująco
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Efekt jaki wyświetla mi terminal to " U=? [V] ".
  • #21 14980282
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie używaj typu float. Jeśli nie dasz się przekonać, to przynajmniej włącz obsługę float w printf. Ja nie wiem, jak to zrobić, bo nigdy nie wpadłbym na pomysł, by używać float na 8-bitowcu.
  • #22 15014913
    rewers01
    Poziom 8  
    Z racji że nie udało mi się uporać z tym problemem, odświeżam wątek.

    Zamieszczam obecny kod obsługujący PWM:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oraz Program główny:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Celem tego programu jest wysterowanie przetwornica obnizajaca napiecie tak by napiecie wyjsciowe bylo o polowe mniejsze niz wejsciowe. Podejrzałem na oscyloskop sygnaly wejsciowy drivera mosfeta oraz sygnal na kazdej z bramek(połączenie równoległe) . Sa idealnie prostokątne. Jednak mimo wszystko uklad nie "daje" wiecej niz 5-7 V przy zasilaniu 25-30V. Uzywam wewetrznego oscylator 1MHz ale testowałem również i 8MHz.

    Słowo sprostowania, pisze w tym temacie gdyz podejrzewam ze to wina programu a nie ukladu.
    Prosiłbym o jakies spostrzeżenia,uwagi, wskazówki do kodu.
  • #23 15015809
    Wirnick
    Poziom 30  
    MODE 12|CTC nie wykonuje się, bo nie następuje "TOV1 Flag Set on". Powodem jest OCR1A<ICR1 - wcześniej dochodzi do "Update of OCR1x".
    Rysunek ideowy w DS lepiej wskazuje zależności rejestrów timera1.
  • #24 15016183
    rewers01
    Poziom 8  
    Dziekuje za szybka odpowiedz.
    Jednak w tym programie używam "Fast PWM" Mode 14.

    //Panowie, żadnych pomysłów ;/?
REKLAMA