А мне казалось, что именно так обычно и есть. Цена деления АЦП вроде бы всегда есть "забаненное слово", делённое на 2**N. Заглядываем в документацию от Atmel An n-bit single-ended ADC converts a voltage linearly between GND and VREF in 2n steps (LSBs). The lowest code is read as 0, and the highest code is read as 2n-1.
Т.е. диапазон преобразования делится на 1024 кванта, а не на 1023. Далее у них же
Gain error: After adjusting for offset, the gain error is found as the deviation of the last transition (0x3FE to 0x3FF) compared to the ideal transition (at 1.5 LSB below maximum).
Собственно, в самом начале описания АЦП написано:
The ADC converts an analog input voltage to a 10-bit digital value through successive approxi-
mation. The minimum value represents GND and the maximum value represents the voltage on
the AREF pin minus 1 LSB.
что вполне согласуется с последней сменой значения на выходе АЦП на полтора веса разряда ниже верхнего забаненного слова.
Atmel - шарашкина контора, не разбирающаяся в АЦП?
Ладно, Analog Devices (у кого-то есть сомнения ;-) ? )
AD9826, под рукой как раз сейчас. "забаненное слово" напряжение 4 вольта:
1 LSB = 4 V/65536 = 61 µV.
Делится не на 65535 ! Не на (ADC_MAX-ADC_MIN), а на (ADC_MAX-ADC_MIN+1), не на число переходов, а на число значений.
Там же
The point used as “zero scale” occurs 1/2 LSB before the first code transition. “Positive full scale” is defined as a level 1 1/2 LSB beyond the last code transition.
Т.е. последний код 0xFFFF происходит за полтора дискрета до "забаненное слово" напряжения. Всё потому, что захотелось первый переход сделать не на 1LSB от нуля, а на 0,5LSB, нулём считается не диапазон напряжения 0..1LSB, а диапазон +-0.5LSB.
Давненько не брал в руки
шашек АЦП от Burr-Brown, но, насколько мне изменяет склероз, там так же.
У реальных АЦП есть ошибка усиления, поэтому верхняя точка болтается относительно "забаненного слова" и смазывается то, что она находится на полтора веса ниже его, а не на пол веса.
NXP в описании LPC23xx потанцевал вокруг да около
while 0x3FF indicates that the voltage on Ain was close to, equal to, or greater than that on Vref.
Теперь теоретический вопрос - если мы возьмём идеальные ЦАП и АЦП одинаковой разрядности, запитаем от одного "забаненного слова" и подадим выход ЦАП на вход АЦП - коды должны совпадать?
Просто у того же NXP в описании ЦАП
Analog Output. After the selected settling time after the DACR is written with a new value, the voltage on this pin (with respect to VSSA) is VALUE/1024 * VREF.
В результате чего ЦАП вообще не сможет выдать напряжение, равное VREF, при коде 1023 он выдаст напряжение, на 1LSB ниже "забаненного слова". Что согласуется с приведенными выше фрагментами описаний АЦП и делением разности "забаненных слов" для АЦП на 2
N, а не (2
N-1). Ну токи можно подмасштабировать, а классика на R-2R цепочке именно так и будет работать.
А если сам АЦП построен на ЦАПе с РПП, то иначе и невозможно, его код "все единицы" будет отвечать напряжению на квант ниже того самого.
Что ещё...
О, Silabs
Table 5.1. ADC0 Unipolar Output Word Coding (AD0POL = 0)
Input Voltage 24-bit Output Word (C8051F350/1) 16-bit Output Word (C8051F352/3
VREF – 1 LSB 0xFFFFFF 0xFFFF
VREF / 2 0x800000 0x8000
Тоже код (2
N-1) соответствует не VREF, а на один квант ниже.
STM32 - документация (AN2834) противоречит сама себе - сначала говорит
1LSB = VREF+/212 or VDDA/212.
т.е. диапазон АЦП делится на 4096, а не 4095, но дальше утверждает, что последний переход находится на 0,5LSB ниже "забаненное слово", что несовместимо, так как если первый переход на 0,5LSB а последний на VREF-0.5LSB, то тогда таки 1LSB = VREF+/(2
12-1). Противоречащий сам себе документ отбрасывается.
Так что я продолжаю считать, что деление на 2
N как раз и есть "теоретически правильным", а дальше либо всё равно, либо калибровка учтёт :-)