Страница 1 из 1

Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 01:50:57
VOUT
Господа!
Подскажите, пожалуйста, возможную причину проблемы.
Имеется АЦП 16-бит, 80 дБ, подаю на его вход сигнал 0.01В...0.038В (см. иллюстрации).
Изображение
Все значения напряжения должны быть положительными (или в карайнем случае вблизи нуля).
С чем может быть связана вот такая инверсия сигнала?
Изображение
Измеряю один и тот же сигнал, но случаются моменты при измерении, когда сигнал как бы "инвертируется", т.е. переворачивается, и увеличению сигнала соответствует фактически (см. картинку) увеличние его в минус, хотя он должен идти в плюс.
P.S. При обращении к АЦП, переменная, которая отвечает за оцифрованные значения имеет тип Smallint;

Re: Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 06:22:35
COKPOWEHEU
А сам АЦП чего показывает, без преобразования? Сомневаюсь, что он выдает сразу дробное число.

Re: Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 07:48:20
El-Eng
SmallInt - 16-разрядное знаковое целое. Т.е. он может принимать значение от -32768 (8000H) до 32767 (7FFFH). Старший разряд - знаковый. При 16-разрядном АЦП, как только старший разряд становится единицей - SmallInt становится отрицательным и дальнейшее увеличение значения на выходе АЦП ведет к уменьшению абсолютной величины числа, т.е. имеет место инверсия (напомню: -1 это FFFFH). Используйте Word или Integer (32-разряда). Кроме того, разберитесь, в каком виде АЦП выдает данные. Некоторые АЦП могут выдавать данные в виде "смещенного двоичного кода", в котором нулю соответствует число 8000Н (для 16-разрядных данных).

Re: Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 11:26:38
VOUT
COKPOWEHEU, ацп выдаёт целые числа со знаком. Для преобразования в вольты, я умножаю эти числа на вес младшего разряда ацп (тип Double);
El-Eng, большое спасибо за указание на возможные типы.
Вот такая строчка считывает данные из буфера АЦП CopyMemory(@SampleValue, pBuffer, 2); где 2-число копируемых байтов из буфера.
Если использовать integer или longint, соответственно нужно (?) заменить 2 на 4: CopyMemory(@SampleValue, pBuffer, 4); :?

Re: Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 11:42:10
El-Eng
Нет, не так. Вы должны зарезервировать 4 байта, т.е. объявить переменную типа Integer, приравнять ее к нулю, а копировать в нее два байта т.е. CopyMemory(@SampleValue, pBuffer, 2); где @SampleValue указывает на младший байт переменной (следите за порядком байтов и направлением копирования). Цель - получить 4-х разрядный Integer, который всегда положительный (не превышает 65535). Альтернативно вы можете использовать переменную типа WORD - т.е. 16-разрядное целое без знака. Но все это для АЦП, выдающее данные без знака. Вы пишете, что у вас АЦП со знаком. Тщательно разберитесь, в каком виде выдаются эти данные, вполне может быть, что интерпретация двоичного числа со знаком на выходе АЦП отличается от интерпретации его компилятором. Тогда потребуется дополнительное преобразование.

Re: Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 13:49:57
VOUT
странно, получается:
я попробовал следующее, подал прямоугольный сигнал на вход АЦП

для Smallint CopyMemory(@SampleValue, pBuffer, 2) и CopyMemory(@SampleValue, pBuffer, 4) дают значения прямоугольного сигнала, которые совпадают с картинкой на осциллографе (странно, все равно 2 или 4), и амплитудные значения получаются реальные как на осциллографе

для Integer CopyMemory(@SampleValue, pBuffer, 2) и CopyMemory(@SampleValue, pBuffer, 4) сигнал получается прямоугольный, но по амплитудным значениям никак не похож на показания осциллографа(( и здесь уже не всё равно 2 или 4, значения реально разные.

Re: Инвертирование сигнала с АЦП

Добавлено: Пт дек 19, 2014 15:20:08
El-Eng
Ну, я здесь не знаю, чем помочь. Я посоветовал бы вообще прямым копированием пользоваться с осторожностью, лучше просто присваивать данные значению переменной (при помощи знака =), пусть компилятор старается. А АЦП-то какой?