Riadenie polohy klapky klimatizácie
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2024 - Peter Fedor
Zadanie
Úlohou tohto zadania je riadenie polohy klapky klimatizácie, ktorá sa bežne používa v dnešných automobiloch.
![](/sensorwiki/images/thumb/8/86/Klapka.jpg/400px-Klapka.jpg)
Literatúra:
- [1] - datasheet k motorčeku, ktorý je použitý v klapke
Analýza a opis riešenia
Mechanizmus ovládania klapky klimatizácie je zložený z DC motorčeka, potenciometra a súkolia na prevod. My budeme ovládať daný systém jedným potenciometrom, ale ako? Chceme zostrojiť kód na ovládanie polohy DC motora s použitím dvoch potenciometrov: jeden na nastavenie želanej polohy a druhý na snímanie aktuálnej polohy motora. Z potenciometra pre nastavenie želanej hodnoty budeme snímať hodnotu potenciometra, ktorú cez A-D prevodník spracujeme pre ďalšie porovnávania.
Takto vyzerá mechanizmus ovládania klapky vnútri. Môžeme tam vidieť obyčajný jednosmerný motor s filmovým kondenzátorom, šnekový prevod(na zabránenie voči samovoľnému pohybu klapky) so súkolím, na ktorého poslednom koliečku je snímací potenciometer. Tento obvod funguje sám o sebe ako regulačný obvod.
![](/sensorwiki/images/thumb/a/a0/Vnutro.jpg/400px-Vnutro.jpg)
Schéma zapojenia je zobrazená na obrázku nižšie:
![](/sensorwiki/images/thumb/d/d7/Schemazap.jpg/400px-Schemazap.jpg.png)
Algoritmus a program
Celý program pozostáva s viacerých súborov/knižníc. Pre funkciu motora som si vytvoril osobitný kód, ktorý budem volať funkciou v hlavnej slučke. Rovnako s funkciou A/D prevodníka.
#include <avr/io.h>
#include <util/delay.h>
#include "adc.h"
#include "motor.h"
// Nastavenie pinov
#define nastav_poten 0
#define snim_poten 1
#define motor_pin1 PB4
#define motor_pin2 PB5
int main(void) {
// Inicializácia ADC
adc_init();
// Nastavenie pinov motora ako výstup
DDRB |= (1 << motor_pin1) | (1 << motor_pin2);
while (1) {
// Želaná poloha z nastavovacieho potenciometra
uint16_t pozicia_nastav = adc_read(nastav_poten);
// Aktuálna poloha z potenciometra pre spätnú väzbu
uint16_t pozicia_snim = adc_read(snim_poten);
// Rozdiel medzi želanou a aktuálnou polohou
int rozdiel_pozicie = pozicia_snim-pozicia_nastav;
// Ak je rozdiel velký, otácaj motorom
if (rozdiel_pozicie > 10) {
smer_otacania(1); // Otácaj v jednom smere
} else if (rozdiel_pozicie < -10) {
smer_otacania(-1); // Otácaj v opacnom smere
} else {
smer_otacania(0); // Zastav motor
}
// Krátka pauza pre stabilitu
_delay_ms(100);
}
}
#include <avr/io.h>
void adc_init(void){
ADMUX = (1<<REFS0);
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}
unsigned int adc_read(char a_pin){
a_pin &= 0x07;
ADMUX = (ADMUX & 0xF8) | a_pin;
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
return(ADC);
}
#ifndef INCFILE1_H_
#define INCFILE1_H_
#endif /* INCFILE1_H_ */
void adc_init(void);
unsigned int adc_read(char a_pin);
#include <avr/io.h>
// Nastavenie pinov pre motor
#define motor_pin1 PB4
#define motor_pin2 PB5
// Nastavenie smeru otacania motora
void smer_otacania(int smer) {
if (smer == 1) {
PORTB |= (1 << motor_pin1);
PORTB &= ~(1 << motor_pin2);
} else if (smer == -1) {
PORTB |= (1 << motor_pin2);
PORTB &= ~(1 << motor_pin1);
} else {
PORTB &= ~(1 << motor_pin1);
PORTB &= ~(1 << motor_pin2);
}
}
#ifndef INCFILE1_H_
#define INCFILE1_H_
#endif /* INCFILE1_H_ */
void smer_otacania(int smer);
Zdrojový kód je možné stiahnuť kliknutím na odkaz nižšie:
Zdrojový kód: zdrojovykod.zip
Overenie
Na koniec nahráme kód do mikroprocesora a môžeme testovať! Ako vidíme na videu, všetko funguje a klapka reaguje na zmenu polohy potenciometra.
![](/sensorwiki/images/thumb/f/fa/Mahleklapka.jpg/400px-Mahleklapka.jpg)
Video: