Uživatel:Vicarpet

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(vybrana semestralni prace:)
Řádka 213: Řádka 213:
BCD převodník HCF4056BE
BCD převodník HCF4056BE
Sedmisegmentovky HDSP-F203
Sedmisegmentovky HDSP-F203
 +
 +
=== Realizace ===
 +
[[Soubor:MAM.jpg]]
== Tým ==
== Tým ==

Verze z 13. 5. 2010, 11:02

petr vičar


Obsah

vybrana semestralni prace:

Ovládání ventilátoru teplovzdušného rozvodu

Myslenka: k mikroprocesoru pripojen dvojmistny sedmisegmentovy displey - zobrazuje stridave nastavenou teplotu vs. teplotu skutecnou pomoci dvou tlacitek regulace nastavene teploty vetrak spinan tranzistorem mereni teploty LM35.


schema zdrojak do Eagle prezentace PDF prezentace ODP - má to být na pár minut, tak myslím že to takhle stačí

Zakmity

Proste tlačítko neudelá normální prechod 0-1, ale párkrát zakmitá, takze se objevi cca neco takovýdleho ..01000110010001111111... Vyresíme jednoduse, pokud prijde interup pockame cca 20ms a pak teprve prectem hodnotu, jde to resit i hw, ale tohle je jednodussí.

--Jiří Zikmund 9. 5. 2010, 14:48 (UTC)

Obávám se, že nikdo nezaručí, že za 20ms tam bude určitě tutová 0. Co takhle to řešit prvním přečtením, pak 20ms počkat a znova přečíst, porovnat a když to bude stejný, tak je to OK a pokračujem dál? Ale to je jen takovej nápad. Jestliže bude vstupem třeba PD.2 viz schéma, zkusil bych jít třeba tudy:

no zaruci, tak spatny tlacitka aby to kmitalo dele nez 20ms sem snad mit nebudeme :)

První nástřely tlačítek v C

- jsou to dvě tlačítka, jedno má teplotu o stupeň snížit a druhé zvýšit, porty jsou podle schématu

Měření teploty

Tady bych se přikláněl k měření přes A/D převodník s teploměrem LM35

Řeší problém kalibrace (vnitřní kompenzací teploty) sám o sobě (dokonce je kalibrován na °C, má velmi malou spotřebu, rozlišení 10mV/°C), tak uvidíme, jak se k tomu vyjádří případně vedoucí cvičení. Pouzdro asi ještě doladíme, zatím LM35DZ v TO-92 (pakliže nebude třeba měřit záporné teploty), vychází nejlevněji.

Jiří Zikmund 19. 4. 2010, 17:16 (UTC)

--Jiří Zikmund 9. 5. 2010, 14:48 (UTC)

Takže měření teploty... použijeme vnitřní 10-bitový A/D převodník s vnitřním referenčním napětím 1,1V, vstup ADC2, výstup PB2



Kód

//------------------------------------------------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>

#define xtal 1000000 //kmitocet krystalu 1MHz

#define TMR_CNT 65536 - 97 // cas / 1024 / 1000000, cas v sec, pro 0.1 sec


//------------------------------------------------------------------------------
unsigned char kteryudaj = 0;//stara se o vyber udaje co bude zobrazen (0..teplota)
volatile int teplota = 20; // Zmerena teplota 
volatile int Tnastavena = 20; //Nastavena teplota


void UpdateOutput();
//------------------------------------------------------------------------------
//zpusobi usnuti mikroprocesoru
void usni(void)
{
	SMCR = 1;
}

//------------------------------------------------------------------------------
//je zavolano pri stisku libovolneho tlacitka
void preruseni (void)
{ 
	unsigned char portVal = PINC;

	do {
		portVal = PINC & 0x30;
		_delay_ms(20);
	} while(portVal != (PINC & 0x30));
       
	if((portVal & 0x30) == 0x20)
	{
		//prvni
		Tnastavena++;
		kteryudaj = 10;
	}
	if((portVal & 0x30) == 0x10)
	{
		//druhy
		Tnastavena--;
		kteryudaj = 10;
	}
} 


//------------------------------------------------------------------------------
//hlavni cast, nastavy procesor a uspi ho
void ShowDisplay(unsigned char num)
{
	PORTD = (PORTD & 0xF0) | (num / 10);
	PORTC = PORTC | 0x02;
	_delay_ms(1);
	PORTC = PORTC & 0xFD;

	PORTD = (PORTD & 0xF0) | (num % 10);
	PORTC = PORTC | 0x08;
	_delay_ms(1);
	PORTC = PORTC & 0xF7;

}

//------------------------------------------------------------------------------
int PrectiAdc()
{
		while((ADCSRA & (1 << ADIF)) == 0);
        int iAdcValue = ADCW;
		return((iAdcValue * 28) >> 8);
}

//------------------------------------------------------------------------------
SIGNAL(PCINT1_vect)
{
	preruseni(); 
}

//------------------------------------------------------------------------------
SIGNAL(TIMER1_OVF_vect)
{
	teplota = PrectiAdc();
	if(kteryudaj > 0)
	{
		ShowDisplay(Tnastavena);
		kteryudaj--;
	}
	else
		ShowDisplay(teplota);
	
	UpdateOutput();

	TCNT1 = TMR_CNT;
	
	// uspani
	usni();
}

//------------------------------------------------------------------------------
void InitAdc()
{
    ADMUX = (1 << REFS1) | (1 << REFS0) | 2; // Reference 1.1V, kanal ADC2
    ADCSRA = (1 << ADEN) | (1 << ADATE) | 7; // Povoleni ADC, preddelicka 128
    ADCSRB = 6; // start pri preteceni T1
}


//------------------------------------------------------------------------------
void UpdateOutput()
{
	if(teplota > Tnastavena)
		PORTD = (PORTD & 0x7F) | 0x80;
	if(teplota < Tnastavena - 10)
		PORTD = PORTD & 0x7f; 
}



//------------------------------------------------------------------------------
//zakladni nastaveni portu
void InitPorts()
{
	DDRD = 0x8F;
	DDRC = 0x0A;

	PCICR = 0x02;
	PCMSK1 = 0x30;
}
//------------------------------------------------------------------------------

void InitTimer1()
{
	TCCR1A = 0;
	TCCR1B = 5; // delicka 1024
	TCCR1C = 0;
	TCNT1 = TMR_CNT;
	TIMSK1 = 1; // povoleni preruseni od preteceni
}

//------------------------------------------------------------------------------
int main()
{
	InitPorts();
    InitAdc();
        InitTimer1();
	sei();


 	while(1);   //nekonecna smycka, aby neskoncil main
    return (0);
}
//------------------------------------------------------------------------------

Datasheets

Teploměr LM-35 BCD převodník HCF4056BE Sedmisegmentovky HDSP-F203

Realizace

Soubor:MAM.jpg

Tým

Petr Vičar
Jachym Simak - simakjac@fel.cvut.cz
Jiří Zikmund
Osobní nástroje