Witam,
postanowiłem napisać, gdyż dzisiaj bawiłem się mikrokontrolerem ATmega328p, a konkretnie timerem 1 w trybie PWM. Ustawiłem go tak aby mieć jak największą rozdzielczość, czyli żeby zliczał do ICR1 (mam wtedy 16 bitów). Z grubsza fragment kodu odpowiadający za generację PWM wyglądał więc tak:
Wszystko działa poprawnie (wypełnienie mogę zmieniać zgodnie z oczekiwaniami), za wyjątkiem sytuacji gdy do OCR1A wpiszę zero. Wtedy mimo, że nie chcę mieć nic na wyjściu to pojawia się pewne napięcie zbliżone do wypełnienia minimalnego. Wygląda to tak jakby PWM tutaj potrzebował jednego cyklu zegarowego aby porównać OCR1A z ICR1 i utrzymuje stan wysoki na pinie przez ten moment.
Co ciekawe. Zmieniłem tryb PWM na odwracający i teraz mój kod wygląda tak:
I to działa idealnie. Gdy wpisuję do OCR1A maksymalną wartość to na wyjściu mam piękne zero. W zasadzie swój problem więc rozwiązałem, ale chciałbym podrążyć temat i dowiedzieć się dlaczego w trybie non-inverting to nie chce do końca działać? Czy ktoś miał podobny problem i będzie mi w stanie to wytłumaczyć, czy może odkryłem jakiś bug w architekturze tego mikrokontrolera
Będę wdzięczny za wyjaśnienie bo mnie ta kwestia zaciekawiła.
postanowiłem napisać, gdyż dzisiaj bawiłem się mikrokontrolerem ATmega328p, a konkretnie timerem 1 w trybie PWM. Ustawiłem go tak aby mieć jak największą rozdzielczość, czyli żeby zliczał do ICR1 (mam wtedy 16 bitów). Z grubsza fragment kodu odpowiadający za generację PWM wyglądał więc tak:
Kod: C / C++
Wszystko działa poprawnie (wypełnienie mogę zmieniać zgodnie z oczekiwaniami), za wyjątkiem sytuacji gdy do OCR1A wpiszę zero. Wtedy mimo, że nie chcę mieć nic na wyjściu to pojawia się pewne napięcie zbliżone do wypełnienia minimalnego. Wygląda to tak jakby PWM tutaj potrzebował jednego cyklu zegarowego aby porównać OCR1A z ICR1 i utrzymuje stan wysoki na pinie przez ten moment.
Co ciekawe. Zmieniłem tryb PWM na odwracający i teraz mój kod wygląda tak:
Kod: C / C++
I to działa idealnie. Gdy wpisuję do OCR1A maksymalną wartość to na wyjściu mam piękne zero. W zasadzie swój problem więc rozwiązałem, ale chciałbym podrążyć temat i dowiedzieć się dlaczego w trybie non-inverting to nie chce do końca działać? Czy ktoś miał podobny problem i będzie mi w stanie to wytłumaczyć, czy może odkryłem jakiś bug w architekturze tego mikrokontrolera
Będę wdzięczny za wyjaśnienie bo mnie ta kwestia zaciekawiła.