Skocz do zawartości

Problem z PWM na atmega 32 (programator usbasp)


kajkozak

Pomocna odpowiedź

Witam,
od pewnego czasu męczę się z konfiguracją pwm w mikrokontrolerze atmega32apu (z dołączonym kwarcem 16Mhz). Do kompilacji używam microchip studio. Za programator służy mi usbasp (z alliexpresu).
Jako że dopiero uczę się używania timera/countera założenie programu jest proste. Ma pokazać jasność diody przy niewielkim i maksymalnym wypełnieniu.

zamieszczam kod programu:

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>


int main(void)
{
DDRD |=(1<<PD7);
TCCR2 |= (1<<WGM21)|(1<<WGM20);
TCCR2 |= (1<<COM21);
TCCR2 &= (0<<COM20);
TCCR2 |= (1<<CS20);
TCCR2 &= (0<<CS21);
TCCR2 &= (0<<CS22);
TCCR2 &= (0<<FOC2);
 
 
    while (1) 
    {
		OCR2 =5;
		_delay_ms(500);
		OCR2 =255;
		_delay_ms(500);

    }
}

Niestety jedyny efekt jaki uzyskuję to stałe świecenie diody. Do rozkminiania pwm używam książki pana M.Kardasia, oraz opierałęm się o notę katalogową ATmega32/L Datasheet (microchip.com) .
Proszę o pomoc i pozdrawiam 😄

Link do komentarza
Share on other sites

Ustawiłeś fuse bity? Domyślnie mikrokontroler działa na wewnętrznym oscylatorze.

Zegar wydaje się być ustawiony poprawnie, jedyne co to bardzo niski preskaler co powoduje, że na wyjściu powinien być sygnał PWM o częstotliwości w okolicach  62,754kHz, może dlatego nie widać różnicy w jasności. Można spróbować zwiększyć preskaler na 128 (CS22=1, CS21=0, CS20=1) i wtedy PWM będzie miał tylko 480Hz. 

Do ogarnięcia podstaw timer'ów polecam ten artykuł: https://exploreembedded.com/wiki/AVR_Timer_programming 
Żeby nie trzeba było ustawiać każdego z bitów w rejestrze z osobna można pisać "TCCR2 = 0b01101101;"

 

  • Lubię! 1
Link do komentarza
Share on other sites

Przy zerowaniu bitów brakuje Ci tyldy

PORT&=~(1<<...);

O kurcze przepraszam mój błąd, przy zapisie (0<<bit) oczywiście tyldy nie potrzeba, napisałem głupotę.

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Dziękuję bardzo _LM_ i k_ijada za pomoc, udało mi się doprowadzić do działania program (znalazłem jakiś kod w internecie i zagrało akurat z nim), ale co wywnioskowałem, to że skoro rejestry są i tak w pierwotnie ustawione na 0, to zbędnie zmieniałem te bity "ponownie" w zero. W przykładzie z internetu kod był w zewnętrznej funkcji ale nie wiem czy ma to większe znaczenie, ponieważ spotkałem się z przykładem że był też normalnie w "main". (chciałbym podesłać link, ale mój google się zbuntował i wyszukuje tylko polskie linki). Chociaż wracając do kodu po tym tygodniu w sumie dalej nie wiem co jest nie tak xd, może te 0 rzeczywiście, albo jakaś literówka, albo złośliwość rzeczy martwych :D. Dzięki wielkie jeszcze raz.

P.S. znalazłem stronkę dla zainteresowanych:

https://www.electronicwings.com/avr-atmega/atmega1632-pwm

i dzięki za link k_ijada

Edytowano przez kajkozak
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.