АЦП AD7810 через LPT порт, простая схема с LM358


Схема десяти разрядного ацп, с программой.

Вот сама схемка и снимки с экрана работы всего этого:

Схема АЦП с ad7810, lm358 и опторазвязкой температура - сама термопара находится между чайником и плиткой Дрейф температуры из за помех на Vref

В схеме есть неточности!

1. Самый нижний вывод (катод 1n4148) - это T4.

2. Емкость C3 поставить между выводами T3 и T4.

3. Емкость C5 должна стоять между T2 и T4.

4. Еще, между T2 и T3 пропущена емкость, 0.1..1Мк.

Это позволить свести помехи к минимуму.

Установкой емкости на 0.1мк непосредственно между выводов 4 и 5 АЦП добился вот такого:

Дрейф +-1 разряд АЦП

Повышение точности с АЦП (метод оверсемплинга и децимации)

Из 10ти разрядного АЦП, сделать 11 разрядный. Нехитрыми математическими преобразованиями возможно добиться точности с 10-ти разрядного ацп, до.. скажем 16-ти разрядного %-).

Необходимые условия:

1. Наличие шумов на входе АЦП (прыгающие данные, 1-2 бита).

2. Делать выборку несколько раз.

3. Измеряемый сигнал во время выборок не должен "существенно" меняться.

Алгоритм для добавочного 1 бита разрешения:

1. Сделать выборку с АЦП 4 раза подряд.

2. Сложить эти числа.

3. Разделить на 2 - это и будет искомое 11 разрядное число с 10ти разрядного АЦП.

Для 2х добавочных битов потребуется сделать выборку уже 16 раз.

Очень подробно этот вопрос освещен тут: http://chipenable.ru/index.php/programming-avr/item/141-avr121-oversampling-decimation.html

На скрине - мои данные. Виртуальная точность измерения температуры стала 0.82гр/1 шаг квантования с АЦП.

Настройка УПТ для термопары на LM358

Настройка АЦП проста - первым делом нужно установить 0 градусов резистором R7, скажем в 100мв на выходе с ОУ (U1) . Потом резистором R8 при температуре в 100гр (кипящая вода, теоретически она должна быть дистиллированная и при атмосферном давлении 760мм.рт.столба) установить 600мв на ножке 1 операционного усилителя. R11 - делитель, расширяет пределы измерения температуры (и снижает точность) для AD7810. У этого АЦП порог измерения от 0 до 5в (граничное значение в 5.3в, если выше - ему поплохеет). Я установил 60% от значения напряжения на выходе ножки 1. В программе пересчет. AD 7810 имеет 10 разрядов. Соот-но она сравнивает напряжение на Uin+ (2я нога) с Vref (5я нога). И выдает цифровой код. Одинаковое напряжение на vref и Vin имеет код 1024. 1 разряд это 0.0048828125 вольт при 5ти вольт на Vref. Код с АЦП переводится так: Vref/1024*Vin. Не стоит забывать, что самый младший разряд обычно плавает.

Линейность термопар разных типов от температурыЯ использую термопару тип-К (ТХА). Она практически линейна в широком диапазоне температур. Пересчетов не делаю. Точность - 1.64 градуса на 1 разряд АЦП. Она зависит от пределов измерения температуры.

Алгоритм чтения данных с АЦП простой - дергаем ногу CS, ждем, скажем 1мс (этого времени хватит), начинаем тыркать по SCLK и читать данные с DO (Dout). Все! Ест-но не следует забывать про временные промежутки и про то, что самый первый считанный бит - старший. Всего их 10.

AD7810 10-ти разрядное АЦП. Печатная плата. термокомпенсационный диод рядом с контактами, по возможности термоизолирован. Готовое АЦП с развязкой в сборе с блоком питания Готовое АЦП с развязкой в сборе с блоком питания. Более качественная фотография.

За основу УПТ, была взята вот эта схема из даташита: УПТ на ad 8551 для термопары Она всем хороша, но там используется AD8551, которая только под заказ, за весьма немаленькую цену.

Исходник программы для чтения данных с АЦП

Ниже - мой исходник, индо-код, часть функции чтения данных с АЦП в c++. Программа чтения данных с АЦП написано в расчете под linux. Дергает ноги через вызовы ioctl. Что бы не запускать под root-от, следует добавить себя в группу lp.

