6.2. rauta Analogia Komparaattori Ohjelmointia

9
1 6.2. AVR_rauta. Analogia-komparaattori-ohjelmointia 12.12.2007, pva ”Joka hitaasti kulkee, se kauaksi pääsee”. - tuntematon Sisältö yleistä rekisterit analogiavertailijan käyttö - jännitevahti - audiokytkin - kapasitanssimittari Yleistä Analoginen komparaattori, vertailija, on hyödyllinen kytkentä vertailtaessa kahta analogista signaalia keskenään. Esim. vertailija voi verrata lämpötila-anturin antamaa jännitearvoa vertailujännitteeseen. Tai valvoa akun käyttöjännitettä samoin metodein. Riippuen siitä, onko tuo anturin antama jännite suurempi tai pienempi verrattuna referenssiin, tehdään jotain. Komparaattori, jännitteenvertailija, voi olla erillinen oma komponentti, tai se voidaan tehdä operaatiovahvistimesta, jonka vahvistusta pienentävä takaisinkytkentä jätetään pois (tai se on pieni). Operaatiovahvistimella on kaksi sisääntuloa, joiden välistä jännite-eroa vahvistin vahvistaa. Vahvistusta säädetään takaisinkytkennällä (vastakytkentä). Samoin on komparaattorin laita, mutta sen vahvistus asetetaan niin suureksi, että lähtö on aina joko positiivisessa tai negatiivisessa maksimijännitteen arvossa. Analogiakomparaattoria voidaan käytää moneen tarkoitukseen. - jännitevahti, tasonilmaisu - audio- tms kytkin - kapasitanssimittari - jne... Eräs mielenkiintoinen sovellus on tehdä analogiakomparaattorista yksinkertainen AD-muunnin. Atmelilta löytyy monta dokumenttia ja ohjetta aiheesta. Kannattaa tutustua, tässä yhteydessä aihetta ei käsitellä.

Transcript of 6.2. rauta Analogia Komparaattori Ohjelmointia

Page 1: 6.2. rauta Analogia Komparaattori Ohjelmointia

1

6.2. AVR_rauta. Analogia-komparaattori-ohjelmointia 12.12.2007, pva ”Joka hitaasti kulkee, se kauaksi pääsee”. - tuntematon Sisältö yleistä rekisterit analogiavertailijan käyttö - jännitevahti - audiokytkin - kapasitanssimittari Yleistä Analoginen komparaattori, vertailija, on hyödyllinen kytkentä vertailtaessa kahta analogista signaalia keskenään. Esim. vertailija voi verrata lämpötila-anturin antamaa jännitearvoa vertailujännitteeseen. Tai valvoa akun käyttöjännitettä samoin metodein. Riippuen siitä, onko tuo anturin antama jännite suurempi tai pienempi verrattuna referenssiin, tehdään jotain. Komparaattori, jännitteenvertailija, voi olla erillinen oma komponentti, tai se voidaan tehdä operaatiovahvistimesta, jonka vahvistusta pienentävä takaisinkytkentä jätetään pois (tai se on pieni). Operaatiovahvistimella on kaksi sisääntuloa, joiden välistä jännite-eroa vahvistin vahvistaa. Vahvistusta säädetään takaisinkytkennällä (vastakytkentä). Samoin on komparaattorin laita, mutta sen vahvistus asetetaan niin suureksi, että lähtö on aina joko positiivisessa tai negatiivisessa maksimijännitteen arvossa. Analogiakomparaattoria voidaan käytää moneen tarkoitukseen.

- jännitevahti, tasonilmaisu - audio- tms kytkin - kapasitanssimittari - jne...

Eräs mielenkiintoinen sovellus on tehdä analogiakomparaattorista yksinkertainen AD-muunnin. Atmelilta löytyy monta dokumenttia ja ohjetta aiheesta. Kannattaa tutustua, tässä yhteydessä aihetta ei käsitellä.

Page 2: 6.2. rauta Analogia Komparaattori Ohjelmointia

2

AVR ATmega32, Analog Comparator, rakenne ja rekisterit Useimmissa AVR-ohjaimissa on sisäänrakennettu komparaattori. Sisääntuloja on kaksi:

AIN0 on positiivinen tulo ja AIN1 on negatiivinen tulo.

Kuva 6.2.1. Analogiakomparaattorin lohkokaavio.

Analoginen komparaattori vertaa positiivisen tulonavan AIN0 (PORTB.2) ja negatiivisen tulonavan AIN1 (PORTB.3) välistä jännitettä. Kun AIN0 > AIN1, => ACO = 1 Kun AIN1 > AIN0, => ACO = 0 Komparaattorin lähtö voi liipaista T/C1:n Input Capture toiminnon, tai se voi liipaista oman keskeytyksen.

