piątek, 29 kwietnia 2016

Fun with Fan part 2

Hardware poskładany, czas przysporzyć trochę problemów software'owcom.

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:
double minTemperature = 23.5;
double maxTemperature = 24.6875;
view raw minmax.c hosted with ❤ by GitHub

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.
uint8_t maxFanSpeed = 255;
uint8_t minFanSpeed = 80;
uint8_t fanSpeed = minFanSpeed;
view raw fanParameters.c hosted with ❤ by GitHub


Teraz konfiguracja PWM i termometru (podłączamy go jak ostatnio). Włączamy przerwania.
// 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();
view raw pwm-ds-config.c hosted with ❤ by GitHub


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 ;)

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);
}
view raw main.c hosted with ❤ by GitHub


I tyle - teraz tylko testować, dobierać parametry i na produkcję!

PS kodzik jak zwykle na githubie.

Brak komentarzy:

Prześlij komentarz