123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /*
- * tempsensors.c
- *
- * Created on: Jan 12, 2021
- * Author: David Original work by Jose (PTDreamer), 2017
- */
- #include "tempsensors.h"
- #include "math.h"
- #define temp_minC 50 // Minimum calibration temperature in degrees of Celsius
- #define temp_maxC 480 // Maximum calibration temperature in degrees of Celsius
- static tipData *currentTipData;
- uint16_t last_TIP_Raw;
- uint16_t last_TIP;
- int16_t last_NTC;
- #ifdef USE_NTC
- const int NTC_TABLE; // Defined in board.h
- #endif
- int16_t readColdJunctionSensorTemp_x10(bool tempUnit) {
- #ifdef USE_NTC
- int16_t temp;
- int16_t p1, p2;
- int16_t lastavg=NTC.last_avg;
- /* Estimate the interpolating point before and after the ADC value. */
- p1 = NTC_Table[(lastavg >> 4)];
- p2 = NTC_Table[(lastavg >> 4) + 1];
- /* Interpolate between both points. */
- temp = p1 - ((p1 - p2) * (lastavg & 0x000F)) / 16;
- if(tempUnit==mode_Farenheit){
- temp=TempConversion(temp, mode_Farenheit, 1);
- }
- last_NTC = temp;
- return last_NTC;
- #else
- last_NTC=350; // If no NTC is used, assume 35ºC
- return last_NTC;
- #endif
- }
- // Read tip temperature
- uint16_t readTipTemperatureCompensated(bool update, bool ReadRaw){
- uint16_t temp, temp_Raw;
- if(systemSettings.setupMode==setup_On){
- return 0;
- }
- if(update){
- temp = adc2Human(TIP.last_avg,1,systemSettings.settings.tempUnit);
- temp_Raw = adc2Human(TIP.last_raw,1,systemSettings.settings.tempUnit);
- // Limit output values
- if(temp>999){
- temp=999;
- }
- else if(temp<0){
- temp = 0;
- }
- if(temp_Raw>999){
- temp_Raw=999;
- }
- else if(temp_Raw<0){
- temp_Raw = 0;
- }
- last_TIP = temp;
- last_TIP_Raw = temp_Raw;
- }
- if(ReadRaw){
- return last_TIP_Raw;
- }
- else{
- return last_TIP;
- }
- }
- void setCurrentTip(uint8_t tip) {
- currentTipData = &systemSettings.Profile.tip[tip];
- setupPID(¤tTipData->PID);
- }
- tipData* getCurrentTip() {
- return currentTipData;
- }
- // Translate the human readable t into internal value
- uint16_t human2adc(int16_t t) {
- volatile int16_t temp = t;
- volatile int16_t tH;
- volatile int16_t ambTemp = readColdJunctionSensorTemp_x10(mode_Celsius) / 10;
- // If using Farenheit, convert to Celsius
- if(systemSettings.settings.tempUnit==mode_Farenheit){
- t = TempConversion(t,mode_Celsius,0);
- }
- t-=ambTemp;
- if (t < temp_minC){ return 0; } // If requested temp below min, return 0
- else if (t > temp_maxC){ t = temp_maxC; } // If requested over max, apply limit
- // If t>350, map between ADC values Cal_350 - Cal_450
- if (t >= 350){
- temp = map(t, 350, 450, currentTipData->calADC_At_350, currentTipData->calADC_At_450);
- }
- // Else, map between ADC values Cal_250 - Cal_350
- else{
- temp = map(t, 250, 350, currentTipData->calADC_At_250, currentTipData->calADC_At_350);
- }
- tH = adc2Human(temp,0,mode_Celsius);
- if (tH < t) {
- while(tH < t){
- tH = adc2Human(++temp,0,mode_Celsius);
- }
- }
- else if (tH > t) {
- while(tH > t){
- tH = adc2Human(--temp,0,mode_Celsius);
- }
- }
- return temp;
- }
- // Translate temperature from internal units to the human readable value
- int16_t adc2Human(uint16_t adc_value,bool correction, bool tempUnit) {
- int16_t tempH = 0;
- int16_t ambTemp;
- ambTemp = readColdJunctionSensorTemp_x10(mode_Celsius) / 10;
- if (adc_value >= currentTipData->calADC_At_350) {
- tempH = map(adc_value, currentTipData->calADC_At_350, currentTipData->calADC_At_450, 350, 450);
- }
- else{
- tempH = map(adc_value, currentTipData->calADC_At_250, currentTipData->calADC_At_350, 250, 350);
- }
- if(correction){ tempH+= ambTemp; }
- if(tempUnit==mode_Farenheit){
- tempH=TempConversion(tempH,mode_Farenheit,0);
- }
- return tempH;
- }
- long map(long x, long in_min, long in_max, long out_min, long out_max) {
- long ret;
- ret = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
- if (ret < 0)
- ret = 0;
- return ret;
- }
- // Fixed point calculation
- // 2E20*1.8 = 1887437 , 2E20/1.8 = 582542
- // So (temp*1887437)>>20 == temp*1.8 (Real: 1,800000191)
- // (temp*582542)>>20 == temp/1.8 (Real: 1,800000687)
- // Max input = 1100°C / 3700°F, otherwise we will overflow the signed int32
- int16_t TempConversion(int16_t temperature, bool conversion, bool x10mode){
- if(conversion==mode_Farenheit){ // Input==Celsius, Output==Farenheit
- temperature=(((int32_t)temperature*1887437)>>20);// F = (C*1.8)+32
- if(x10mode){
- temperature += 320;
- }
- else{
- temperature += 32;
- }
- }
- else{// Input==Farenheit, Output==Celsius
- if(x10mode){
- temperature -= 320;
- }
- else{
- temperature -= 32;
- }
- temperature=((int32_t)temperature*582542)>>20;// C = (F-32)/1.8
- }
- return temperature;
- }
|