int acp_in (int fd, int &byte_status){ // работает с ацп, прием-передача всего нужного, возвращает число с ацп
// инициализация.
unsigned char i1,i2,i3;
unsigned int i,control,return_temp;
double a;
return_temp=0;
control=0;
a=0.0;
i=0; // для цикла
i1=0b00100000;  //(7й пин, Sclc)
i2=0b01000000;  //(8й пин, Const)
i3=0b00000001; // для записи в 1 младш.разряда
// дергаем Const (в идеале на 1.5мкс, 7й пин должен быть 0 )
byte_status=byte_status | i2; // устанавливаем в 1 8й пин ()
    ioctl(fd, PPWDATA, &byte_status);
    usleep(TIME_P8);
byte_status^=i2; // обнуляем
    ioctl(fd, PPWDATA, &byte_status);
    usleep(TIME_P8);
// Можно принимать данные. Sclc - 1, + ..наносек.
  for (i = 1; i <= 20; i++) // задаем начальное значение 1, конечное 10 и задаем шаг цикла - 1.
{
    a=i;
    if (!(i/2 == a/2)) {
        // ставим в 1 Sclc
        byte_status=byte_status | i1; // устанавливаем в 1 7й пин ()
        ioctl(fd, PPWDATA, &byte_status);
        usleep(TIME_P7);
        //читаем 1 бит тут
        ioctl (fd, PPRSTATUS, &control);
        if ((control & PARPORT_STATUS_ERROR)==PARPORT_STATUS_ERROR) {
            usleep(TIME_P7);
            return_temp=return_temp<<1;
            return_temp=return_temp | i3;
            } else {return_temp=return_temp<<1;}
        // конец считки бита
        }  else {
            byte_status=byte_status ^ i1; // устанавливаем в 0 7й пин ()
            ioctl(fd, PPWDATA, &byte_status);
            usleep(TIME_P7);
            }
    }
return return_temp;
}

Пины LPT-порта. Назначение выводов

PPWDATA = "Parallel Port Write Data"

PPRCONTROL = "Parallel Port Read Control"

PPRSTATUS = "Parallel Port Read Status"

Pin No (DB25) Signal name Direction Register - bit Inverted
1 nStrobe Out Control-0 Yes
2 Data0 In/Out Data-0 No
3 Data1 In/Out Data-1 No
4 Data2 In/Out Data-2 No
5 Data3 In/Out Data-3 No
6 Data4 In/Out Data-4 No
7 Data5 In/Out Data-5 No
8 Data6 In/Out Data-6 No
9 Data7 In/Out Data-7 No
10 nAck In Status-6 No
11 Busy In Status-7 Yes
12 Paper-Out In Status-5 No
13 Select In Status-4 No
14 Linefeed Out Control-1 Yes
15 nError In Status-3 No
16 nInitialize Out Control-2 No
17 nSelect-Printer Out Control-3 Yes
18-25 Ground - - -

Использованные материалы, скачать:

1. Схема УПТ для термопары K-типа с опторазвязкой и термокомпенсацией спая. - в формате gEDA.

2. даташит на AD7810(10ти разрядный АЦП)

3. Про термопары, подборка литературы

Комментариев: 8
  1. А, что за диод D1?

  2. Любой кремниевый пойде. У меня стоит 1N4148.

    Перерисовал схему, добавил обозначение.

  3. Зачем? что он делает?

  4. Термокомпенсация спая. Теоретически. Это схема передрана с даташита на УПТ для термопары. Творчески переработана.

    Еще, R8 - не 70К, а меньше. Кажется 50К, не помню.. Давно ведь уже сделал, восстанавливал по памяти и клочечкам записей..

  5. 2015-08-27 в 10:13:30 | Виталий

    Почему

    нужно установить 0 градусов резистором R7, скажем в 100мв на выходе с ОУ (U1)
    , а не 0 вольт с выхода ?

  6. Я ставил 0.100в из соображений точности установки нуля градусов. Операционник ведь с однополярным питанием. Нелинейность выше у границ.

  7. 2017-01-05 в 23:22:36 | Виталий

    С Ad8552 будет работать?

  8. Конечно будет. Только, нужно определиться, зачем. Есть вариант использовать специализированные м-сх для термопар, с цифровым выходом. Благодаря братьям-китайцам и алиэкспрессу оно стало очень доступно и недорого. Все в сборе. с платой в пределах 3-5-10у.е.

Ваше мнение

Используйте нормальные имена, комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая ник, описание, контакты и т.д., а также подписку на новые комментарии.

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)