MAX11410 high speed 24-bit Delta-Sigma ADC
Dependents: MAX11410BOB_24bit_ADC MAX11410BOB_Serial_Tester
Diff: MAX11410.cpp
- Revision:
- 22:c6812214a933
- Parent:
- 21:847b2220e96e
- Child:
- 23:22e7830bcccb
--- a/MAX11410.cpp Mon Apr 06 05:15:22 2020 -0700 +++ b/MAX11410.cpp Mon Apr 13 02:59:22 2020 +0000 @@ -413,44 +413,71 @@ // @future test xxxxxx // comment // // TODO1: #169 SelfTest support RegRead +// @test group POR // verify initial register values (enabled by default) // @future test tinyTester.print("PART_ID value") -// @test RegRead(MAX11410::CMD_r001_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xddd_PART_ID, buffer) expect 1 expect-buffer 0x000F02 +// @test group POR RegRead(MAX11410::CMD_r001_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xddd_PART_ID, buffer) expect 1 expect-buffer 0x000F02 // // @future test tinyTester.print("POR value 0x04 CMD_r000_0100_dddd_xddd_GP0_CTRL") -// @test RegRead(MAX11410::CMD_r000_0100_dddd_xddd_GP0_CTRL, buffer) expect 1 expect-buffer 0x00 +// @test group POR RegRead(MAX11410::CMD_r000_0100_dddd_xddd_GP0_CTRL, buffer) expect 1 expect-buffer 0x00 // // @future test tinyTester.print("POR value 0x05 CMD_r000_0101_dddd_xddd_GP1_CTRL") -// @test RegRead(MAX11410::CMD_r000_0101_dddd_xddd_GP1_CTRL, buffer) expect 1 expect-buffer 0x00 +// @test group POR RegRead(MAX11410::CMD_r000_0101_dddd_xddd_GP1_CTRL, buffer) expect 1 expect-buffer 0x00 // // @future test tinyTester.print("POR value 0x07 CMD_r000_0111_xddd_dddd_GP_SEQ_ADDR") -// @test RegRead(MAX11410::CMD_r000_0111_xddd_dddd_GP_SEQ_ADDR, buffer) expect 1 expect-buffer 0x00003a +// @test group POR RegRead(MAX11410::CMD_r000_0111_xddd_dddd_GP_SEQ_ADDR, buffer) expect 1 expect-buffer 0x00003a // // TODO1: #169 SelfTest support RegWrite and custom enum types // @future test tinyTester.print("POR value 0x08 CMD_r000_1000_x0dd_dddd_FILTER") -// @test RegRead(MAX11410::CMD_r000_1000_x0dd_dddd_FILTER, buffer) expect 1 expect-buffer 0x00 +// @test group POR RegRead(MAX11410::CMD_r000_1000_x0dd_dddd_FILTER, buffer) expect 1 expect-buffer 0x00 // could also be stated as RegRead(0x08, buffer) expect 1 expect-buffer 0x00 // // @future test tinyTester.print("POR value 0x09 CMD_r000_1001_dddd_dddd_CTRL") -// @test RegRead(MAX11410::CMD_r000_1001_dddd_dddd_CTRL, buffer) expect 1 expect-buffer 0x000001 +// @test group POR RegRead(MAX11410::CMD_r000_1001_dddd_dddd_CTRL, buffer) expect 1 expect-buffer 0x000001 // // @future test tinyTester.print("POR value 0x0a CMD_r000_1010_dddd_dddd_SOURCE") -// @test RegRead(MAX11410::CMD_r000_1010_dddd_dddd_SOURCE, buffer) expect 1 expect-buffer 0x00 +// @test group POR RegRead(MAX11410::CMD_r000_1010_dddd_dddd_SOURCE, buffer) expect 1 expect-buffer 0x00 // // @future test tinyTester.print("POR value 0x0b CMD_r000_1011_dddd_dddd_MUX_CTRL0") -// @test RegRead(MAX11410::CMD_r000_1011_dddd_dddd_MUX_CTRL0, buffer) expect 1 expect-buffer 0x0000ff +// @test group POR RegRead(MAX11410::CMD_r000_1011_dddd_dddd_MUX_CTRL0, buffer) expect 1 expect-buffer 0x0000ff // // @future test tinyTester.print("POR value 0x0c CMD_r000_1100_dddd_dddd_MUX_CTRL1") -// @test RegRead(MAX11410::CMD_r000_1100_dddd_dddd_MUX_CTRL1, buffer) expect 1 expect-buffer 0x0000ff +// @test group POR RegRead(MAX11410::CMD_r000_1100_dddd_dddd_MUX_CTRL1, buffer) expect 1 expect-buffer 0x0000ff // // @future test tinyTester.print("POR value 0x0d CMD_r000_1101_dddd_dddd_MUX_CTRL2") -// @test RegRead(MAX11410::CMD_r000_1101_dddd_dddd_MUX_CTRL2, buffer) expect 1 expect-buffer 0x00 +// @test group POR RegRead(MAX11410::CMD_r000_1101_dddd_dddd_MUX_CTRL2, buffer) expect 1 expect-buffer 0x00 // // @future test tinyTester.print("POR value 0x0e CMD_r000_1110_xxdd_xddd_PGA") -// @test RegRead(MAX11410::CMD_r000_1110_xxdd_xddd_PGA, buffer) expect 1 expect-buffer 0x00 +// @test group POR RegRead(MAX11410::CMD_r000_1110_xxdd_xddd_PGA, buffer) expect 1 expect-buffer 0x00 // // @future test CMD_r000_1111_dddd_dddd_WAIT_EXT = 0x0f, //!< 0b0001111 // @future test CMD_r001_0000_xxxx_xxxx_WAIT_START = 0x10, //!< 0b0010000 // +// @test group RES1KA0A1TOGND // measure a 1kohm resistor between (AIN0,AIN1) and AGND to verify ref2_v (disabled by default) +// @test group RES1KA0A1TOGNDMORE // measure a 1kohm resistor between (AIN0,AIN1) and AGND to verify ref2_v in more detail +// @test group RES1KA0A1TOGNDMORE tinyTester.print("measure a 1kohm resistor between (AIN0,AIN1) and AGND to verify ref2_v") +// @test group RES1KA0A1TOGND tinyTester.settle_time_msec = 1000 // default 250 +// @test group RES1KA0A1TOGND RegWrite(0x0C, 0xF1) expect 1 // *mux_ctrl1=0xf1 drives current source from AIN1 +// +// @test group RES1KA0A1TOGNDMORE RegWrite(0x0A, 0x03) expect 1 // *source=0x03 idac_mode=100uA, 1k resistor 0.1V +// @test group RES1KA0A1TOGNDMORE tinyTester.print("idac_mode=100uA, 1k resistor 0.1V") +// @test group RES1KA0A1TOGNDMORE tinyTester.Wait_Output_Settling() +// @test group RES1KA0A1TOGND_BAD Measure_Voltage(0,10) // TODO1 #175 MAX11410 Self Test why does Measure_Voltage(0,10) without expect cause an mbed hard fault? +// @test group RES1KA0A1TOGNDMORE Measure_Voltage(0,10) expect 0.1 +// @test group RES1KA0A1TOGNDMORE AINcode[0] expect (uint32_t)337731 within 33773 // idac_mode=100uA, 1k resistor 0.1V +// +// @test group RES1KA0A1TOGNDMORE RegWrite(0x0A, 0x0D) expect 1 // *source=0x0d idac_mode=800uA, 1k resistor 0.8V +// @test group RES1KA0A1TOGNDMORE tinyTester.print("idac_mode=800uA, 1k resistor 0.8V") +// @test group RES1KA0A1TOGNDMORE tinyTester.Wait_Output_Settling() +// @test group RES1KA0A1TOGND_BAD Measure_Voltage(0,10) // TODO1 #175 MAX11410 Self Test why does Measure_Voltage(0,10) without expect cause an mbed hard fault? +// @test group RES1KA0A1TOGNDMORE Measure_Voltage(0,10) expect 0.8 +// @test group RES1KA0A1TOGNDMORE AINcode[0] expect (uint32_t)2724467 within 33773 // idac_mode=800uA, 1k resistor 0.8V +// +// @test group RES1KA0A1TOGND RegWrite(0x0A, 0x0B) expect 1 // *source=0x0b idac_mode=400uA, 1k resistor 0.4V +// @test group RES1KA0A1TOGNDMORE tinyTester.print("idac_mode=400uA, 1k resistor 0.4V") +// @test group RES1KA0A1TOGND tinyTester.Wait_Output_Settling() +// @test group RES1KA0A1TOGND_BAD Measure_Voltage(0,10) // TODO1 #175 MAX11410 Self Test why does Measure_Voltage(0,10) without expect cause an mbed hard fault? +// @test group RES1KA0A1TOGND Measure_Voltage(0,10) expect 0.4 +// @test group RES1KA0A1TOGNDMORE AINcode[0] expect (uint32_t)1343163 within 33773 // idac_mode=400uA, 1k resistor 0.4V // // // @@ -487,27 +514,27 @@ //---------------------------------------- // AIN0-AIN1 reference voltage, in Volts - VRef_REF0 = 2.500; + ref0_v = 2.500; //---------------------------------------- // REF1P-REF1N reference resistance, in Ohms - VRef_REF1 = 4999; + ref1_v = 4999; //---------------------------------------- // REF2P-REF2N reference voltage, in Volts - VRef_REF2 = 2.500; + ref2_v = 2.500; //---------------------------------------- // AVDD-AGND supply voltage, in Volts - VRef_AVDD = 3.300; + avdd_v = 3.300; //---------------------------------------- // RTD Resistance measurement; Thermocouple Cold Junction, in Ohms - rtd_resistance = 1000.0; + rtd_ohm = 1000.0; //---------------------------------------- // Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C - RTD_Temperature = 25.0; + rtd_degc = 25.0; //---------------------------------------- // shadow of register ctrl CMD_r000_1001_dddd_dddd_CTRL @@ -521,14 +548,18 @@ // When driver polls status of a pin signal or a register status bit, // and there is no device physically connected, the driver must // be able to halt and report failure if too many tries. Each attempt - // counts down until futility_countdown_limit is reached or exceeded. + // counts down until loop_limit is reached or exceeded. // // If driver seems to hang or takes too long to decide that device // is not connected, reduce the futility countdown limit value. // // If driver sometimes works but sometimes intermittently fails to // recognize device is attached, increase the futility countdown limit. - futility_countdown_limit = 30; + loop_limit = 30; + + //---------------------------------------- + // timing delay after enable RTD bias current in Measure_RTD() + rtd_ms = 100; //---------------------------------------- // list of registers to be read by menu item * with no arguments @@ -613,18 +644,18 @@ //---------------------------------------- // Linear map min and max endpoints - double VRef = VRef_REF2; + double VRef = ref2_v; uint8_t ref_sel = (ctrl & 0x03); // MAX11410_REF_SEL_enum_t switch(ref_sel) { - case REF_SEL_000_AIN0_AIN1: VRef = VRef_REF0; break; - case REF_SEL_001_REF1P_REF1N: VRef = VRef_REF1; break; - case REF_SEL_010_REF2P_REF2N: VRef = VRef_REF2; break; - case REF_SEL_011_AVDD_AGND: VRef = VRef_AVDD; break; - case REF_SEL_100_AIN0_AGND: VRef = VRef_REF0; break; - case REF_SEL_101_REF1P_AGND: VRef = VRef_REF1; break; - case REF_SEL_110_REF2P_AGND: VRef = VRef_REF2; break; - case REF_SEL_111_AVDD_AGND: VRef = VRef_AVDD; break; + case REF_SEL_000_AIN0_AIN1: VRef = ref0_v; break; + case REF_SEL_001_REF1P_REF1N: VRef = ref1_v; break; + case REF_SEL_010_REF2P_REF2N: VRef = ref2_v; break; + case REF_SEL_011_AVDD_AGND: VRef = avdd_v; break; + case REF_SEL_100_AIN0_AGND: VRef = ref0_v; break; + case REF_SEL_101_REF1P_AGND: VRef = ref1_v; break; + case REF_SEL_110_REF2P_AGND: VRef = ref2_v; break; + case REF_SEL_111_AVDD_AGND: VRef = avdd_v; break; } double MaxScaleVoltage = VRef; // voltage of maximum code 0xffffff double MinScaleVoltage = 0.0; // voltage of minimum code 0x000 @@ -670,18 +701,18 @@ //---------------------------------------- // Linear map min and max endpoints - double VRef = VRef_REF2; + double VRef = ref2_v; uint8_t ref_sel = (ctrl & 0x03); // MAX11410_REF_SEL_enum_t switch(ref_sel) { - case REF_SEL_000_AIN0_AIN1: VRef = VRef_REF0; break; - case REF_SEL_001_REF1P_REF1N: VRef = VRef_REF1; break; - case REF_SEL_010_REF2P_REF2N: VRef = VRef_REF2; break; - case REF_SEL_011_AVDD_AGND: VRef = VRef_AVDD; break; - case REF_SEL_100_AIN0_AGND: VRef = VRef_REF0; break; - case REF_SEL_101_REF1P_AGND: VRef = VRef_REF1; break; - case REF_SEL_110_REF2P_AGND: VRef = VRef_REF2; break; - case REF_SEL_111_AVDD_AGND: VRef = VRef_AVDD; break; + case REF_SEL_000_AIN0_AIN1: VRef = ref0_v; break; + case REF_SEL_001_REF1P_REF1N: VRef = ref1_v; break; + case REF_SEL_010_REF2P_REF2N: VRef = ref2_v; break; + case REF_SEL_011_AVDD_AGND: VRef = avdd_v; break; + case REF_SEL_100_AIN0_AGND: VRef = ref0_v; break; + case REF_SEL_101_REF1P_AGND: VRef = ref1_v; break; + case REF_SEL_110_REF2P_AGND: VRef = ref2_v; break; + case REF_SEL_111_AVDD_AGND: VRef = avdd_v; break; } double MaxScaleVoltage = 2*VRef; // voltage of maximum code 0x7fffff double MinScaleVoltage = 0; // voltage of minimum code 0x800000; @@ -738,18 +769,18 @@ //---------------------------------------- // Linear map min and max endpoints - double VRef = VRef_REF2; + double VRef = ref2_v; uint8_t ref_sel = (ctrl & 0x03); // MAX11410_REF_SEL_enum_t switch(ref_sel) { - case REF_SEL_000_AIN0_AIN1: VRef = VRef_REF0; break; - case REF_SEL_001_REF1P_REF1N: VRef = VRef_REF1; break; - case REF_SEL_010_REF2P_REF2N: VRef = VRef_REF2; break; - case REF_SEL_011_AVDD_AGND: VRef = VRef_AVDD; break; - case REF_SEL_100_AIN0_AGND: VRef = VRef_REF0; break; - case REF_SEL_101_REF1P_AGND: VRef = VRef_REF1; break; - case REF_SEL_110_REF2P_AGND: VRef = VRef_REF2; break; - case REF_SEL_111_AVDD_AGND: VRef = VRef_AVDD; break; + case REF_SEL_000_AIN0_AIN1: VRef = ref0_v; break; + case REF_SEL_001_REF1P_REF1N: VRef = ref1_v; break; + case REF_SEL_010_REF2P_REF2N: VRef = ref2_v; break; + case REF_SEL_011_AVDD_AGND: VRef = avdd_v; break; + case REF_SEL_100_AIN0_AGND: VRef = ref0_v; break; + case REF_SEL_101_REF1P_AGND: VRef = ref1_v; break; + case REF_SEL_110_REF2P_AGND: VRef = ref2_v; break; + case REF_SEL_111_AVDD_AGND: VRef = avdd_v; break; } double MaxScaleVoltage = 2 * VRef; // voltage of maximum code 0x7fffff double MinScaleVoltage = 0; // voltage of minimum code 0x800000 @@ -1793,6 +1824,11 @@ RegWrite(CMD_r000_0001_xddd_xxdd_CONV_START, 0x01); //---------------------------------------- + // purge any old data from data0 register + RegRead(CMD_r011_0000_dddd_dddd_dddd_dddd_dddd_dddd_DATA0, &AINcode[((int)ainp & 0x0F)]); + data0 = AINcode[((int)ainp & 0x0F)]; + + //---------------------------------------- // read24 0x80|0x38 STATUS (%SW 0xB8 0 0 0) RegRead(CMD_r011_1000_dddd_dddd_dddd_dddd_dxxx_dddd_STATUS, &status); @@ -1801,7 +1837,7 @@ // A bad SPI interface can cause bit slippage, which makes this loop get stuck. Expect *PART_ID? = 0x000F02 // while ((status & /* MAX11410_STATUS_enum_t:: */ STATUS_000010_DATA_RDY) == 0) { // possible infinite loop; need a timeout or futility countdown to escape - for (int futility_countdown = futility_countdown_limit; + for (int futility_countdown = loop_limit; ((futility_countdown > 0) && ((status & /* MAX11410_STATUS_enum_t:: */ STATUS_000010_DATA_RDY) == 0)); futility_countdown--) @@ -1820,19 +1856,19 @@ } //---------------------------------------- -// Menu item 'R' -> rtd_resistance, RTD_Temperature +// Menu item 'R' -> rtd_ohm, rtd_degc // Trigger Measurement for Resistive Temperature Device (RTD). // // Example code for typical RTD measurement. // // @pre external connection REF1P-REF1N is a reference resistor -// @pre VRef_REF1 = reference resistance in ohms, default=4999 +// @pre ref1_v = reference resistance in ohms, default=4999 // @param[in] rtd_iout = channel RTD high side force, default=AINP_SEL_0111_AIN7 // @param[in] rtd_ainp = channel RTD high side sense, default=AINP_SEL_1000_AIN8 // @param[in] rtd_ainn = channel RTD low side, default=AINN_SEL_1001_AIN9 // @post AINcode[rtd_ainp]: measurement result LSB code -// @post rtd_resistance: measurement result resistance in Ohms -// @post RTD_Temperature: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C +// @post rtd_ohm: measurement result resistance in Ohms +// @post rtd_degc: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C // // @return resistance calculated from raw LSB code and reference resistance double MAX11410::Measure_RTD(MAX11410_AINP_SEL_enum_t rtd_iout, MAX11410_AINP_SEL_enum_t rtd_ainp, MAX11410_AINN_SEL_enum_t rtd_ainn) @@ -1888,17 +1924,17 @@ (uint8_t) /* MAX11410_GAIN_enum_t:: */ GAIN_001_2); //---------------------------------------- - // diagnostic GPIO pulse on GP1 during RTD_power_up_interval_msec + // diagnostic GPIO pulse on GP1 during RTD power-up interval rtd_ms RegWrite(CMD_r000_0101_dddd_xddd_GP1_CTRL, 0xc3); // diagnostic GPIO pulse GP1 // write8 0x05 GP1_CTRL (%SW 0x05 0xc3) 11000 output 011 logic 0 //---------------------------------------- // timing delay after enable RTD bias current - const int RTD_power_up_interval_msec = 100; // timing delay after enable RTD bias current - wait_ms(RTD_power_up_interval_msec); // timing delay function, platform-specific + // const int rtd_ms = 100; // timing delay after enable RTD bias current + wait_ms(rtd_ms); // timing delay function, platform-specific //---------------------------------------- - // diagnostic GPIO pulse on GP1 during RTD_power_up_interval_msec + // diagnostic GPIO pulse on GP1 during RTD power-up interval rtd_ms RegWrite(CMD_r000_0101_dddd_xddd_GP1_CTRL, 0xc4); // diagnostic GPIO pulse GP1 // write8 0x05 GP1_CTRL (%SW 0x05 0xc4) 11000 output 100 logic 1 @@ -1915,7 +1951,7 @@ // A bad SPI interface can cause bit slippage, which makes this loop get stuck. Expect *PART_ID? = 0x000F02 // while ((status & /* MAX11410_STATUS_enum_t:: */ STATUS_000010_DATA_RDY) == 0) { // possible infinite loop; need a timeout or futility countdown to escape - for (int futility_countdown = futility_countdown_limit; + for (int futility_countdown = loop_limit; ((futility_countdown > 0) && ((status & /* MAX11410_STATUS_enum_t:: */ STATUS_000010_DATA_RDY) == 0)); futility_countdown--) @@ -1933,18 +1969,18 @@ Configure_MUX_CTRL1((uint8_t)IDAC1_SEL_1111_unconnected, (uint8_t)IDAC0_SEL_1111_unconnected); //---------------------------------------- - // resistance calculated from raw LSB code and VRef_REF1 reference resistance in ohms - rtd_resistance = VoltageOfCode(AINcode[((int)rtd_ainp & 0x0F)]); - TemperatureOfRTD(rtd_resistance); // calculate RTD_Temperature - return rtd_resistance; + // resistance calculated from raw LSB code and ref1_v reference resistance in ohms + rtd_ohm = VoltageOfCode(AINcode[((int)rtd_ainp & 0x0F)]); + TemperatureOfRTD(rtd_ohm); // calculate rtd_degc + return rtd_ohm; } //---------------------------------------- // Return the physical temperature corresponding to measured resistance // of a PT1000 type Resistive Temperature Device (RTD). // -// @param[in] rtd_resistance = RTD resistance in ohms, default=1000 -// @post RTD_Temperature: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C +// @param[in] rtd_ohm = RTD resistance in ohms, default=1000 +// @post rtd_degc: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C // // @return ideal temperature in degrees C, calculated from RTD resistance in ohms // @test group RTD_PT1000 // PT1000 type Resistive Temperature Device (RTD) @@ -1956,7 +1992,7 @@ // @test group RTD_PT1000 TemperatureOfRTD_PT1000(1479.5) expect 125.0 within 0.1 // PT-1000 RTD at 125C // @test group RTD_PT1000 tinyTester.blink_time_msec = 75 // default 75 resume hardware self test // -double MAX11410::TemperatureOfRTD_PT1000(double rtd_resistance) +double MAX11410::TemperatureOfRTD_PT1000(double rtd_ohm) { //---------------------------------------- @@ -1966,18 +2002,18 @@ double a = 3.9083e-3; double b = -5.7750e-7; // calculate T from R and R0 - double sqrtTerm = sqrt(R0*R0 * a*a - 4*R0*b*(R0 - rtd_resistance)); + double sqrtTerm = sqrt(R0*R0 * a*a - 4*R0*b*(R0 - rtd_ohm)); double denominator = 2 * R0 * b; - RTD_Temperature = ((-R0 * a) + (sqrtTerm)) / denominator; - return RTD_Temperature; + rtd_degc = ((-R0 * a) + (sqrtTerm)) / denominator; + return rtd_degc; } //---------------------------------------- // Return the physical temperature corresponding to measured resistance // of a PT100 type Resistive Temperature Device (RTD). // -// @param[in] rtd_resistance = RTD resistance in ohms, default=100 -// @post RTD_Temperature: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C +// @param[in] rtd_ohm = RTD resistance in ohms, default=100 +// @post rtd_degc: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C // // @return ideal temperature in degrees C, calculated from RTD resistance in ohms // @test group RTD_PT100 // PT100 type Resistive Temperature Device (RTD) @@ -1989,7 +2025,7 @@ // @test group RTD_PT100 TemperatureOfRTD_PT100(147.95) expect 125.0 within 0.1 // PT-100 RTD at 125C // @test group RTD_PT100 tinyTester.blink_time_msec = 75 // default 75 resume hardware self test // -double MAX11410::TemperatureOfRTD_PT100(double rtd_resistance) +double MAX11410::TemperatureOfRTD_PT100(double rtd_ohm) { //---------------------------------------- @@ -1999,18 +2035,18 @@ double a = 3.9083e-3; double b = -5.7750e-7; // calculate T from R and R0 - double sqrtTerm = sqrt(R0*R0 * a*a - 4*R0*b*(R0 - rtd_resistance)); + double sqrtTerm = sqrt(R0*R0 * a*a - 4*R0*b*(R0 - rtd_ohm)); double denominator = 2 * R0 * b; - RTD_Temperature = ((-R0 * a) + (sqrtTerm)) / denominator; - return RTD_Temperature; + rtd_degc = ((-R0 * a) + (sqrtTerm)) / denominator; + return rtd_degc; } //---------------------------------------- // Return the physical temperature corresponding to measured resistance // of a PT100 or PT1000 type Resistive Temperature Device (RTD). // -// @param[in] rtd_resistance = RTD resistance in ohms, default=100 -// @post RTD_Temperature: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C +// @param[in] rtd_ohm = RTD resistance in ohms, default=100 +// @post rtd_degc: Temperature calculated from RTD Resistance; Thermocouple Cold Junction, in degrees C // // @return ideal temperature in degrees C, calculated from RTD resistance in ohms // @test group RTD // Verify function TemperatureOfRTD @@ -2027,23 +2063,23 @@ // @test group RTD TemperatureOfRTD(1479.5) expect 125.0 within 0.1 // PT-1000 RTD at 125C // @test group RTD tinyTester.blink_time_msec = 75 // default 75 resume hardware self test // -double MAX11410::TemperatureOfRTD(double rtd_resistance) +double MAX11410::TemperatureOfRTD(double rtd_ohm) { //---------------------------------------- // return TemperatureOfRTD_PT100 or TemperatureOfRTD_PT1000 - if (rtd_resistance > 500.0) + if (rtd_ohm > 500.0) { - return TemperatureOfRTD_PT1000(rtd_resistance); + return TemperatureOfRTD_PT1000(rtd_ohm); } else { - return TemperatureOfRTD_PT100(rtd_resistance); + return TemperatureOfRTD_PT100(rtd_ohm); } } //---------------------------------------- -// Menu item 'TM' -> tc_voltage, tc_deltaT, tc_Temperature +// Menu item 'TM' -> tc_v, tc_delta_degc, tc_degc // Trigger Measurement for Thermocouple // // Example code for typical Thermocouple measurement. @@ -2056,9 +2092,9 @@ // @param[in] rtd_ainp = channel RTD high side sense, default=AINP_SEL_1000_AIN8 // @param[in] rtd_ainn = channel RTD low side, default=AINN_SEL_1001_AIN9 // @post AINcode[tc_ainp]: measurement result LSB code -// @post tc_voltage: raw thermocouple voltage in Volts -// @post tc_deltaT: temperature in degC above cold junction -// @post tc_Temperature: temperature in degC +// @post tc_v: raw thermocouple voltage in Volts +// @post tc_delta_degc: temperature in degC above cold junction +// @post tc_degc: temperature in degC // // @return 1 on success; 0 on failure double MAX11410::Measure_Thermocouple(MAX11410_AINP_SEL_enum_t tc_ainp, MAX11410_AINN_SEL_enum_t tc_ainn, MAX11410_AINP_SEL_enum_t rtd_iout, MAX11410_AINP_SEL_enum_t rtd_ainp, MAX11410_AINN_SEL_enum_t rtd_ainn) @@ -2132,7 +2168,7 @@ // A bad SPI interface can cause bit slippage, which makes this loop get stuck. Expect *PART_ID? = 0x000F02 // while ((status & /* MAX11410_STATUS_enum_t:: */ STATUS_000010_DATA_RDY) == 0) { // possible infinite loop; need a timeout or futility countdown to escape - for (int futility_countdown = futility_countdown_limit; + for (int futility_countdown = loop_limit; ((futility_countdown > 0) && ((status & /* MAX11410_STATUS_enum_t:: */ STATUS_000010_DATA_RDY) == 0)); futility_countdown--) @@ -2147,27 +2183,27 @@ //---------------------------------------- // ideal voltage calculated from raw LSB code and reference voltage - tc_voltage = VoltageOfCode(AINcode[((int)tc_ainp & 0x0F)]); + tc_v = VoltageOfCode(AINcode[((int)tc_ainp & 0x0F)]); //---------------------------------------- // ideal voltage calculated from raw LSB code and reference voltage - tc_deltaT = TemperatureOfTC_TypeK(tc_voltage); + tc_delta_degc = TemperatureOfTC_TypeK(tc_v); //---------------------------------------- // ideal voltage calculated from raw LSB code and reference voltage - tc_Temperature = RTD_Temperature + tc_deltaT; + tc_degc = rtd_degc + tc_delta_degc; //---------------------------------------- // ideal voltage calculated from raw LSB code and reference voltage - return tc_voltage; + return tc_v; } //---------------------------------------- // Return the physical temperature corresponding to measured voltage // of a type K Thermocouple (TC). // -// @pre {0}.RTD_Temperature = cold junction temperature, in degrees C -// @param[in] tc_voltage = Thermocouple voltage in volts, default=0.0254 +// @pre {0}.rtd_degc = cold junction temperature, in degrees C +// @param[in] tc_v = Thermocouple voltage in volts, default=0.0254 // // @return ideal temperature in degrees C, calculated from RTD resistance in ohms // @test group TC_1 // Verify Thermocouple function TemperatureOfTC_TypeK @@ -2220,16 +2256,16 @@ // @test group TC_1 TemperatureOfTC_TypeK(20.218e-3) expect 490.0 // TC_TypeK at 490C = 20.218mV // @test group TC_1 tinyTester.blink_time_msec = 75 // default 75 resume hardware self test // -double MAX11410::TemperatureOfTC_TypeK(double tc_voltage) +double MAX11410::TemperatureOfTC_TypeK(double tc_v) { //---------------------------------------- // Temperature from TC_TypeK voltage maths // define standard TC_TypeK coefficients // ITS-90 Thermocouple Inverse Polynomial for a Type K thermocouple - // calculate deltaT from tc_voltage + // calculate deltaT from tc_v // - // Voltage range -5891uV < tc_voltage < 0uV, + // Voltage range -5891uV < tc_v < 0uV, // Temperature Range -200 deg C to 0 deg C static double coefficients_TCtypeK_V_lt_0[] = { 0.00000, @@ -2243,7 +2279,7 @@ -5.1920577e-28, }; // - // Voltage range 0uV < tc_voltage < 20.644uV, + // Voltage range 0uV < tc_v < 20.644uV, // Temperature Range 0 deg C to 500 deg C static double coefficients_TCtypeK_0_lt_V_lt_20u644V[] = { 0.00000, @@ -2258,7 +2294,7 @@ -1.052755e-35, }; // - // Voltage range 20.6440uV < tc_voltage < 54.886uV, + // Voltage range 20.6440uV < tc_v < 54.886uV, // Temperature Range 500 deg C to 1372 deg C static double coefficients_TCtypeK_20u644V_lt_V_lt_54u886V[] = { -1.318058e2, @@ -2271,7 +2307,7 @@ }; // double deltaT = 0; - double thermocouple_voltage_uV = tc_voltage * 1e6; + double thermocouple_voltage_uV = tc_v * 1e6; if (thermocouple_voltage_uV < 0) { // Voltage range -5891uV < DMMavg < 0uV, Temperature Range -200 deg C to 0 deg C @@ -2287,7 +2323,7 @@ // Voltage range 0uV < DMMavg < 20.644uV, Temperature Range 0 deg C to 500 deg C deltaT = temperatureDegC_polynomial(thermocouple_voltage_uV, 10, coefficients_TCtypeK_0_lt_V_lt_20u644V); } - return deltaT; // + RTD_Temperature; // cold junction + return deltaT; // + rtd_degc; // cold junction } //----------------------------------------