"The Analog Comparator compares the input values on the positive input AIN0 (PB0) and the negative input PB1(AIN1). When the voltage on the positive input PB0 (AIN0) is higher than the voltage on the negative input PB1 (AIN1), the Analog Comparator Output, ACO is set (one)."

Page 3: 6.2. rauta Analogia Komparaattori Ohjelmointia

3

Rekisterit SFIOR, Special Function IO Register Bitti 7 6 5 4 3 2 1 0 Rekisteri ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10

Bitti Nimi Merkitys Toiminto 3 ACME Analog Comparator Multiplexer Enable 0: AIN1->neg_in, 1: mpx_in

Kun ACME on 1 ja ADC (Analog Digital Conversion) on kytketty pois (ADEN in ADCSRA = 0), ADC:n multiplekseri valitsee datan komparaattorin negatiiviseen tuloon, kts. tarkemmin mega32-dokumentissa table 80, sivulla 198. Kun bitti on 0, AIN1 on johdettu negatiivisen komparaattori-tuloon. ACSR, Analog Comparator Status Register, sillä voidaan valita:

- valitaan input - enable/disable interrupt - valitsee keskeytyksen tilan

ACSR, Analog Comparator Control and Status Register Bitti 7 6 5 4 3 2 1 0 Nimi ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0

Bitti Nimi Merkitys Toiminto 7 ACD Analog Comparator Disable 0: komparaattori ON, 1: komparaattori OFF 6 ACBG Analog Comparator Bandgap Select 1: AINO = 1,23 V, sisäisesti (Input Voltage Reference) 5 ACO Analog Comparator Output Comparaattorin anto on synkronoitu ja kytketty ACO

voidaan käyttää Timer1 Capturen liipaisuun 4 ACI Analog Comparator Interrupt Flag asettuu 1, kun komparaattori aiheuttaa keskeytyksen 3 ACIE Analog Comparator Interrupt Enable 1: komparaattori-keskeytys sallittu, 0: estetty 2 ACIC Analog Comparator Input Capture Enable 1: komparaattori liipaisee T/C1:n Input Capture toiminnon

0: ei yhteyttä komparaattorin ja Capture-toiminnon välillä 1 ACIS1 0 ACIS0

Analog Comparator Interrupt Mode Select

toiminta-mode valitaan alla olevan taulukon mukaan

Jotta komparaattori liipaisee T/C1 Input Capture keskeytys-toiminnon, TICIE1-bitin on oltava ’1’ TIMSK-rekisterissä.

ACIS1 ACIS0 Interrupt Mode Select, Keskeytyksen valinta 0 0 Comparator Interrupt on Output Toggle, lähdön tila vaihtuessa 0 1 Reserved 1 0 Comparator Interrupt on Falling Output Edge, laskevasta reunasta 1 1 Comparator Interrupt on Rising Output Edge, nousevasta reunasta

