Я читаю значения АЦП для измерения температуры и усредняю их. Но график от него показывает "шаги", а не от реальных шагов увеличения значений. кто-нибудь знает, почему это произошло?
#include "arduino.h"
#define AVG_COUNT 1300
#define AVG_MAX_COUNT (2147483647/1023)
#define AVG_DURATION_TIME (AVG_COUNT * 150)
#define LOOP_INTERVAL 250
#define LOOP_INTERVAL_X 100
#define E 2.7182818284
#define AREF 4945.0
#define VREF 4945.0 // 3004 at about 22°C and 3012 at about 0°C
//#define S1_R_REF 15000.0
#define S1_R_REF_DIV4 3750.0
#define S1_RM 6260
#define S1_A_1 0.003354016
#define S1_B_1 0.0002744030
#define S1_C_1 0.00000366694
#define S1_D_1 0.000000137549
byte last_ADMUX = 0;
#define ADC_BANDGAP ((1 << MUX3) | (1 << MUX2) | (1 << MUX1))
#define ADC_RAW_BANDGAP 1110
#define T_B 5.255
#define T_A_x100 0.65
int temperature;
#define SUM_COUNT 10
int getADCRaw(){
//Start conversion
ADCSRA |= (1 << ADSC);
//wait for Measurment to finish
while(ADCSRA & (1 << ADSC));
return (ADCL | (ADCH << 8));
}
int getTempX100(int RntcDiv4){
return (int) (100 / (S1_A_1 + S1_B_1*log(RntcDiv4/S1_R_REF_DIV4) + S1_C_1*pow(log(RntcDiv4/S1_R_REF_DIV4),2) + S1_D_1*pow(log(RntcDiv4/S1_R_REF_DIV4), 3) ));
}
int getTempAvg(int avgCount){
unsigned long rmSum = 0;
for(int i = 0; i < avgCount; i++){
rmSum += (unsigned long) getADCRaw();;
}
float rmAvg = mapFloat((float)rmSum / avgCount, 0, 1023, 0, AREF);
int rntcDiv4 = (int) ((VREF / rmAvg - 1) * S1_RM / 4);
int tempCelsiusX100 = getTempX100(rntcDiv4) - 27315;
delay(1);
return tempCelsiusX100;
}
unsigned long getXBase10(byte exponent){
unsigned long rValue = 1;
for(;exponent > 0; exponent--){
rValue *= 10;
}
return rValue;
}
void setup(){
Serial.begin(57600);
//Pin A0input
DDRC &= ~(1 << PC0);
ADMUX |= (1 << REFS0); // 5V AREF (ADC0 is 0 by default)
}
unsigned long printTime = 0;
unsigned long nowMillis = 0;
unsigned long measTime = 0;
unsigned long lastPrintTime = 0;
#define INTERVAL 250
void loop(){
nowMillis = millis();
int temp = getTempAvg(20);
measTime = millis() - nowMillis;
while(millis() - lastPrintTime < INTERVAL)
delayMicroseconds(333);
Serial.println(measTime);
Serial.flush();
lastPrintTime = millis();
}
При усреднении я хотел увеличить разрешение, чтобы не было таких больших шагов. И более точные показания. Зачем вообще эти ступеньки?