Измерение температуры arduino.
Mar. 10th, 2021 12:24 am#include <arduino.h>
#include <wiring_private.h>
const float ct2=72; // температура второй точки
const float ct1=26.5; // температура первой точки
const float cu2=418; // данные ADC второй точки
const float cu1=370; // данные ADC первой точки
const unsigned long AREFdelay=6*10; // время задержки для установки AREFint8_t GetTemperature(bool bDelay=true);
uint16_t GetTemperatureADC(bool bDelay=true);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}void loop() {
// put your main code here, to run repeatedly:
Serial.println(GetTemperatureADC());
}int8_t GetTemperature(bool bDelay)
{
const float kt=(ct2-ct1)/(cu2-cu1);
const float t0=(ct1*cu2-ct2*cu1)/(cu2-cu1);
unsigned long ul=0;
float t;
ADMUX=0xc8;
if(bDelay)
delay(AREFdelay);
// возможный код для минимальной задержки
//delay(6);
//for(uint32_t i=0;i<9362;i++) ADMUX=0xc8;
sbi(ADCSRA, ADEN);
for(int i=1<<6;i;i--)
{
sbi(ADCSRA, ADSC);
while (bit_is_set(ADCSRA, ADSC));
ul+=ADCW;
};
t=(ul>>6)*kt+t0;
return t;
}uint16_t GetTemperatureADC(bool bDelay)
{
const float kt=(ct2-ct1)/(cu2-cu1);
const float t0=(ct1*cu2-ct2*cu1)/(cu2-cu1);
unsigned long ul=0;
ADMUX=0xc8;
if(bDelay)
delay(AREFdelay);
// возможный код для минимальной задержки
//delay(6);
//for(uint32_t i=0;i<9362;i++) ADMUX=0xc8;
sbi(ADCSRA, ADEN);
for(int i=1<<13;i;i--)
{
sbi(ADCSRA, ADSC);
while (bit_is_set(ADCSRA, ADSC));
ul+=ADCW;
};
return ul>>13;
}
Требуется обязательная калибровка по двум точкам. Программа простая, поэтому объяснять не буду как работает. Два замечания.
1. После изменения AREF необходима задержка больше 6мс для стабилизации напряжения.
2. Восстанавливать ADMUX и ADCSRA необязательно, так как встроенная функция analogRead эти регистры устанавливает при каждом вызове.
no subject
Date: 2021-03-09 11:11 pm (UTC)