Jos et tarvitse analogia-komparaattori, se kannattaa sähkön säästämiseksi kytkeä pois päältä, eli ACSR = 1<<ACD Analogia-digitaalimuuntimen tulot ADC0 ... ADC7 on valittavissa analogiakomparaattoirn negatiiviseen tuloon AIN1. Tutki tarkemmin Atmelin ATmega32-dokumentista. ISR(ANA_COMP_vect) { // koodia }

Page 4: 6.2. rauta Analogia Komparaattori Ohjelmointia

4

Analogiavertailijan käyttö Vertailijaa voidaan käyttää monella tavalla moneen eri tarkoitukseen. Jos ymmärtää perustoiminnan sen jälkeen voi itse kehitellä lisää. Seuraavassa esitetään vain opetustarkoitukseeen kehitettyjä esimerkkejä analogiakomparaattorin käytöstä. Perusidea: Pollataan ACSR-rekisterin AC0-bittiä, eli komparaattorin lähdön tilaa Pollataan ACSR-rekisterin ACI-bittiä, eli keskeytyslipun tilaa. Tai määritetään keskeytys ja keskeytysfunktio. ”Oikea kytkentä”: AIN1 kytketään 2.5V ja sitten AIN0 voi olla 0V tai 5V, ja kytkentä toimii takuuvarmasti. Keskeytyksen käyttö: nollaa keskeytyslippu ensin ja sitten ACIS1/ACS0 (nollaamalla ne keskeytys on valittu on toggle). salli globaali keskeytys ( sei(); ). mahdollista analogiakomparaattorin keskeytys asettamalla ACSR-rekisterin ACIE-bitti. 1. Jännitevahti Tehdään yksinkertainen esimerkki analogisen vertailijan käytöstä. Se on jännitteen tason ilmaisin, jännitevahti. Voidaan käyttää esimerkiksi akkujännitteen valvontaan. Kytkentä on kuvassa 6.x.

Kuva 6.2.2. Jännitevahti. Toiminta Vastuksilla R3 ja R4 tehdään vertailu- eli referenssijännite analogiakomparaattorin tulonapaan AIN1. Kaavion arvoilla jännite on noin 2,5 V. Jännitteen arvo riippuu vastusten toleransseista, se ei ole oleellista. Komparaattorin AIN0 tuloon on liitetty vertailtava jännitetaso, se tehdään potentio-metrillä R1. R2 on suojavastus. Säädä potikan liun jännitteeksi 0 Volttia. Resetoi piiri. A-portin LED-diodi 7 vilkkuu verkkaisesti ja vieressä muut ovat pimeitä. Säädä, hyvin varovasti, potentiometrin liukua niin, että AIN0-jännite nousee. Kun LED-diodi pinnissä 0 alkaa loistamaan, lopeta säätö ja mittaa AIN0-jännite. Sen tulisi olla yli 2.5 V. Uusi toiminnot, tutki kaaviota ja koodia kunnes homma OK.

Page 5: 6.2. rauta Analogia Komparaattori Ohjelmointia

5

Jännitevahti, ohjelma /************************************************** ******** Project : ana_u_vertailija.c Hardware: PV-M32 + lisämoduuli (rakenna PV:n ohjeen mukaan) PV-LEDIT on PORTA. Software: AVRStudio4.13 + WinAVR-20070525 Date : 12.11.2007 Author : pva Comments: analogiakomparaattori vahtii AIN0-jännite ttä, kun se on suurempi kuin AIN1 -> interrupt AIN1 jännite on noin = 2,5 V (riippuu vastuksista) resetoi, led PD.7 vilkkuu. Säädä potikalla AIN0 jännitettä kunnes PD.0 LED loi staa jatkuvasti. Mittaa jännitteet, tutki erot, toista. *************************************************** ********/ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> // *** Primitive wait() *** void wait(uint16_t time) { volatile uint16_t i; for(i=0;i<2000;i++) _delay_loop_2(time); } // analogiavertailijan keskeytysohjelma ISR(ANA_COMP_vect) { PORTA = 1<<0; // PA.0 LED ON } int main(void) { DDRA = 0xFF; ACSR |= 1<<ACIE; // keskeytys ON ACSR |= (1<<ACIS1) | (1<<ACIS0); // analogiavertailijan keskeytys ACO:n nousevast a reunasta // eli kun AIN0 > AIN1 ACO:n nouseva reuna-->int errupt sei(); // globaali keskeytyksen sallinta while(1) { PORTA |= _BV(7); // BitValue 7-bitti '1', | -OR wait(200); PORTA &= ~_BV(7); // BitValue 7-bitti '0', & -AND wait(200); } }

Analysointi Analogiakomparaattorin ohjausrekisterin, ACSR, sisältö ei kaivanne analysointia, koodin kommentit riittää.. Vinkki Tästä voisi kehittää esimerkiksi johonkin akkukäyttöiseen laitteeseen jännitevahdin, joka indikoi summerilla akun jännitteen laskemisen.

Page 6: 6.2. rauta Analogia Komparaattori Ohjelmointia

6

2. Audiokytkin

Mikrofonin tulee olla ns. elektreteetti-tyyppinen. Kun mikrofonin antama jännitetaso ylittää potentitometrillä R1 asetetun referenssitason, koodin mukaan hypätään keskeytysaliohjelmaan. Analogiakytkimen koodi /************************************************** ******** Project : ana_audio_sw.c Hardware: PV-M32 + lisämoduuli (rakenna PV:n ohjeen mukaan) PV-LEDIT on PORTA. Software: AVRStudio4.13 + WinAVR-20070525 Date : 12.11.2007 Author : pva Comments: analogiakomparaattori vahtii AIN0-jännite ttä, kun se on suurempi kuin AIN1 -> interrupt AIN1 jännite säädetään potikalla noin = 2,5 V (arvo riippuu mikrofonista ja muista komponenteista. Kokeile sopi va). Resetoi, led PD.7 vilkkuu. AIN0-pinniin on kytketty elektreteettimikrofoni, ku n sen antama äänen voimakkuuteen verrannollinen jännite y littää vertotason AIN1, LED0 alkaa loistamaan. Iske kädet yhteen mikrofonin lähellä. Kokeilemalla löytyy oikeat arvo t. Mittaa jännitteet, tutki erot, toista. *************************************************** ********/ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> // *** Primitive wait() *** void wait(uint16_t time) { volatile uint16_t i; for(i=0;i<2000;i++) _delay_loop_2(time); } // analogiavertailijan keskeytysohjelma ISR(ANA_COMP_vect) { PORTA = 1<<0; // PA.0 LED ON }

Page 7: 6.2. rauta Analogia Komparaattori Ohjelmointia

7

int main(void) { DDRA = 0xFF; ACSR |= 1<<ACIE; // keskeytys ON ACSR |= (1<<ACIS1) | (1<<ACIS0); // analogiavertailijan keskeytys ACO:n nousevast a reunasta // eli kun AIN0 > AIN1 ACO:n nouseva reuna-->int errupt sei(); // globaali keskeytyksen sallinta while(1) { PORTA |= _BV(7); // BitValue 7-bitti '1', | -OR wait(200); PORTA &= ~_BV(7); // BitValue 7-bitti '0', & -AND wait(200); } }

Analysointi Kuten huomasit, koodi on edellisen kanssa sama, vain alun kommentti on erilainen.

Tästä tulee korjattu versio piirilevykuvineen seuraavaan päivitykseen.

3. Kapasitanssimittari 26.03.2004 Tekijät: Marko Saarinen ja Jari Pohjasmäki Kapasitanssimittari on mittari jolla voidaan mitata kondensaattorin arvoa. PB.2 on kytketty comparaattorin + inputtiin ja PB.3 – inputtiin. Kondensaattoria varataan vastuksen R1 kautta kunnes PB.2 saavuttaa PB.3:n arvon PB.3:n arvo muodostetaan vastusten R2 ja R3 jännitejaolla. PB.1 ohjaa Fettiä Q1 jonka avulla kondensaattori CX puretaan mittauksien välillä. Tutkittavat kondensaattorit voivat olla välillä 1 nF ja siitä ylöspäin (kokeiltu 4700 uF).

Kapasitanssi mittarin piirikaavio.

Kuva 2: piirilevykaavio

Page 8: 6.2. rauta Analogia Komparaattori Ohjelmointia

8

Osa luettelo: Item Qty Reference Part Name PCB DECAL 1 1 Q1 BS170 TO-92 2 1 CX mitattava konkka 3 2 R2-3 100k R1/8W 4 1 R4 10k R1/8W 5 1 R1 22k R1/8W Koodi, alkuperäinen (päivitä) /************************************************** ******************* Project : ana_kapa_m32.c mega32 Date : 26.3.2004 Author : JPo, MAS Comments: Kapasitanssin mittaus analogia-comparaatt orin avulla +AIN0-input = PB.2 ja -AIN1-input = PB.3 PB.1 hoitaa kondensaattorin purkauksen fetin avulla . Mittauksen tila D-portin led-pylvääseen, mittauksen tulos C-porttiin lcd. *************************************************** ********************/ #include <avr/io.h> #include <avr/signal.h> #include <stdio.h> #include "viive.h" #include "lcd_pva.h" void Tulosta(unsigned long int cntr); void Tulosta(unsigned long int cntr) { lcd_clrscr(); lcd_puts("Kapasitanssi"); lcd_gotoxy(0,1); // line 1, place 0 fdevopen (lcd_putc, NULL,1); // ohjataan olet uslaitteeksi lcd_putc if(cntr < 119999) { printf("C = %d nF",(cntr/12)); // muunnos ja tu lostus, nF } if(cntr > 120000) { printf("C = %d uF",(cntr/12)/1000); // muunnos ja tulostus, uF } Delay_ms(400); } void Tutkitaan_konkka (void) { unsigned long int cntr; lcd_gotoxy(0,0); lcd_puts(" Mitataan"); PORTD |= _BV(1); // D-portin B1 ilmaisee ko nkan purkauksen

Page 9: 6.2. rauta Analogia Komparaattori Ohjelmointia

9

PORTB |= _BV(1); // PB1 = 1 -> puretaan kon kka, FET johtaa Delay_ms(500); // odotetaan kond. purkaut umista ACSR &= ~_BV(ACIE); // nollataan ACSR:n ACIE = 0 PORTD &= ~_BV(1); // D-portin B1 sammutetaan PORTB &= ~_BV(1); // PB1 = 0 -> varataan kon kka, FET ei johda PORTD = 0x18; // D-porttiin 0001 1000 ko nkan varauksen ajaksi cntr = 0; // nollataan laskuri while(ACSR == 0x00) // tutkitaan AC0 = 0, ACSR = 0x00 cntr++; // ja samalla lisätään las kuria PORTD = 0x81; Tulosta(cntr); // mennään Tulosta(cntr)-f unktioon } int main(void) { DDRD = 0xFF; // Led-pylväs liitetään D-porttiin DDRB = 0xF3; // 1111 0011 portti-B, pinnit 2 ja 3 input, loput output DDRC = 0xFF; // LCD liitetään C-porttiin ACSR = 0x00; // Analoginen vertailija käyttöön lcd_init(LCD_DISP_ON); while(1) { Tutkitaan_konkka(); // siirry Tutkitaan_konkka -funktioon } }