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

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 49
Зарегистрирован: Вс сен 30, 2012 00:01:53

Сообщение VOUT »

Господа!
Подскажите, пожалуйста, возможную причину проблемы.
Имеется АЦП 16-бит, 80 дБ, подаю на его вход сигнал 0.01В...0.038В (см. иллюстрации).
Изображение
Все значения напряжения должны быть положительными (или в карайнем случае вблизи нуля).
С чем может быть связана вот такая инверсия сигнала?
Изображение
Измеряю один и тот же сигнал, но случаются моменты при измерении, когда сигнал как бы "инвертируется", т.е. переворачивается, и увеличению сигнала соответствует фактически (см. картинку) увеличние его в минус, хотя он должен идти в плюс.
P.S. При обращении к АЦП, переменная, которая отвечает за оцифрованные значения имеет тип Smallint;
Вложения
2_inverted.jpg
Неправильный сигнал
(75 КБ) 381 скачивание
1_correct.jpg
Правильный сигнал
(44.65 КБ) 386 скачиваний
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А сам АЦП чего показывает, без преобразования? Сомневаюсь, что он выдает сразу дробное число.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3772
Зарегистрирован: Чт янв 26, 2012 14:44:34

Сообщение El-Eng »

SmallInt - 16-разрядное знаковое целое. Т.е. он может принимать значение от -32768 (8000H) до 32767 (7FFFH). Старший разряд - знаковый. При 16-разрядном АЦП, как только старший разряд становится единицей - SmallInt становится отрицательным и дальнейшее увеличение значения на выходе АЦП ведет к уменьшению абсолютной величины числа, т.е. имеет место инверсия (напомню: -1 это FFFFH). Используйте Word или Integer (32-разряда). Кроме того, разберитесь, в каком виде АЦП выдает данные. Некоторые АЦП могут выдавать данные в виде "смещенного двоичного кода", в котором нулю соответствует число 8000Н (для 16-разрядных данных).
Like the eyes of a cat in the black and blue...
Открыл глаза
Аватара пользователя
Сообщения: 49
Зарегистрирован: Вс сен 30, 2012 00:01:53

Сообщение VOUT »

COKPOWEHEU, ацп выдаёт целые числа со знаком. Для преобразования в вольты, я умножаю эти числа на вес младшего разряда ацп (тип Double);
El-Eng, большое спасибо за указание на возможные типы.
Вот такая строчка считывает данные из буфера АЦП CopyMemory(@SampleValue, pBuffer, 2); где 2-число копируемых байтов из буфера.
Если использовать integer или longint, соответственно нужно (?) заменить 2 на 4: CopyMemory(@SampleValue, pBuffer, 4); :?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3772
Зарегистрирован: Чт янв 26, 2012 14:44:34

Сообщение El-Eng »

Нет, не так. Вы должны зарезервировать 4 байта, т.е. объявить переменную типа Integer, приравнять ее к нулю, а копировать в нее два байта т.е. CopyMemory(@SampleValue, pBuffer, 2); где @SampleValue указывает на младший байт переменной (следите за порядком байтов и направлением копирования). Цель - получить 4-х разрядный Integer, который всегда положительный (не превышает 65535). Альтернативно вы можете использовать переменную типа WORD - т.е. 16-разрядное целое без знака. Но все это для АЦП, выдающее данные без знака. Вы пишете, что у вас АЦП со знаком. Тщательно разберитесь, в каком виде выдаются эти данные, вполне может быть, что интерпретация двоичного числа со знаком на выходе АЦП отличается от интерпретации его компилятором. Тогда потребуется дополнительное преобразование.
Like the eyes of a cat in the black and blue...
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 49
Зарегистрирован: Вс сен 30, 2012 00:01:53

Сообщение VOUT »

странно, получается:
я попробовал следующее, подал прямоугольный сигнал на вход АЦП

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

для Integer CopyMemory(@SampleValue, pBuffer, 2) и CopyMemory(@SampleValue, pBuffer, 4) сигнал получается прямоугольный, но по амплитудным значениям никак не похож на показания осциллографа(( и здесь уже не всё равно 2 или 4, значения реально разные.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3772
Зарегистрирован: Чт янв 26, 2012 14:44:34

Сообщение El-Eng »

Ну, я здесь не знаю, чем помочь. Я посоветовал бы вообще прямым копированием пользоваться с осторожностью, лучше просто присваивать данные значению переменной (при помощи знака =), пусть компилятор старается. А АЦП-то какой?
Like the eyes of a cat in the black and blue...
Ответить

Вернуться в «Теория»