Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega8_sterowanie_PWM i ADC

rewers01 03 Sep 2015 08:34 1491 23
Tespol
  • #1
    rewers01
    Level 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.

    Code: c
    Log in, to see the code



    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.
  • Tespol
  • #2
    BlueDraco
    MCUs specialist
    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.
  • Tespol
  • #3
    rewers01
    Level 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
    BlueDraco
    MCUs specialist
    Napisałem wyżej, ponadto:

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

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

    Code: c
    Log in, to see the code


    Jednak dalej nie działa. Panowie gdzie leży problem ?
  • #6
    Bartosz36
    Level 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 :)
  • #7
    rewers01
    Level 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.

    Code: c
    Log in, to see the code


    Code: c
    Log in, to see the code


    Code: c
    Log in, to see the code


    Może teraz ktoś znajdzie mi powód dlaczego terminal nie pokazuje mi żadnej wartości ?
  • #8
    Bartosz36
    Level 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
    BlueDraco
    MCUs specialist
    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
    rewers01
    Level 8  
    Macie koledzy racje, dlatego zamieszczam cala obsługę mojego UARTA:
    Code: c
    Log in, to see the code


    Moze teraz znajdziecie bład z którym zmagam sie juz dłuższy czas :/
  • #11
    BlueDraco
    MCUs specialist
    To teraz jeszcze sformatuj kod tak, żeby dawał się czytać - z pojedynczym odstępem między wierszami.
  • #12
    rewers01
    Level 8  
    Poprawiłem format kodu, teraz powinno być ok.
  • #13
    BlueDraco
    MCUs specialist
    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
    trol.six
    Level 31  
    Dodaj biblioteke stdio.h

    I zobacz na razie takie formatowanie w głównej pętli for:
    Code: c
    Log in, to see the code


    Poza tym, ja bym unikał takich rzeczy jak:
    Code:
    #define VREF 5.05
  • #15
    rewers01
    Level 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
    BlueDraco
    MCUs specialist
    Code: c
    Log in, to see the code
  • #17
    rewers01
    Level 8  
    #BlueDraco - niestety nie działa, terminal pokazuje jedynie <0>152 w trybie ASCI.

    Jakies pomysły gdzie moze leżeć bład ?
  • #18
    BlueDraco
    MCUs specialist
    Dopóki nie pokażesz czytelnego kodu nie licz na pomoc.
  • #19
    trol.six
    Level 31  
    rewers01 wrote:
    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
    rewers01
    Level 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
    Code: c
    Log in, to see the code

    Efekt jaki wyświetla mi terminal to " U=? [V] ".
  • #21
    BlueDraco
    MCUs specialist
    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
    rewers01
    Level 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:
    Code: c
    Log in, to see the code


    Oraz Program główny:
    Code: c
    Log in, to see the code


    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
    Wirnick
    Level 29  
    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
    rewers01
    Level 8  
    Dziekuje za szybka odpowiedz.
    Jednak w tym programie używam "Fast PWM" Mode 14.

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