Witam
Przygotowuję dość prosty projekt zgodnie z opisem z tematu. Mam wentylator 12V, czujnik DS18B20. Wszystko jest podłączone i działa poprawnie (sprawdzałem oczywiście osobno na wszelakie sposoby). Czujnik temperatury obsługuję przez bibliotekę z Bluebooka, także nie będę podawał tutaj jej kodu. Dodam tylko, że temperatura odczytywana jest
raz na 3 sekundy.
Problem, który mam, pojawia się przy próbie płynnego sterowania obrotami wentylatora. Realizuję ją oczywiście przez
PWM.
Utworzyłem sobie pomocniczą zmienną:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dla wyjaśnienia, zmienna
cel to wartość całkowita temperatury, a zmienna
cel_fract_bits to wartość dziesiętna temperatury.
Gdy temperaturę zmieniam skokowo za pomocą tego fragmentu kodu, to wszystko działa prawidłowo, co potwierdza zarówno fizyczne działanie wentylatora, jak i wyświetlacz:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zaznaczam, że obroty rosną wraz ze wzrostem temperatury powyżej 20, 23 i 26 stopni C, i odpowiednio spadają.
Zmienna
i jest typu
uint16_t. Timer2 działa prawidłowo.
Jednak gdy próbuję regulować temperaturę stopniowo, aby szerokość impulsu rozkładała się pomiędzy 0, a 255 dla zakresu temperatur 20-40 C, to program nie działa już prawidłowo:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Podejrzewam, że winowajcą jest działanie
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
powodujące nieprawidłowe przypisanie wartości do rejestru OCR2. Efekt jest taki, że OCR2 zawsze przyjmuje wartość 0 (widoczne na wyświetlaczu).
Rozwiązanie jest zapewne proste, ale nie mogę na nie wpaść, także bardzo proszę o pomoc.