Witam,
potrzebny jest mi generator fali PWM o zmiennej częstotliwości i wypełnieniu. Górna częstotliwość wynosi 150kHz, dolna 10kHz. W programie wykorzystuję dwa kanały adc (tj. adc1, adc2) oraz jedno wyjście dla wspomnianej fali (tj. PC5). Atmega8 pracuje z zewnętrznym kwarcem 16MHz. Górna częstotliwość wymaga 106 cykli zegarowych, dolna natomiast 1600. Moim licznikiem jest timer1 pracujący w trybie CTC. Założyłem następującą strukturę programu:
-konfiguracja adc oraz timer1
-pobranie danych z adc (tj. wypełnienie i częstotliwość)
-wykonanie obliczeń dla danych wejściowych
-określenie który stan logiczny w okresie jest dłuższy
-w przerwaniu dotyczącym wspomnianego stanu dominującego wykonanie jednego z trzech etapów: aktualizacja danych, pobranie informacji o wypełnieniu, o częstotliwości.
-w pętli głównej programu oczekiwanie na komplet danych dla algorytmu obliczeniowego
-aktualizacja danych w przerwaniu
Doszedłem do wniosku, że stan logiczny w najgorszym przypadku będzie miał 53 cykle zegarowe i przez mój brak doświadczenia uznałem, że to wystarczająco.
Poniższy program działa prawidłowo do ok 15kHz, później jest niestabilny, aż w końcu mam jakieś śmieci na oscyloskopie. Myślałem początkowo, że przerwanie przekracza czas trwania danego stanu logicznego. Wrzuciłem diody tak by zmieniały stan na wejściu i wyjściu z przerwania, ale to jednak nie jest ten problem. Sam algorytm obliczeniowy nie ma tu większego znaczenia i wspomniane linijki symulują jedynie prace na zakresie uint31_t. Proszę o pomoc i wskazanie kierunku w którym powinienem pójść z opisanym projektem.
potrzebny jest mi generator fali PWM o zmiennej częstotliwości i wypełnieniu. Górna częstotliwość wynosi 150kHz, dolna 10kHz. W programie wykorzystuję dwa kanały adc (tj. adc1, adc2) oraz jedno wyjście dla wspomnianej fali (tj. PC5). Atmega8 pracuje z zewnętrznym kwarcem 16MHz. Górna częstotliwość wymaga 106 cykli zegarowych, dolna natomiast 1600. Moim licznikiem jest timer1 pracujący w trybie CTC. Założyłem następującą strukturę programu:
-konfiguracja adc oraz timer1
-pobranie danych z adc (tj. wypełnienie i częstotliwość)
-wykonanie obliczeń dla danych wejściowych
-określenie który stan logiczny w okresie jest dłuższy
-w przerwaniu dotyczącym wspomnianego stanu dominującego wykonanie jednego z trzech etapów: aktualizacja danych, pobranie informacji o wypełnieniu, o częstotliwości.
-w pętli głównej programu oczekiwanie na komplet danych dla algorytmu obliczeniowego
-aktualizacja danych w przerwaniu
Doszedłem do wniosku, że stan logiczny w najgorszym przypadku będzie miał 53 cykle zegarowe i przez mój brak doświadczenia uznałem, że to wystarczająco.
Poniższy program działa prawidłowo do ok 15kHz, później jest niestabilny, aż w końcu mam jakieś śmieci na oscyloskopie. Myślałem początkowo, że przerwanie przekracza czas trwania danego stanu logicznego. Wrzuciłem diody tak by zmieniały stan na wejściu i wyjściu z przerwania, ale to jednak nie jest ten problem. Sam algorytm obliczeniowy nie ma tu większego znaczenia i wspomniane linijki symulują jedynie prace na zakresie uint31_t. Proszę o pomoc i wskazanie kierunku w którym powinienem pójść z opisanym projektem.
Kod: C / C++
