Operácie

Elektronická škrtiaca klapka: Rozdiel medzi revíziami

Z SensorWiki

(Algoritmus a program)
(Algoritmus a program)
Riadok 103: Riadok 103:
 
unsigned int adc_read(char a_pin);
 
unsigned int adc_read(char a_pin);
 
</source></tab>
 
</source></tab>
<tab name="uart.c"><source lang="c++" style="background: LightYellow;">
+
<tab name="adc.c"><source lang="c++" style="background: LightYellow;">
/* ************************************************************************* */
+
#include <stdio.h>
/* FileName:            uart.c                                              */
+
#include "adc.h"
/* ************************************************************************* */
 
  
#include <avr/io.h>
+
void adc_init(void){
#include <util/delay.h>
+
ADMUX=(1<<REFS0);
#include "uart.h"
+
ADCSRA=(1<<ADEN)
 
+
|(1<<ADPS2)|(1<<ADPS2)|(1<<ADPS0);
void hw_init( void )
 
{  
 
  DDRB |= (1<<LED);   // PORTB.5 kde je LED ma byt OUTPUT
 
  /* sem si mozete dopisat svoje vlastne inicializacne prikazy */
 
}
 
 
 
void uart_init( void )
 
{
 
//  for different BAUD rate change the project settings, or uncomment
 
//  following two lines:
 
// #undef  BAUD          // avoid compiler warning
 
//  #define BAUD 115200
 
 
  #include <util/setbaud.h>  // requires defined BAUD
 
 
 
  UBRR0H = UBRRH_VALUE;
 
  UBRR0L = UBRRL_VALUE;
 
  #if USE_2X                // defined in setbaud.h
 
    UCSR0A |= (1 << U2X0);
 
  #else
 
    UCSR0A &= ~(1 << U2X0);
 
  #endif
 
 
 
 
 
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
 
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */
 
}
 
 
 
 
 
int uart_putc( char c, FILE *stream )
 
{
 
  if (c == '\n')
 
      uart_putc('\r',stream);
 
 
 
  loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
 
  UDR0 = c;
 
  return 0;
 
}
 
 
 
 
 
void uart_puts(const char *s)
 
{
 
  /* toto je vasa uloha */
 
}
 
 
 
char uart_getc(void)
 
{
 
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
 
    return UDR0;
 
 
}
 
}
  
void delay(int delay)     // vlastna funkcia pre dlhsie casy
+
unsigned int adc_read(char a_pin){
{
+
a_pin &=0x07;
  for (int i=1; i<=delay; i++)
+
ADMUX =(ADMUX & 0xF8)|a_pin;
  _delay_ms(1);
+
ADCSRA |=(1<<ADSC);
 +
while(ADCSRA & (1<<ADSC));
 +
return (ADC);
 
}
 
}
  

Verzia zo dňa a času 17:42, 26. máj 2024

Záverečný projekt predmetu MIPS / LS2024 - Peter Szovics


Zadanie

Zostrojte a naprogramujte ovladanie škrtiacej klapky pomocou plynového pedálu.



Vývojová doska Arduino UNO R3

Literatúra:


Analýza a opis riešenia

Témou mojej semestrálnej práce som si vybral ovládanie škrtiacej klapky pomocou plynového pedálu. Zapojenie a vypracovanie projektu je inšpirované cvičením 8 (http://senzor.robotika.sk/sensorwiki/index.php/A/D_prevodn%C3%ADk).


Súčiastky a diely ktoré boli použité na zostrojenie projektu:

• elektronický plynový pedál (1K2 721 503 AJ)
• elektronická škrtiaca klapka (047 133 062)
• sacie potrubie (047 129 743 G)
• arduino r3 doska (Microchip ATmega328P)
• adaptér 230V/9V (ASSA107E-090100)
• napatovy stabilizator (7805)
• mosfet transistor (IRF540N)
• rezistory 1kΩ, 220Ω
• breadboard (MB-102 830/400)
• duPont káble M-M - 40x, 40 cm
Presný opis fungovania elektrického obvodu:

Adaptér zapojený do siete konvertuje 230V AC na 9V DC, V akej pozícií je pedál toľko energie sa vysiela na pohon škrtiacej klapky, preto sa klapka začne hýbať až po prekročení 40% zatlačenia pedálu, aby sme predišli tomuto neefektívnemu ovládaniu a chceliť docieliť identický pohyb klapky a pedálu tak som pre budúce vylepšovanie do projektu zakomponoval aj predprípravu (arduino výstup A3, A1 a A2) na spatnovazobný regulátor aby Škrtiaca klapka presne kopírovala polohu pedálu.

ELEKTRONICKÁ SCHÉMA

Vizuálna reprezentácia PWM (Pulse width modulation), šírka impulzu sa mení podla závislosti zatlačenia pedálu.

ZÁZNAM Z OSCILOSKOPU


Algoritmus a program

Celý kód som použil z 8 cvičenia, kde sme sa mohli naučiť ovládať ledku pomocou PWM, kód je napísaný v jednom .c súbore – na spustenie treba 2 knižnice.

#include <avr/io.h>
#include "uart.h"
#define F_CPU 16000000UL
#define BAUDRATE       9600
#include <stdio.h>
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
                              
int main(void)
{
  adc_init();
  hw_init();
  uart_init();
  stdout = &mystdout;          
  unsigned int measuredValue;

  DDRD|=(1<<PD6);       


  

  TCNT0=0;                        

  OCR0A=0;                      
  

                                 

  TCCR0A|=(1<<COM0A1)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00);

  TCCR0B|=(1<<CS02)|(1<<CS00);      
  
  while(1)
  {
	measuredValue = adc_read(4);
	printf("hodnota: %04d \r",measuredValue);
	
	OCR0A=measuredValue/4;
  }
  
  return(0);
}
#include <avr/io.h>

void adc_init(void);                                  

unsigned int adc_read(char a_pin);
#include <stdio.h>
#include "adc.h"

void adc_init(void){
	ADMUX=(1<<REFS0);
	ADCSRA=(1<<ADEN)
		|(1<<ADPS2)|(1<<ADPS2)|(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);
}

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.