Witam serdecznie forumowiczów.
Jestem w trakcie budowy generatora sygnału PWM o zmiennym wypełnieniu oraz częstotliwości. Wypełnienie 0-100% co 5%, częstotliwość 1-50 kHz co 1 kHz (plus kilka częstotliwości poniżej 1k). Generator będzie częścią nieco większego projektu.
Całość ma działać mniej więcej w taki sposób: odpalam timer1 w trybie PWM z korekcją fazy i częstotliwości (tryb 8 w tym uC), robię odczyt z ACD (potencjometr 1), w zależności od odczytu podstawiam odpowiednią wartość pod ICR1 (który ustala mi wartość TOP przy zliczaniu impulsów (mam już zadaną częstotliwość)), robię odczyt ADC (potencjometr 2), w zależności od odczytu wybieram wypełnienie, liczę wypełnienie na podstawie pomiaru i ICR1, podstawiam obliczoną ilość taktów pod OCR1A (który odpowiada za zmianę stanu). Wszystko ładnie pięknie, działa tak jak chcę, ale niestety tylko powyżej 10kHz. Przy niższych częstotliwościach wypełnienie wariuje. Wydaje mi się, że program gubi się przy obliczaniu wypełnienia, ze względu na duże wartości liczbowe. W związku z tym chciałbym zmienić prescaler dla częstotliwości niższych niż 10kHz (domyślnie działam na prescalerze = 1), co automatycznie zmniejszy mi wartości liczbowe dla ICR1 i OCR1A. I tutaj pojawia się moje pytanie, czy jest możliwość zmiany prescalera w trakcie działania programu? Jeśli tak, to jak to zrobić? Próbowałem zmieniać bit TCCR1B, ale niestety bez rezultatów. Pracuję na ATmega16 w języku C.
Jestem w trakcie budowy generatora sygnału PWM o zmiennym wypełnieniu oraz częstotliwości. Wypełnienie 0-100% co 5%, częstotliwość 1-50 kHz co 1 kHz (plus kilka częstotliwości poniżej 1k). Generator będzie częścią nieco większego projektu.
Całość ma działać mniej więcej w taki sposób: odpalam timer1 w trybie PWM z korekcją fazy i częstotliwości (tryb 8 w tym uC), robię odczyt z ACD (potencjometr 1), w zależności od odczytu podstawiam odpowiednią wartość pod ICR1 (który ustala mi wartość TOP przy zliczaniu impulsów (mam już zadaną częstotliwość)), robię odczyt ADC (potencjometr 2), w zależności od odczytu wybieram wypełnienie, liczę wypełnienie na podstawie pomiaru i ICR1, podstawiam obliczoną ilość taktów pod OCR1A (który odpowiada za zmianę stanu). Wszystko ładnie pięknie, działa tak jak chcę, ale niestety tylko powyżej 10kHz. Przy niższych częstotliwościach wypełnienie wariuje. Wydaje mi się, że program gubi się przy obliczaniu wypełnienia, ze względu na duże wartości liczbowe. W związku z tym chciałbym zmienić prescaler dla częstotliwości niższych niż 10kHz (domyślnie działam na prescalerze = 1), co automatycznie zmniejszy mi wartości liczbowe dla ICR1 i OCR1A. I tutaj pojawia się moje pytanie, czy jest możliwość zmiany prescalera w trakcie działania programu? Jeśli tak, to jak to zrobić? Próbowałem zmieniać bit TCCR1B, ale niestety bez rezultatów. Pracuję na ATmega16 w języku C.
