MAX11410 high speed 24-bit Delta-Sigma ADC
Dependents: MAX11410BOB_24bit_ADC MAX11410BOB_Serial_Tester
Diff: MAX11410.cpp
- Revision:
- 23:22e7830bcccb
- Parent:
- 22:c6812214a933
- Child:
- 24:428b7670e45f
--- a/MAX11410.cpp Mon Apr 13 02:59:22 2020 +0000 +++ b/MAX11410.cpp Mon Apr 13 11:14:55 2020 +0000 @@ -446,8 +446,8 @@ // @future test tinyTester.print("POR value 0x0d CMD_r000_1101_dddd_dddd_MUX_CTRL2") // @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 group POR RegRead(MAX11410::CMD_r000_1110_xxdd_xddd_PGA, buffer) expect 1 expect-buffer 0x00 +// @future test tinyTester.print("POR value 0x0e CMD_r000_1110_00ss_0ggg_PGA") +// @test group POR RegRead(MAX11410::CMD_r000_1110_00ss_0ggg_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 @@ -461,21 +461,18 @@ // @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 // @@ -541,7 +538,7 @@ ctrl = 0x01; //---------------------------------------- - // set by Configure_PGA gain index register pga CMD_r000_1110_xxdd_xddd_PGA + // set by Configure_PGA gain index register pga CMD_r000_1110_00ss_0ggg_PGA pgaGain = 1; //---------------------------------------- @@ -562,6 +559,22 @@ rtd_ms = 100; //---------------------------------------- + // filter register configuration in Measure_RTD() -- 0x34 LINEF_11_SINC4 RATE_0100 output data rate 60SPS + rtd_filter = 0x34; + + //---------------------------------------- + // ctrl register configuration in Measure_RTD() -- 0x40 unipolar, 0x01 REF_SEL_001_REF1P_REF1N + rtd_ctrl = 0x41; + + //---------------------------------------- + // source register configuration in Measure_RTD() -- 0x0B IDAC_MODE_1011_400uA + rtd_source = 0x0B; + + //---------------------------------------- + // pga register configuration in Measure_RTD() -- 0x21 SIG_PATH_10_PGA GAIN_001_2 + rtd_pga = 0x21; + + //---------------------------------------- // list of registers to be read by menu item * with no arguments static MAX11410::MAX11410_CMD_enum_t readAllStatusListValues[] = { MAX11410::CMD_r000_0000_xxxx_xxdd_PD, @@ -578,7 +591,7 @@ MAX11410::CMD_r000_1011_dddd_dddd_MUX_CTRL0, MAX11410::CMD_r000_1100_dddd_dddd_MUX_CTRL1, MAX11410::CMD_r000_1101_dddd_dddd_MUX_CTRL2, - MAX11410::CMD_r000_1110_xxdd_xddd_PGA, + MAX11410::CMD_r000_1110_00ss_0ggg_PGA, MAX11410::CMD_r000_1111_dddd_dddd_WAIT_EXT, MAX11410::CMD_r001_0000_xxxx_xxxx_WAIT_START, }; @@ -1019,7 +1032,7 @@ case CMD_r000_1011_dddd_dddd_MUX_CTRL0: case CMD_r000_1100_dddd_dddd_MUX_CTRL1: case CMD_r000_1101_dddd_dddd_MUX_CTRL2: - case CMD_r000_1110_xxdd_xddd_PGA: + case CMD_r000_1110_00ss_0ggg_PGA: case CMD_r000_1111_dddd_dddd_WAIT_EXT: case CMD_r001_0000_xxxx_xxxx_WAIT_START: return 8; // 8-bit register size @@ -1194,7 +1207,7 @@ case CMD_r000_1011_dddd_dddd_MUX_CTRL0: return "MUX_CTRL0"; case CMD_r000_1100_dddd_dddd_MUX_CTRL1: return "MUX_CTRL1"; case CMD_r000_1101_dddd_dddd_MUX_CTRL2: return "MUX_CTRL2"; - case CMD_r000_1110_xxdd_xddd_PGA: return "PGA"; + case CMD_r000_1110_00ss_0ggg_PGA: return "PGA"; case CMD_r000_1111_dddd_dddd_WAIT_EXT: return "WAIT_EXT"; case CMD_r001_0000_xxxx_xxxx_WAIT_START: return "WAIT_START"; case CMD_r001_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xddd_PART_ID: return "PART_ID"; @@ -1334,13 +1347,13 @@ { //---------------------------------------- - // pga gain 1, 2, 4, 8, 16, 32, 64, or 128 based on gain index in register pga CMD_r000_1110_xxdd_xddd_PGA + // pga gain 1, 2, 4, 8, 16, 32, 64, or 128 based on gain index in register pga CMD_r000_1110_00ss_0ggg_PGA static uint8_t pgaGainTable[8] = {1, 2, 4, 8, 16, 32, 64, 128}; pgaGain = (sigpath == SIG_PATH_10_PGA) ? pgaGainTable[(uint8_t)gain] : 1; //---------------------------------------- // write8 0x0E PGA - RegWrite(CMD_r000_1110_xxdd_xddd_PGA, (uint8_t)(0 + RegWrite(CMD_r000_1110_00ss_0ggg_PGA, (uint8_t)(0 | (((uint8_t)sigpath & 2) << 4) | (((uint8_t)gain & 7) << 0) )); @@ -1657,78 +1670,6 @@ } //---------------------------------------- -// Configure Measurement for voltage input. -// -// Example code for typical voltage measurement. -// -// SPI register write sequence test AIN0-AGND voltage input using REF2=2.5V -// write8 0x00 PD = 0x03 (Reset Registers; enter Standby mode) -// write8 0x00 PD = 0x00 (NOP) -// write8 0x08 FILTER = 0x34 to select RATE_0100, LINEF_11_SINC4 60SPS (given CONV_TYPE_01_Continuous ) -// write8 0x0B MUX_CTRL0 = 0x0A to select AINP=AIN0 and AINN=GND -// write8 0x09 CTRL = 0x02 to select reference REF2P/REF2N; or CTRL = 0x1A to select reference REF2P/REF2N with reference input buffers enabled; Data Format = Bipolar 2's Complement -// write8 0x0E PGA = 0x00 to select input path = Buffers, digital gain = 1V/V -// write8 0x01 CONV_START = 0x01 to set Conversion Mode = Continuous -// read24 0x80|0x38 STATUS (%SW 0xB8 0 0 0) -// read24 0x80|0x30 DATA0 (%SW 0xB0 0 0 0) -// -// @param[in] ainp = channel high side, default=AINP_SEL_enum_t::AINP_SEL_0000_AIN0 -// @param[in] ainn = channel low side, default=AINN_SEL_enum_t::AINN_SEL_1010_GND -// -// @return 1 on success; 0 on failure -uint8_t MAX11410::Configure_Voltage(MAX11410_AINP_SEL_enum_t ainp, MAX11410_AINN_SEL_enum_t ainn) -{ - - //---------------------------------------- - // warning -- WIP work in progress - #warning "Not Tested Yet: MAX11410::Configure_Voltage..." - - //---------------------------------------- - // write8 0x00 PD = 0x03 (Reset Registers; enter Standby mode) - RegWrite(CMD_r000_0000_xxxx_xxdd_PD, PD_11_Reset); - - //---------------------------------------- - // write8 0x00 PD = 0x00 (NOP) - RegWrite(CMD_r000_0000_xxxx_xxdd_PD, PD_00_Normal); - - //---------------------------------------- - // write8 0x08 FILTER = 0x34 to select RATE_0100, LINEF_11_SINC4 60SPS (given CONV_TYPE_01_Continuous) - Configure_FILTER((uint8_t) /* MAX11410::MAX11410_LINEF_enum_t:: */ LINEF_11_SINC4, - (uint8_t) /* MAX11410::MAX11410_RATE_enum_t:: */ RATE_0100); - - //---------------------------------------- - // write8 0x0B MUX_CTRL0 = 0x0A to select AINP=AIN0 and AINN=GND - Configure_MUX_CTRL0((uint8_t)AINP_SEL_0000_AIN0, (uint8_t)AINN_SEL_1010_GND); - - //---------------------------------------- - // write8 0x09 CTRL to select reference REF2P/REF2N; Data Format = Bipolar 2's Complement - Configure_CTRL(/*extclk*/ 0, /*u_bn*/ 0, /*format*/ 0, - /*refbufp_en*/ 0, /*refbufn_en*/ 0, - /*ref_sel*/ (uint8_t)REF_SEL_010_REF2P_REF2N); - - //---------------------------------------- - // write8 0x0E PGA - Configure_PGA((uint8_t) /* MAX11410_SIG_PATH_enum_t:: */ SIG_PATH_00_BUFFERED, - (uint8_t) /* MAX11410_GAIN_enum_t:: */ GAIN_000_1); - - //---------------------------------------- - // write8 0x01 CONV_START = 0x01 to set Conversion Mode = Continuous - RegWrite(CMD_r000_0001_xddd_xxdd_CONV_START, 0x01); - - //---------------------------------------- - // read24 0x80|0x38 STATUS (%SW 0xB8 0 0 0) - RegRead(CMD_r011_1000_dddd_dddd_dddd_dddd_dxxx_dddd_STATUS, &status); - - //---------------------------------------- - // read24 0x80|0x30 DATA0 (%SW 0xB0 0 0 0) - RegRead(CMD_r011_0000_dddd_dddd_dddd_dddd_dddd_dddd_DATA0, &data0); - - //---------------------------------------- - // success - return 1; -} - -//---------------------------------------- // Menu item '$' -> AINcode[0], AINcode[1], AINcode[2], AINcode[3], AINcode[4], AINcode[5], AINcode[6], AINcode[7], AINcode[8], AINcode[9], AINcode[10] // // Measure all ADC channels in sequence. @@ -1863,6 +1804,8 @@ // // @pre external connection REF1P-REF1N is a reference resistor // @pre ref1_v = reference resistance in ohms, default=4999 +// @pre rtd_filter = filter register configuration, 0x34 for LINEF_11_SINC4 RATE_0100 output data rate 60SPS +// @pre rtd_ctrl = ctrl register configuration, 0x40 for ref0_v, 0x41 for ref1_v, 0x42 for ref2_v // @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 @@ -1896,19 +1839,17 @@ } //---------------------------------------- - // write8 0x08 FILTER = 0x34 to select RATE_0100, LINEF_11_SINC4 60SPS (given CONV_TYPE_01_Continuous) - Configure_FILTER((uint8_t) /* MAX11410::MAX11410_LINEF_enum_t:: */ LINEF_11_SINC4, - (uint8_t) /* MAX11410::MAX11410_RATE_enum_t:: */ RATE_0100); + // write8 0x08 FILTER to select output data rate + RegWrite(CMD_r000_1000_x0dd_dddd_FILTER, rtd_filter); //---------------------------------------- // write8 0x09 CTRL to select reference resistor REF1P/REF1N; Data Format = Unipolar - Configure_CTRL(/*extclk*/ 0, /*u_bn*/ 1, /*format*/ 0, - /*refbufp_en*/ 0, /*refbufn_en*/ 0, - /*ref_sel*/ (uint8_t)REF_SEL_001_REF1P_REF1N); + RegWrite(CMD_r000_1001_dddd_dddd_CTRL, rtd_ctrl); + ctrl = rtd_ctrl; //---------------------------------------- - // write8 0x0A SOURCE = 0x0B to select IDAC_MODE 400uA; AIN9=2.000V, AIN8(PT100)=2.040V, AIN8(PT1000)=2.400V - Configure_SOURCE(VBIAS_MODE_00_Active, BRN_MODE_00_disabled, IDAC_MODE_1011_400uA); + // write8 0x0A SOURCE to select IDAC_MODE 400uA; AIN9=2.000V, AIN8(PT100)=2.040V, AIN8(PT1000)=2.400V + RegWrite(CMD_r000_1010_dddd_dddd_SOURCE, rtd_source); //---------------------------------------- // write8 0x0B MUX_CTRL0 = 0x89 to select AINP=AIN8 and AINN=AIN9 @@ -1919,9 +1860,10 @@ Configure_MUX_CTRL1((uint8_t)IDAC1_SEL_1111_unconnected, (uint8_t)rtd_iout); //---------------------------------------- - // write8 0x0E PGA - Configure_PGA((uint8_t) /* MAX11410_SIG_PATH_enum_t:: */ SIG_PATH_10_PGA, - (uint8_t) /* MAX11410_GAIN_enum_t:: */ GAIN_001_2); + // write8 0x0E PGA and update pgaGain + Configure_PGA( + ((rtd_pga >> 4) & 2), // sigpath + ( rtd_pga & 7)); // gain //---------------------------------------- // diagnostic GPIO pulse on GP1 during RTD power-up interval rtd_ms