Potrzebuję zbudować generator sygnału PWM o zmiennej częstotliwości i zmiennym współczynniku wypełnienia. Wykorzystując sprzętowy PWM zmiana wypełnienia to nie problem ale czy można uzyskać na sprzętowym PWM zmienne częstotliwość od 50 do 1000 Hz płynną lub skokową. Jeżeli jest to możliwe do zrealizowania to prosiłbym o jakieś wskazówki jak się za to zabrać.
...... Wykorzystując sprzętowy PWM zmiana wypełnienia to nie problem ale czy można uzyskać na sprzętowym PWM zmienne częstotliwość od 50 do 1000 Hz płynną lub skokową.
Tak,.......
Mozesz to zrobic wykorzystując timer z dwoma kanałami np. Timer1
Na jednym kanale kontrolujesz częstotliwośc, a na drugim wypełnienie.
Załóżmy że taktujesz processor 8 MHz
Timer1
Waveform Generation Mode:
Phase and Frequency Correct PWM mode(9) / TOP = OCR1A
Timer clock source: I/O Clock / 8 (prescaler=8)
OC1B: Clear OC1B on Compare Match when up-counting. Set OC1B on Compare Match when down-counting.
Dla tego trybu nie możesz użyc konfiguracji Timera w stylu: "Config Timer1......"
lecz dokonasz tego 'ręcznie', bezpośrednio edytując jego rejestry; np w takiej formie:
Config PinB.2 = Output
Żądane zmiany Freq. otrzymasz manipulując wartością Compare1a w zakresie od 500 do 10000, analogicznie wypelnienie byłoby 'manipulowane' przez Compare1b (odpowiednia rutyna umieszczona w Do..Loop).
Wybór sposobu realizacji tej regulacji zależy od programisty/autora projektu.
Możesz to zrealizowac w pętli FOR..... NEXT umieszczonej w Do...LOOP albo zwyczajnie manualnie, potencjometrem wykorzystując ADC i odpowiedni algorytm z którego końcowym wynikiem byłaby wartośc "Compare1a" lub/oraz Compare1b".
Reszta/szczegóły doczytaj w Datasheet, tam jest w zasadzie wszystko co potrzebne.
Odwiedź także tą strone:
http://www.techideas.co.nz/
Tam znajdziesz wiele przydatnych informacji odnośnie programowania w Bascom.
Dziękuje za opis ale chyba mnie to przerosło Zrobiłem programowy PWM, oto kod:
Kod: text
Zaloguj się, aby zobaczyć kod
Wszystko nawet działa tylko jest mały problem z pogodzeniem PWM przy wysokich częstotliwościach a obsługa klawiszy. Przy wysokiej f klawisze "mulą" i nie mam już pomysłu jak można to pogodzić aby klawisze działały płynnie.
Nikt nie ma pomysłu jak pozbyć się tych opóźnień obsługi przycisków przy ustawionej wysokiej wartości częstotliwości sygnału PWM?
Prosiłbym o podpowiedź jak skonfigurować tak timer bo coś nie mogę znaleźć tego w dokumentacji. Proszę o wytłumaczenie jak krowie na rowie bo nie mogę tego pojąć co i jak mam poustawiać i gdzie co będzie.
Albo coś źle robię ale nie rozumiem jak to ma działać. Niezależnie czy do ICR1 wpisz 100 czy 20 000 częstotliwość przebiegu się nie zmienia. A wpisując do OCR1A rożne wartości wypełnienie się zmienia.
Na poniższym filmie zmieniam ICR1. Jak widać szerokość impulsu(wartość OCR1A) się nie zmienia. Zmienia się częstotliwość. Co za tym idzie przypadkiem zmienia się wypełnienie.
tutaj masz zmianę OCR1A przy ICR1 stałym:
<embed src="http://www.youtube.com/v/K_Idqd76c1g?version=3&hl=pl_PL" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true">
To muszę coś źle robić albo Bascom źle konfiguruje timer bo u mnie nie ma takich efektów. Zostanę chyba przy tym programowym PWM i skupie się na tych przyciskach.
Mozesz to zrobic wykorzystując timer z dwoma kanałami np. Timer1
Na jednym kanale kontrolujesz częstotliwośc, a na drugim wypełnienie.
Załóżmy że taktujesz processor 8 MHz
Timer1
Waveform Generation Mode:
Phase and Frequency Correct PWM mode(9) / TOP = OCR1A
Timer clock source: I/O Clock / 8 (prescaler=8)
OC1B: Clear OC1B on Compare Match when up-counting. Set OC1B on Compare Match when down-counting.
Dla tego trybu nie możesz użyc konfiguracji Timera w stylu: "Config Timer1......"
lecz dokonasz tego 'ręcznie', bezpośrednio edytując jego rejestry; np w takiej formie:
Config PinB.2 = Output
Żądane zmiany Freq. otrzymasz manipulując wartością Compare1a w zakresie od 500 do 10000, analogicznie wypelnienie byłoby 'manipulowane' przez Compare1b (odpowiednia rutyna umieszczona w Do..Loop).
Także próbuje wykonać liniową regulację częstotliwości od kilku Hz do kilku kHz, ale nie rozumiem dlaczego w powyzszym opisie dla częstotliwości 50Hz do 1000Hz do COMPARE1A trzeba wpisywać wartość od 500 do 10000? Skąd te wartości jak zostały obliczone?
Zapewne na podstawie czasu w jakim timer 1 jest zwiększany, ale nijak nie zgadza mi się to z okresem dla 50Hz i 1kHz z przykładu który podał autor tematu.
Proszę o jakieś wytłumaczenie lub wzory opisujące zależność częstotliwości od zawartości rejestru COMPARE1A. (ja chce regulować tylko częstotliwością silnika krokowego, a więc konieczność zmiany wypełnienie nie jest mi potrzebna)
No nic dziwnego że Ci się nie zgadza bo te wartości z błędne Powinno to być 1000 i 20000.
A oblicza się prosto.
Timer pracuje na zegarze 1MHz (8MHz i preskaler równy 8).
ICR1 określa okres, a nie częstotliwość. Częstotliwość pośrednio też ale jako odwrotność.
Zatem dla tych dwóch wartości (50 i 1000Hz) mamy:
1000000Hz/50Hz = 20000
1000000Hz/1000Hz = 1000
Zapewne na podstawie czasu w jakim timer 1 jest zwiększany, ale nijak nie zgadza mi się to z okresem dla 50Hz i 1kHz z przykładu który podał autor tematu.
Proszę o jakieś wytłumaczenie lub wzory opisujące zależność częstotliwości od zawartości rejestru COMPARE1A. (ja chce regulować tylko częstotliwością silnika krokowego, a więc konieczność zmiany wypełnienie nie jest mi potrzebna)
Liczy się tak:
Dla każdego trybu pracy timera ( CTC, oraz wszystkich odmian PWM) datasheet podaje odpowiednie wzory na częstotliwośc wyjściową:
Na przykład: dla generowania fali w trybie Phase and Frequency Correct PWM [tryb 9, patrz konfiguracja TCCR1A i TCCR1B],
-wzór jest podany na str. 104
' wymagana czestotliwosc wyjściowa w Hz: f_out = (fclk_I/O)/(2N*TOP) ;
gdzie TOP = OCR1A; Taktowanie (fclk_I/O)= 8 MHz; prescaler (N) = 8
' Przyklad 1: (50Hz): Wartosc OCR1A = 8000000/(2*8*czestotliwosc [Hz])
OCR1A = 8000000/(2*8*50 [Hz]) = 10000
____________________________
' Przyklad 2: (1000Hz): Wartosc OCR1A = 8000000/(2*8*czestotliwosc [Hz])
OCR1A = 8000000/(2*8*1000 [Hz]) = 500
Naturalnie, jeżeli zmienisz częstotliwośc taktowania (!) to liczby te będą błędne; i analogicznie znieniając tryb generowania fali, potrzebujesz stosowac odpowiednio inną formułę obliczeń.
Jeżeli jednak nie potrzebujesz kontrolowac wypełnienia (tak jak to 'stało' w pierwszym twoim poście) i zadowolisz się falą o stałym 50% wypełnieniu, to Tryb CTC spełni twoje wymogi.