From: Jonathan Cameron <jic23@cam.ac.uk>
To: michael.hennerich@analog.com
Cc: "linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>,
"device-drivers-devel@blackfin.uclinux.org"
<device-drivers-devel@blackfin.uclinux.org>
Subject: Re: IIO: Interface for capacitance inputs (and outputs)
Date: Wed, 03 Aug 2011 15:04:04 +0100 [thread overview]
Message-ID: <4E395554.6020502@cam.ac.uk> (raw)
In-Reply-To: <4E3951BF.8000104@analog.com>
>>>>>> Hi Michael / All,
>>>>>>
>>>>>> We have a quite a few capacitance drivers. They are all simple and so
>>>>>> would be easy to clean up, except for the fact that we don't have an abi
>>>>>> for them.
>>>>>>
>>>>>> So lets make one up. How about the following? Main choice is the units...
>>>>>> Doing it with Farads leaves us with a lot of needed decimal places, but then
>>>>>> we need a lot anyway for these so what the heck. We are going to need those
>>>>>> types with holes in them..
>>>>> Hi Jonathan,
>>>>>
>>>>> These devices typically feature an single digit pF input range(2..8 pF).
>>>>> Going with a scale in Farads is probably not going to work.
>>>>> What do you mean by types with holes in them?
>>>> IIO_VAL_INT_PLUS_FEMTO where FEMTO bit has maximum of 999999999 Thus there are quite a
>>>> few leading zeros.
>>> The part has a full range of +/- 4.096pf and it is a 24-bit converter.
>>> We like to store the conversion result as 3-byte direct readings from the device result register.
>>>
>>> Thus the Farad scale would need to be
>>> 8.192E-12 / 2^24 = 4.8828125E-19 = 0.00000000000000000048828125.
>>>
>>> I don't think this makes any sense?
>> It's certainly uggly.
>>>>> We need something scanf() and friends can eat...
>>>> Yup.
>>>>> In addition we have enough scale bits before the decimal point as well.
>>>> Please give an example why. Do we have a calibscale type attribute here?
>>> I don't understand, why calibscale would matter here?
>> Because it's the only item I can think of where a value of
>> 0.99999999999999999999999999999999999992 would make sense and that's the one
>> nasty case that requires a 'lot' of digits to represent currently).
>>> But sure we have a in_capacitanceY_scale.
>>> If we say the in_capacitanceY_scale targets pF.
>>>
>>> Then we still need enough fractional digits, due to the 24-bit nature of the device.
>> Sure, it's a large number of digits. I'm increasingly wondering if we move everything to
>> 64 bit just to give us the space. This stuff is all ready relatively slowly anyway.
>>> Now not talking about this part, maybe something that can measure ranges up to 1mF
>>> - which is quite a huge capacitance.
>>> If the scale targets pF, then we actually use the pre-decimal point positions we have.
>> Fair point and using that we can go up to very large capacitances if there is ever the need.
>>>
>>>>> I would make the scale targeting pF of uF.
>>>> I thought about that but then we are back to having a fairly illogical set of
>>>> units for the different types of devices.
>>> That's in the nature of these units.
>>> 1V, 1A is pretty common 1F is not.
>> I know, but despite that it would be nice to be consistent.
>>> Either move to an floating point exponential notation, or balance the scale somewhere in the middle.
>> We could do the exponential notation I suppose.
>>
>> Maybe picofarads is the right option.
>>>>>> What: /sys/bus/iio/devices/iio:deviceX/in_capacitanceY_raw
>>>>>> What: /sys/bus/iio/devices/iio:deviceX/out_capacitanceY_raw
>>>>>> What: /sys/bus/iio/devices/iio:deviceX/in_capacitanceY-capacitanceZ_raw
>>>>>> KernelVersion: 3.1
>>>>>> Contact: linux-iio@vger.kernel.org
>>>>>> Description:
>>>>>> Raw (unscaled no bias removal etc) capacitance value from/to
>>>>>> channel Y. After application of _offset and _scale, units will
>>>>>> be Farads.
>>>>>>
>>>>>> Additional entries for:
>>>>>>
>>>>>> What: /sys/bus/iio/devices/iio:deviceX/in_capacitanceY_offset
>>>>>> What: /sys/bus/iio/devices/iio:deviceX/in_capacitanceY_scale
>>>>>>
>>>>>>
>>>>>> With the ad7745 the capdac does seem to be available off chip.
>>>>> Why do you think the CAPDAC is off-chip on the AD7745?
>>>>> The CAPDAC can be seen as a negative capacitance connected internally
>>>>> to the Cin pin.
>>>> Oops. That was meant to be doesn't not does... Sorry for the confusion.
>>>>>> If I understand
>>>>>> their use correctly it could just be treated as a _calibbias parameters?
>>>>> Yes - it can be seen as a bias - however why do you have out_capacitanceY_raw then?
>>>> :) Because I hadn't looked at the datasheet properly when I wrote that bit and forgot
>>>> to go back and edit it. This really wasn't my most coherent email ever. Google isn't
>>>> feeding me any digital to capacitance devices so looks like the output side of things
>>>> is irrelevant.
>>>>>> (the complexity being that there are two..)
>>>>> Yes - one for each Cin(+|-) pin.
>>>>> More tricky on the AD7746, since there are only two CAPDACs for two Cin(+|-) pin pairs.
>>>> As you state below that you tend to save and restore the zero offset, can we not do the
>>>> same with the capdac values? If so they can be treated from a userspace point of view
>>>> as completely independent.
>>> Sure
>>>>>> Naturally there is also a
>>>>>> calibration register so this gets somewhat tricky...
>>>>> The calibration register typically holds the zero-scale calibration coefficient.
>>>>> It's automatically updated following the capacitance offset calibration.
>>>>> Tricky here is that there is only one on the AD7746, so the values must be saved
>>>>> and restored when switching between the input pairs.
>>>>>
>>>>>> Is there an optimum
>>>>>> combination for a given desire measurement range?
>>>>>>
>>>>>>
>>>>> Yes there is - large offsets> 1 pF should be eliminated by the CAPDACs.
>>>> Fair enough. So what is the conclusion for what interface elements we
>>>> actually need to control this?
>>> Let me think about this a bit more.
>> Will do.
> Hi Jonathan,
>
> I don't think it's practical or fits the typical use case to just have _calibbias handling both.
> How about following -
>
> The cap offset calibration register maps to _calibbias and handles the small calibration offsets.
> We also need a do calibrate attribute...
>
> For the larger CAPDAC offsets, we introduce in_capacitanceY_bias.
> in_capacitanceY_offset would be nicer, but we already use it for other purposes.
>
> Thoughts?
Works for me. Will need to document this very clearly to stop people mixing up
_bias and _offset.
prev parent reply other threads:[~2011-08-03 13:56 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-01 17:21 IIO: Interface for capacitance inputs (and outputs) Jonathan Cameron
2011-08-02 8:11 ` Michael Hennerich
2011-08-02 9:06 ` Jonathan Cameron
2011-08-02 14:58 ` Michael Hennerich
2011-08-02 15:18 ` Jonathan Cameron
2011-08-03 13:48 ` Michael Hennerich
2011-08-03 14:04 ` Jonathan Cameron [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E395554.6020502@cam.ac.uk \
--to=jic23@cam.ac.uk \
--cc=device-drivers-devel@blackfin.uclinux.org \
--cc=linux-iio@vger.kernel.org \
--cc=michael.hennerich@analog.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.