Operácie

Riadenie polohy klapky klimatizácie: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 28: Riadok 28:
=== Algoritmus a program ===
=== Algoritmus a program ===


Algoritmus programu je....
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.




<tabs>
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
<tab name="main"><source lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include "adc.h"
#include "motor.h"


int main(void)
// Nastavenie pinov
{
#define nastav_poten 0
  unsigned int measuredValue;
#define snim_poten 1
#define motor_pin1 PB4
#define motor_pin2 PB5


  while (1)
int main(void) {
  {
    /*  relax  */ 
  }


  return(0);
// 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);
    }
}
}


</source></tab>
</source></tab>
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
<tab name="adc.c"><source lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>


void adc_init(void);                                   // A/D converter initialization
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);
}
 
 
 
</source></tab>
<tab name="adc.h"><source lang="c++" style="background: LightYellow;">
#ifndef INCFILE1_H_
#define INCFILE1_H_
#endif /* INCFILE1_H_ */
 
void adc_init(void);


unsigned int adc_read(char a_pin);
unsigned int adc_read(char a_pin);
</source></tab>
<tab name="motor.c"><source lang="c++" style="background: LightYellow;">
#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);
    }
}
</source></tab>
</source></tab>
</tabs>
<tab name="motor.h"><source lang="c++" style="background: LightYellow;">
#ifndef INCFILE1_H_
#define INCFILE1_H_
#endif /* INCFILE1_H_ */
 
void smer_otacania(int smer);
 
 
 


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':  

Verzia z 19:07, 16. máj 2024

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.

Mechanizmus ovládania klapky klimatizácie, ktorý budem používať.

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.

RGB LED.

Nezabudnite doplniť schému zapojenia!

Schéma zapojenia LCD displeja.


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.


<tabs>

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

<tab name="motor.h"><source lang="c++" style="background: LightYellow;">

  1. ifndef INCFILE1_H_
  2. define INCFILE1_H_
  3. endif /* INCFILE1_H_ */

void smer_otacania(int smer);



Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip


Overenie

Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.

Aplikácia.

Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.