Message ID | 20220625103853.2470346-7-marcus.folkesson@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | [v2,01/10] iio: adc: mcp3911: correct "microchip,device-addr" property | expand |
On Sat, 25 Jun 2022 12:38:50 +0200 Marcus Folkesson <marcus.folkesson@gmail.com> wrote: > The ADC conversion is actually not rail-to-rail but with a factor 1.5. > Make use of this factor when calculating actual voltage. > > Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com> Fixes tag? Also, fixes should be at the beginning of the patch set to make it easier to backport them to stable kernels etc. Otherwise looks good to me. Thanks, Jonathan > --- > > Notes: > v2: > - No changes > > drivers/iio/adc/mcp3911.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c > index 1469c12ebbb2..ede1ad97ed4d 100644 > --- a/drivers/iio/adc/mcp3911.c > +++ b/drivers/iio/adc/mcp3911.c > @@ -48,8 +48,8 @@ > #define MCP3911_CHANNEL(x) (MCP3911_REG_CHANNEL0 + x * 3) > #define MCP3911_OFFCAL(x) (MCP3911_REG_OFFCAL_CH0 + x * 6) > > -/* Internal voltage reference in uV */ > -#define MCP3911_INT_VREF_UV 1200000 > +/* Internal voltage reference in mV */ > +#define MCP3911_INT_VREF_MV 1200 > > #define MCP3911_REG_READ(reg, id) ((((reg) << 1) | ((id) << 5) | (1 << 0)) & 0xff) > #define MCP3911_REG_WRITE(reg, id) ((((reg) << 1) | ((id) << 5) | (0 << 0)) & 0xff) > @@ -178,11 +178,18 @@ static int mcp3911_read_raw(struct iio_dev *indio_dev, > > *val = ret / 1000; > } else { > - *val = MCP3911_INT_VREF_UV; > + *val = MCP3911_INT_VREF_MV; > } > > - *val2 = 24; > - ret = IIO_VAL_FRACTIONAL_LOG2; > + /* > + * For 24bit Conversion > + * Raw = ((Voltage)/(Vref) * 2^23 * Gain * 1.5 > + * Voltage = Raw * (Vref)/(2^23 * Gain * 1.5) > + */ > + > + /* val2 = (2^23 * 1.5) */ > + *val2 = 12582912; > + ret = IIO_VAL_FRACTIONAL; > break; > } >
diff --git a/drivers/iio/adc/mcp3911.c b/drivers/iio/adc/mcp3911.c index 1469c12ebbb2..ede1ad97ed4d 100644 --- a/drivers/iio/adc/mcp3911.c +++ b/drivers/iio/adc/mcp3911.c @@ -48,8 +48,8 @@ #define MCP3911_CHANNEL(x) (MCP3911_REG_CHANNEL0 + x * 3) #define MCP3911_OFFCAL(x) (MCP3911_REG_OFFCAL_CH0 + x * 6) -/* Internal voltage reference in uV */ -#define MCP3911_INT_VREF_UV 1200000 +/* Internal voltage reference in mV */ +#define MCP3911_INT_VREF_MV 1200 #define MCP3911_REG_READ(reg, id) ((((reg) << 1) | ((id) << 5) | (1 << 0)) & 0xff) #define MCP3911_REG_WRITE(reg, id) ((((reg) << 1) | ((id) << 5) | (0 << 0)) & 0xff) @@ -178,11 +178,18 @@ static int mcp3911_read_raw(struct iio_dev *indio_dev, *val = ret / 1000; } else { - *val = MCP3911_INT_VREF_UV; + *val = MCP3911_INT_VREF_MV; } - *val2 = 24; - ret = IIO_VAL_FRACTIONAL_LOG2; + /* + * For 24bit Conversion + * Raw = ((Voltage)/(Vref) * 2^23 * Gain * 1.5 + * Voltage = Raw * (Vref)/(2^23 * Gain * 1.5) + */ + + /* val2 = (2^23 * 1.5) */ + *val2 = 12582912; + ret = IIO_VAL_FRACTIONAL; break; }
The ADC conversion is actually not rail-to-rail but with a factor 1.5. Make use of this factor when calculating actual voltage. Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com> --- Notes: v2: - No changes drivers/iio/adc/mcp3911.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)