/* -------------------------------------------------------- adc_ntc.ino Demoprogramm zum Auslesen eines NTC-Widerstandes ueber einen analogen Eingang. 28.02.2026 R. Seelig -------------------------------------------------------- */ #include #include "v003_adc.h" // Objekt erzeugen, Konstruktor erwartet GPIO-Pin, auf dem // ein analoger Wert eingelesen wird. Erlaubte Pins sind: // PA2, PA1, PC4, PD2 .. PD6 ADC ntc1(PD4); // mittels Toolprogramm ntctable erzeugte Lookup-Table // und Interpolationsfunktion /* ------------------------------------------------- Lookup-table fuer NTC-Widerstand R25-Wert: 10.00 kOhm Pullup-Widerstand: 10.00 kOhm Materialkonstante beta: 4020 Aufloesung des ADC: 10 Bit Einheit eines Tabellenwertes: 0.1 Grad Celcius Temperaturfehler der Tabelle: 0.2 Grad Celcius -------------------------------------------------*/ const int ntctable[] = { 1539, 1269, 999, 853, 753, 676, 614, 561, 514, 473, 435, 400, 367, 336, 307, 278, 250, 223, 195, 168, 141, 114, 85, 56, 25, -7, -42, -81, -126, -179, -249, -355, -461 }; /* ------------------------------------------------- ntc_gettemp zuordnen des Temperaturwertes aus gegebenem ADC-Wert. ------------------------------------------------- */ int ntc_gettemp(uint16_t adc_value) { int p1,p2; // Stuetzpunkt vor und nach dem ADC Wert ermitteln. p1 = ntctable[ (adc_value >> 5) ]; p2 = ntctable[ (adc_value >> 5) + 1]; // zwischen beiden Punkten interpolieren. return p1 - ( (p1-p2) * (adc_value & 0x001f) ) / 32; } /* ---------------------------------------------------------- textnvalue gibt einen Text, gefolgt von einem Integer, der als Pseudokommazahl, je nach Mode, ausgegeben werden kann. Abschliessend erfolgt ein weiterer Stringtext Uebergabe: *s : Zeiger auf einen AsciiZ String value : Integerwert *s2 : zweiter String mode : Ausgabemodus, 0 = Integerwert 1 = mit Dezimalpunkt Bsp.: textnvalue("Temp.: ", 123, "C\n\r", 1); gibt aus: Temp,: 12.3 C ---------------------------------------------------------- */ void textnvalue(char *s, int16_t value, char *s2, uint8_t mode) { int16_t vorkomma, nachkomma; Serial.print(s); if (mode) { Serial.print(value / 10); Serial.print("."); Serial.print(value % 10); } else { Serial.print(value); } Serial.print(s2); } /* ---------------------------------------------------------- setup ---------------------------------------------------------- */ void setup() { Serial.begin(115200); Serial.print("\n\r --------------------------------------\n\r"); Serial.print(" CH32V003 running at 48 MHz \n\r"); Serial.print(" 16 kByte Flash, 2 KByte RAM \n\r"); Serial.print(" \n\r"); Serial.print(" Arduino-Demo: ADC & NTC \n\r"); Serial.print(" \n\r"); Serial.print(" 28.02.2026 R. Seelig \n\r"); Serial.print(" --------------------------------------\n\n\r"); } /* ---------------------------------------------------------- loop ---------------------------------------------------------- */ void loop() { uint16_t count = 0; uint16_t temp; while(1) { temp= ntc_gettemp(ntc1.read()); textnvalue("\rCounter: ", count, " | ", 0); textnvalue("Temp.: ", temp, " oC", 1); count++; delay(1000); } }