Nasz program powinien przyspieszyć obroty wiatraczka w momencie, gdy temperatura wzrośnie ponad zdefiniowane maksimum i wrócić do jałowych obrotów w momencie, gdy spadnie poniżej założonego minimum. Proste. Zatem do dzieła.
Zdefiniujmy nasze wartości graniczne:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
double minTemperature = 23.5; | |
double maxTemperature = 24.6875; |
Oraz zdefiniujmy graniczne obroty wentylatora. Operujemy na 8-bitowym timerze w ramach naszego PWM, zatem maksymalną prędkość określimy na 255, minimalną na 80 - wartość dobrana eksperymentalnie - możnaby się też pokusić o wyliczenia... 80 jest spoko.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
uint8_t maxFanSpeed = 255; | |
uint8_t minFanSpeed = 80; | |
uint8_t fanSpeed = minFanSpeed; |
Teraz konfiguracja PWM i termometru (podłączamy go jak ostatnio). Włączamy przerwania.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Fast PWM mode | |
TCCR0 |= (1 << WGM01) | (1 << WGM00); | |
// OC0 enabled, clear on match | |
TCCR0 |= (1 << COM01) | (1 << COM00); | |
// timer0 clock source prescaler | |
TCCR0 |= (1 << CS00); | |
// pin OC0 as output | |
DDRB |= (1 << PB0); | |
STRONG_PULL_UP_DDR |= (1 << STRONG_PULL_UP_PIN); | |
// initialize interrupts | |
sei(); |
W nieskończonej pętli będziemy odczytywać temperaturę, modyfikować prędkość wentylatora, a następnie odpowiadającą jej wartość wpisywać do rejestru OCR0. Skomplikowane działanie odejmowania wymuszone jest konfiguracją PWM (clear on match). Odwracając logikę konfiguracji możemy pozbyć się odejmowania. Zostawiam tak, jako przykład akademicki ;)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
while(1) | |
{ | |
PORTC &= ~(1 << 1); | |
ReadTemperature(); | |
if (temperature < minTemperature && fanSpeed > minFanSpeed) | |
{ | |
fanSpeed -= 1; | |
} | |
else if (temperature > maxTemperature && fanSpeed < maxFanSpeed - 20) | |
{ | |
fanSpeed += 1; | |
} | |
OCR0 = 255 - fanSpeed; | |
_delay_ms(500); | |
} |
I tyle - teraz tylko testować, dobierać parametry i na produkcję!
PS kodzik jak zwykle na githubie.