Etsi

Jatka ja biologinen sen laatija Pari artikkeleita harrastukseni - robotiikkaan
Minun mielikuvaa maahanmuuton Australiaan. Venäjäksi vain. Reseptit ja arkipäivän ongelmien ratkaisuun
Linux liittyvää virkaa Windows liittyvää virkaa
Ohjelmisto liittyvää virkaa Paljon tietoa laitteiston
Erilaisia ​​työkaluja voi olla sinulle hyötyä Posts noin eri web-teknologioiden
Kaikki, mitä ei sovi loput valikon RSS-syöte tästä blogista

Tag Cloud

Arkisto

Linkit

Andrey Mikhalchuk blogi

English flagItalian flagKorean flagChinese (Simplified) flagPortuguese flagGerman flagFrench flagSpanish flagJapanese flagRussian flagDanish flagFinnish flagHebrew flag

Technoblog elämästä

20 kesäkuu 2011 Reading ATtiny85/45/25 lämpötila-anturi

ATtiny85 has internal temperature sensor

ATTINY85 on sisäinen lämpötila-anturi

Olen työskennellyt eräs hankkeiden RTFMs videoblogin (tarkista http://rtfms.com ), joka vaatii lämpötilatunnistimilla hyvin pieniä pakkauksia. Luonnollisesti minun valintani on ATTINY85 - mahtava pikku siru AVR että lisäksi muita tavaroita (kuten 6ch PWM-sarjaliitäntä jne.) on sisäinen lämpötila-anturi. Päätin käyttää yhtä. Se ei ollut helppoa, mutta muutaman tunnin kaivamisen foorumeita ja teknisissä päädyin luokka, joka tekee työtä varsin vaikuttava luotettavuus ja tarkkuus.


Ensinnäkin suorittaa tätä koodia tarvitaan Arduino-Tiny ( http://code.google.com/p/arduino-tiny/ ) ydin ja jonkinlainen ISP. Käytän Arduino Duemilanove kuin ISP. Katso minun RTFMs blogi lisätietoja siitä, miten saada se toimimaan tällä tavalla, miten ladata oikeaan ytimeen jne. AFAIK kaikki suositut ytimet toimivat hyvin tällä koodilla. Minä vain recomment Arduino-Tiny, koska se rikas toimintoja, jotka voidaan vapauttaa enemmän voimaa ATTINY85.
Ratkaisu koostuu kahdesta tiedostosta, jonka voit kopioida omaan projektiin. Vain copypaste ne tältä sivulta:

InternalTemperatureSensor.h

# Ifndef _INTERNAL_TEMPERATURE_SENSOR_H_
# Define _INTERNAL_TEMPERATURE_SENSOR_H_

# Define TEMPERATURE_SAMPLES 30
# Define TEMPERATURE_ADJUSTMENT -13
# Define EXTREMES_RATIO 5

# Define MAXINT 32767
# Define MININT -32767

/ *
* Perustuu näytteistä:
* - Sisäinen lämpötila-anturi on kamala poikkeama. Se: n ulostulo vaihtelee paljon (+ / -10 astetta / sek), niin edellyttää
* Jotkut "tasoitusta". Olen poistetaan ääriarvot ja käynnissä liikkuva AVG loput. Tämä palauttaa ok
* Tulokset 20 näytettä ja enemmän. Voidaan vähentää näytteiden vähentämiseksi vasteaika, mutta tämä
* Vähenevät tarkkuutta.
* - Lineaarisuus on ok, ja noin 1.0 esite lupasi
* - Offset tarve laskettava kullekin siru erikseen säädetty c'tor
*
* Jotta calaculate offset koukku terminaali nastaan ​​2 (Serial TX) 9600 8N1 ja käyttö
* Temperature.print ()-metodia puhelun. Tämä tulostaa lämpötilan lukemat. Ottelun sitä vasten
* Kalibroitu lämpömittari kiinni siru. Säädä Tos on c'tor tarvittaessa.
* Katso luku 17,12 on ATTINY85 esittelysivuilta hieman lisätietoja
* /

class InternalTemperatureSensor {
int offset;
float kerroin;
int lukemat [TEMPERATURE_SAMPLES];
int pos;

public:
InternalTemperatureSensor (float k, int o): offset (o), kerroin (k), pos (0) {}
/ / Kutsu sitä aina tarvitse valmistautua sirun lukemiseen anturi (eli setup)
/ / Jos käytät muita ADC lisäksi lämpötila kutsuvat sitä ennen kutakin lämpötilalukeman
void init ();
/ / Palauttaa nykyisen keskimääräisten lämpötila LSB
int in_lsb ();
/ / Palauttaa nykyisen keskimääräisten Celsius
int in_c ();
/ / Palauttaa nykyisen keskimääräisten lämpötila Fahrenheit-asteina
int in_f ();
/ / Palauttaa nykyisen keskimääräisten lämpötila Kelviniä
int in_k ();
/ / Palauttaa nykyisen raaka lämpötila lukemiseen anturin
int raaka ();
/ / Tulostaa nykyisen lämpötilan lukemat eri muodoissa
mitätöidä tulosta ();
};
# Endif / / _INTERNAL_TEMPERATURE_SENSOR_H_

InternalTemperatureSensor.pde

# Include "InternalTemperatureSensor.h"

void InternalTemperatureSensor :: init () {
/ / AnalogReference (INTERNAL1V1);
/ / ATTINY85 esite P140 (17.13.2), P137 (17.12)
/ / Määritä ADMUX
ADMUX = B1111, / / ​​Valitse lämpötila-anturi
ADMUX & = ~ _BV (ADLAR); / / Oikea säätö tulos
ADMUX | = _BV (REFS1), / / ​​Set Ref jännite
ADMUX & = ~ (_BV (REFS0) | _BV (REFS2)), / / ​​ja 1.1V
/ / Määritä ADCSRA
ADCSRA & = ~ (_BV (ADATE) | _BV (ADIE)); / / Disable autotrigger, Poista keskeytys
ADCSRA | = _BV (ADEN); / / Ota ADC
ADCSRA | = _BV (ADSC); / / Start ensimmäinen tulos
/ / Siemennäytettä
int raw_temp;
while (((raw_temp = raaka ()) <0));
for (int i = 0; i <TEMPERATURE_SAMPLES; i + +) {
lukemat [i] = raw_temp;
}
}

int InternalTemperatureSensor :: in_lsb () {
int readings_dup [TEMPERATURE_SAMPLES];
int raw_temp;
/ / Muista näyte
if ((raw_temp = raaka ())> 0) {
lukemat [pos] = raw_temp;
pos + +;
pos% = TEMPERATURE_SAMPLES;
}
/ / Kopioi näytteet
for (int i = 0; i <TEMPERATURE_SAMPLES; i + +) {
readings_dup [i] = lukemat [i];
}
/ / Kupla äärinäkemystä päät matriisi
int extremes_count = TEMPERATURE_SAMPLES / EXTREMES_RATIO;
int swap;
for (int i = 0; i <extremes_count; + + i) {/ / prosenttia toistojen bubble sort pieniin N toimii nopeammin kuin Q-lajittelu
ja (Int J = 0; j <TEMPERATURE_SAMPLES - 1, j + +) {
if (readings_dup [i]> readings_dup [i +1]) {/ / voisi tehdä 3 XORs eikä swap jos haluat hienoja
swap = readings_dup [i];
readings_dup [i] = readings_dup [i +1];
readings_dup [i +1] = vaihda;
}
}
}
/ / Keskimäärin keskellä matriisi
int sum_temp = 0;
for (int i = extremes_count; i <TEMPERATURE_SAMPLES - extremes_count; i + +) {
sum_temp + = readings_dup [i];
}
palauttaa sum_temp / (TEMPERATURE_SAMPLES - extremes_count * 2);
}

int InternalTemperatureSensor :: in_c () {
palauttaa in_k () - 273;
}

int InternalTemperatureSensor :: in_f () {
palauttaa in_c () * 9/5 + 32;
}

int InternalTemperatureSensor :: in_k () {
palauttaa in_lsb () + offset, / / ​​for simplicty käytän k = 1, käytetään seuraavalla rivillä, jos haluat K! = 1,0
/ / Return (int) (in_lsb () * kerroin) + offset;
}

int InternalTemperatureSensor :: raaka () {
Jos (ADCSRA & _BV (ADSC)) {
palauttaa -1;
} Else {
int ret = ADCL | (ADCH << 8), / / ​​Get edellinen muunnostulos
ADCSRA | = _BV (ADSC); / / Aloita uusi muuntaminen
palata ret;
}
}

void InternalTemperatureSensor :: tulosta () {
Serial.print ("> R:");
Serial.print (raaka (), DEC);
Serial.print ("L");
Serial.print (in_lsb (), DEC);
Serial.print ("K");
Serial.print (in_k (), DEC);
Serial.print ("C");
Serial.print (in_c (), DEC);
Serial.print ("F");
Serial.print (in_f (), DEC);
Serial.println ("#");
}

Käyttö

InternalTemperatureSensor lämpötila (1,0, TEMPERATURE_ADJUSTMENT), / / ​​1,0 argumentti ohitetaan oletusarvoisesti, katso c'tor kommentit
void setup () {
temperature.init (); / / Call init () in setup tai aina kun muutat ADCSRA tai ADMUX
}

void loop () {
/ / Temperature.print (); / / Poista kommentit debug anturin lähdön kautta sarjaliitäntä
int war_sensor_data = temperature.raw (); / / Tämä palauttaa tuskin käytettävissä anturin ulostulo
int temperature_in_celsius = temperature.in_c (); / / Tämä palauttaa käyttökelpoisempia Celsius
}

Selitys

ATtinyX5 käyttää ADC4 datan lukemiseksi sisäinen anturi. In init ()-metodia tarvittavat taika rekistereihin tehdään valmistella järjestelmän luit tämän tiedon. Sinun täytyy kutsua tätä menetelmää, kun haluat määrittää ADMUX ja ADCSRA hakemisessa lämpötila-anturin tiedot. Jos vain ADC kanava käytät ohjelma on lämpötila-anturin ADC4 sinun pitäisi vain soittaa se setup (), eli kerran. Tämä vähentää lämpötila käsittelyn menettely aikaan ainakin tekijällä kaksi.

Menetelmä InternalTemperatureSensor :: raaka () palauttaa raaka-anturin tiedot. Valitettavasti tämä tieto on tuskin käyttökelpoinen. Voit kuvata ongelmaa katsomaan ulostulo InternalTemperatureSensor :: print () debug-menetelmä. Ensimmäinen sarake on mitä anturi palaa. Lähtö hinta on noin 5 riviä sekunnissa, joten 2 sekunnin anturi palasi arvot 18 asteen ero.

ATtiny85 Internal Temperature Sensor Readouts

ATTINY85 lämpötila-anturi lukemat


Jotta tämä tieto enemmän käyttökelpoista menetelmää InternalTemperatureSensor :: in_lsb ei liukuva keskiarvo ja poistaa äärimmäiset syöttölokerosta. Tuloksena näet kuvassa yllä: in_lsb lähtö merkitty L: on paljon käyttökelpoisempi. Se on tarkempi myös. Voit säätää liukuva keskiarvo parametrit, mutta kaiken kaikkiaan en suosittele tekemään TEMPERATURE_SAMPLES alle 20 ja yli 50. Jos se on alle 20, niin poikkeama kasvaa merkittävästi. Making TEMPERATURE_SAMPLES yli 50 ei paranna tarkkuutta vaan jätteiden muistia ja hidastaa laskelmat. Myös EXTREMES_RATIO määrittelee kuinka paljon ääriarvoja on hienonnettu, älä tee sitä vähintään 2 (joka poistaa kaikki arvot). Teemme sen yli TEMPERATURE_SAMPLES tulevat tehokkaasti estää poistamalla ääripäitä näytteistä.
Sen lisäksi, että nämä kolme ytimen menetelmiä muutaman hyödyllisyys menetelmiä in_c (), in_k (), in_f () on esitetty. He palaavat Celsius, Fahrenheit ja Kelviniä.

Vielä yksi ongelma sisäinen anturi on, että sitä ei ole kalibroitu, joten jokainen siru haluat käyttää print ()-metodi tulostaa käsittelyä ja säädä toisen parametrin rakentaja sovittaa nämä arvot kanssa kalibroitu lämpömittari. Arvo -13 on lähdekoodia toimii vain yhden minun ATtinies, mikään ei takaa sitä työtä muille.
Kaiken sisäinen anturi on käytettävissä, mutta älä odota paljon. Ulkoiset anturit ovat vielä paljon paremmin.

Tämä viesti on julkaistu Hardware , Robotics .

Ei kommentteja

Ei kommentteja toistaiseksi

Jätä vastaus

Sivukartta (C) Andrey Mikhalchuk, 2005-2008