Hi,
Dank weer beide voor de code en de inzet.
Ik heb de bijlage van hardbass in de Arduino IDE geplakt en laten lopen, dit geeft geen fouten bij het compileren maar ik be nu wel alle resolutie kwijt.
De uitlezing is nu wel rete stabiel op hele graden Celsius afgerond.
hardbass, zo staat het nu in de Arduino IDE bij mij.
c code:
#include <ADC.h>
// Thermistor Eigenschappen Vishay NTCLE300E3502SB
#define RT0 5000 // Ω
#define B 3977 // K
#define VCC 2.4985 // Referentie Spanning van Maxim voltage reference IC
#define R 2368.85 // Weerstand naar de referentie spanning voor de NTC in Ohm
#define T0 (25 + 273.15) // Temperature T0 from datasheet, conversion from Celsius to kelvin fot the NTC Sensor
ADC *adc = new ADC(); // ADC object voor de Teensy ADC
// Configuratie middeling voor de NTC ingang
template <class T>
class Filter
{
public:
int N = 0; // Aantal te middelen waarde
T *meetwaardes; // Opslag individuele meetwaarden
T accumulator = 0; // Optelsom van alle individuele meetwaarden
int index = 0; // Meetwaarden teller
Filter(const int n)
{
meetwaardes = new T[n];
N = n;
for(int i = 0; i < n; i++)
{
meetwaardes[i] = 0;
}
}
~Filter()
{
delete[] meetwaardes;
}
void AddSample(int NewSample)
{
accumulator -= meetwaardes[index];
meetwaardes[index] = NewSample; // Bewaar nieuwe meetwaarde
accumulator += meetwaardes[index]; // Accumuleer nieuwste meetwaarde
index++;
index %= N; // Teller loopt van 0 tot N-1
}
T Average()
{
return accumulator/N; // Bereken de gemmiddelde waarde
}
};
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void setup()
{
Serial.begin(115200);
// Configuratie van ADC_0 Teensy-LC
adc->adc0->setReference(ADC_REFERENCE::REF_EXT); // Selecteer de externe referentie ingang voor ADC_0
adc->adc0->setAveraging(32); // Selecteer de middeling van de gebruikte ADC
adc->adc0->setResolution(16); // Selecteerd de resolutie van de geselecteerde ADC
adc->adc0->setConversionSpeed(ADC_CONVERSION_SPEED::HIGH_SPEED_16BITS); // Selecteerd de conversie snelheid
adc->adc0->setSamplingSpeed(ADC_SAMPLING_SPEED::LOW_SPEED); // Selecteerd de sample snelheid
adc->adc0->recalibrate(); // Kalibreeer de ADC
}
Filter<float> Filter_TMP37(64);
Filter<float> Filter_NTC(16);
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void loop()
{
unsigned long start = micros();
//Temperatuur van de TMP37
float sample_TMP37_RAW = (float)analogRead(A9);
float sample_TMP37_Celcius = sample_TMP37_RAW * (2.4985/65536 / 0.02);
// Temperatuur van de NTC
float sample_NTC_RAW = (float)analogRead(A8);
float VRT = 2.4985 * sample_NTC_RAW / 65536.00;
float VR = VCC - VRT;
float RT = VRT * R / VR;
float ln = log(RT / RT0);
float TX = (1 / ((ln / B) + (1 / T0)));
float sample_NTC_Celcius = TX - 273.15;
// Samples toevoegen aan het filter.
Filter_TMP37.AddSample(sample_TMP37_Celcius);
Filter_NTC.AddSample(sample_NTC_Celcius);
//Uitlezen resultaat filters.
float avg_TMP37_Celcius = Filter_TMP37.Average();
float avg_NTC_Celcius = Filter_NTC.Average();
// Print TMP37 Temperatuur
Serial.print("TMP37: ");
Serial.print(avg_TMP37_Celcius, 3);
Serial.print("C\t\t\t");
// Print NTC Temperatuur
Serial.print("Temperature-NTC: ");
Serial.print(avg_NTC_Celcius, 3); // Geeft de gemeten temperatuur van de NTC sensor in beeld
Serial.println("C");
// Bereken code run time
unsigned long end = micros();
unsigned long delta = end - start;
Serial.println(delta);
delay(10);
}
Groet,
Bram