Skocz do zawartości

Problem z PWM na atmega 32 (programator usbasp)


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 to post
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 to post
Share on other sites
(edytowany)

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 to post
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 to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.