Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) 11-2014 Zygmunt Kubiak
Czujnik temperatury w ATmega328P Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Czujnik temperatury w ATmega328P Dla 0ºC około 289 mV Błąd pomiaru temperatury ± 10ºC Czułość około 1 mV/ºC T = { [(ADCH << 8) | ADCL] - TOS} / k !! Charakterystyki temperaturowe różnych ATmega328P znacznie się różnią 11-2014 Zygmunt Kubiak
Czujnik temperatury w ATmega328P Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Czujnik temperatury w ATmega328P Bit 5 – ADLAR: ADC Left Adjust Result 11-2014 Zygmunt Kubiak
Czujnik temperatury w ATmega328P Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Czujnik temperatury w ATmega328P 11-2014 Zygmunt Kubiak
Program Arduino – przykład 1 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 1 //=================================================== // ZKubiak 05.2015 // Wewnętrzny czujnik temperatury w ATmega328P // Pomiar temperatury v.1 long wynik; void setup() { // Włączenie źródła odniesienia VREF = 1,1V ADMUX = _BV(REFS0) | _BV(REFS1); // włączenie kanału 8 w ATmega328 (sensor temperatury) ADMUX |= _BV(MUX3); // !! koniecznie |= Serial.begin(115200); Serial.println("Arduino jako termometr"); } 11-2014 Zygmunt Kubiak
Program Arduino – przykład 1 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 1 void loop() { ADCSRA |= _BV(ADSC); // //Start kolejnego przetwarzania while (bit_is_set(ADCSRA,ADSC)); // Czekaj na zakończenie wynik = ADCL; wynik |= ADCH<<8; //wynik = ADC; // ADCW opcja Serial.print(wynik); Serial.print(" "); // Przetwarzanie na mV wynik = (wynik * 1100L) / 1024L; // wynik * 1.074 Serial.print(" mV"); 11-2014 Zygmunt Kubiak
Program Arduino – przykład 1 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 1 // Przetwarzanie na temperaturę w 'C // Przy zał. czułosci 1mV/'C, mV odpowiadają 'C Serial.print(wynik - 350); // offset Serial.println(" 'C"); // wynik = analogRead(8); // !!Uwaga: analogRead() wlącza Vref=5V // do odczytu sens.temp. nie nadaje się // Serial.println(wynik); delay(500); // Czekaj } 11-2014 Zygmunt Kubiak
Program Arduino – przykład 2 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 2 //======================================================== // ZKubiak 05.2015 // Wewnętrzny czujnik temperatury w ATmega328P (kanał 8) // oraz napięcia analogowego w kanale 0 (A0) // 2-kanałowe pomiary analogowe v.1 void setup() { Serial.begin(115200); Serial.println("Arduino - 2-kanałowy pomiar analogowy"); } 11-2014 Zygmunt Kubiak
Program Arduino – przykład 2 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 2 void loop() { int wynik; wynik = getInterTemp(); Serial.print(" Temperatura: "); Serial.print(wynik); Serial.println(" 'C"); wynik = getAnalogCh0(); Serial.print(" Napiecie: "); Serial.println(" mV"); delay(1500); // Czekaj } 11-2014 Zygmunt Kubiak
Program Arduino – przykład 2 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 2 int getAnalogCh0() { long wynik; // Włączenie źródła odniesienia VREF = 5V ADMUX = _BV(REFS0); delay(20); // czekaj na ustawienie Vref !!!ważne // włączenie kanału 0 w ATmega328 (A0) // ADMUX &= 0xF0; // wybór kanału 0 ADCSRA |= _BV(ADSC); // //Start przetwarzania while (bit_is_set(ADCSRA,ADSC)); // Czekaj na zakończenie wynik = ADC; // ADCW opcja wynik = ((wynik * 5000000L) / 1024L)/1000L; // (wynik * 1.074)-offset return int(wynik); // zwrot napięcia na A0 w mV (konwersja do int) } 11-2014 Zygmunt Kubiak
Program Arduino – przykład 2 Sensory Wewnętrzny czujnik temperatury w mikrokontrolerach ATmega328P (Arduino) Program Arduino – przykład 2 int getInterTemp() { long wynik; // Włączenie źródła odniesienia VREF = 1,1V ADMUX = _BV(REFS0) | _BV(REFS1); delay(20); // czekaj na ustawienie Vref !!!ważne // włączenie kanału 8 w ATmega328 (sensor temperatury) ADMUX |= _BV(MUX3); // !! koniecznie |= delay(20); ADCSRA |= _BV(ADSC); // //Start przetwarzania while (bit_is_set(ADCSRA,ADSC)); // Czekaj na zakończenie wynik = ADC; // ADCW opcja // (wynik * 1.074)-offset wynik = (((wynik * 1100000L) / 1024L)-350000)/1000L return int(wynik); // zwrot temperatury na A0 w 'C (konwersja do int) } 11-2014 Zygmunt Kubiak
Dziękuję Zygmunt Kubiak 09-2006