• Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
Sign in to follow this  
Followers 0
Don_Arturos

Взаимодействие Omega2 с промышленными слаботочными датчиками

1 post in this topic

Возможности микрокомпьютера Omega2 довольно большие! В этом руководстве я покажу Вам, как использовать Onion Omega2 с промышленными датчиками (4-20 мА).

Датчики 4-20 мА эффективно использовать в промышленных проектах. Такие датчики используют изменение силы тока для отправки данных. Это позволяет отправлять информацию на большие расстояния, поскольку ток не затухает на протяжении всей длины проводника.

Почему именно 4-20 мА — стандартный диапазон силы тока?

На этот вопрос есть очень простой ответ. Датчик использует в качестве нулевого показания значение в 4 мА. Если бы для этой цели использовались 0 мА, то не было бы никакого способа обнаружить неисправность датчика по сравнению с оборванным проводом.При использовании диапазона 4-20 мА оборванный провод будет показывать 0 мА. Работающий датчик подает ток на линии минимум от 4 мА, что указывает на готовность датчика к работе. Этот стандарт уже давно используется в промышленности, чтобы легко устранять проблемы с проводкой на больших расстояниях. Самое главное — стандарт 4-20 мА не имеет ничего общего с 4:20, это просто "счастливое" совпадение:)

Существует множество промышленных датчиков с выходом 4-20 мА. Наиболее распространенными являются датчики расстояния, давления, температуры, расходомеры, датчики веса и многие другие. Из этой статьи Вы узнаете, как можно считать данные со всех этих датчиков с помощью микрокомпьютера Омега2 и платы для считывания входного сигнала 4-20 мА на основе чипа MCP3428 с 4-х удаленных датчиков.

Необходимый набор электронных устройств для повторения проекта

Предполагаю, что датчики у Вас уже есть. Также понадобятся: 

  • Onion Omega2+

Onion_Omega2_1.png.78597e521018d31a742294f1a707f57e.png

  • Адаптер с поддержкой интерфейса для интернета вещей (IoT)

OA_A_1.thumb.png.26b07ba2e54ad7d42ad12918ae67eac2.png

  • 4-х канальный 4-20 мА модуль MCP3428

PE_4-20mA_4C_1.thumb.png.241e88e843a50e6f3160aa3c1a6add4c.png

Все модули подключаются очень просто, по принципу "включай и работай", поэтому дополнительные провода и, тем более, пайка. Все, что Вам нужно — это вставить Omega2+ в адаптер IoT, а адаптер вставляется в плату расширения на основе MCP3428, а затем к плате подключаются датчики.

Настройка Omega2+

Считыватель тока (4-20 мА) имеет чип MCP3428 для преобразования аналоговых значений в цифровые, которые этот MCP3428 по I2C отправит на Omega2. Для работы с интерфейсом I2C потребуется установить драйвер Python I2C в Onion Omega2 при помощи следующих команд:

opkg update
opkg install python-light pyOnionI2C

Наш считыватель данных с датчиков очень прост в использовании, поскольку в принципе его работы лежит обычный цифрово-аналоговый преобразователь (АЦП). Это устройство имеет 4 входных канала со встроенным усилителем для формирования сигнала. Для считывания сигналов с датчиков необходимо настроить следующие параметры:

  1. Установить MCP3428 Gain на 2
  2. Установите битовое разрешение MCP3428 на 12 (поддерживает до 16 бит, если Вам нужно лучшее разрешение)

Почему 12-битное разрешение лучше?

MCP3428 поставляется с настройкой трех возможных уровней разрешений: 12, 14 и 16 бит. В 12-битном режиме MCP3428 берет до 240 выборок в секунду для вычисления значения на АЦП. В 14-битном режиме MCP3428 отбирает до 60 выборок в секунду. Наконец, в 16-битном разрешении скорость выборок значительно замедляется до 15 в секунду. Для считывания аналоговых значений MCP3428 измеряет время разряда встроенных конденсаторов. Соответственно, чем выше разрешение, тем дольше времени требуется на разрядку конденсаторов, чтобы завершить показания. 

Если Вам требуется лучшее разрешение (речь про 16 бит), а потраченное время проблемой не является, то можете его использовать. Также советуем для 16-битного режима внимательно ознакомиться с таблицей данных MCP3428, так как быстрое чтение может привести к появлению ошибочных данных.

Библиотека Python для чтения входов 4-20 мА

Библиотека доступна на GitHub по ссылке.

# Distributed with a free-will license.
# Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
# MCP3428
# This code is designed to work with the MCP3428_I2CADC I2C Mini Module available from ControlEverything.com.
# https://shop.controleverything.com/collections/4-20-ma-current-loop-input
import smbus
import time
DL = 0.01
DL1 = 0.01
# Get I2C bus
address = 0x68
bus = smbus.SMBus(1)
 
# MCP3428 address, 0x68(104)
# Send configuration command
# 0x11(17)Continuous conversion mode, Channel-1, 12-bit Resolution,gain2
 
while True:
        bus.write_byte(address, 0x11)
        time.sleep(DL1)
# MCP3428 address, 0x68(104)
# Read data back from 0x00(0), 2 bytes
# raw_adc MSB, raw_adc LSB
        data = bus.read_i2c_block_data(address, 0x00, 2)
 
# Convert the data to 12-bits
        raw_adc = (data[0] & 0x0F) * 256 + data[1]
        if raw_adc > 2047 :
                raw_adc -= 4095
        current = (raw_adc * 0.01109)
# Output data to screen
        print "Current Output channel 1 : %.2f" %current
        time.sleep(DL)
 
####### channel 2
        bus.write_byte(address, 0x31)
        time.sleep(DL1)
# MCP3428 address, 0x68(104)
# Read data back from 0x00(0), 2 bytes
# raw_adc MSB, raw_adc LSB
        data = bus.read_i2c_block_data(address, 0x00, 2)
 
# Convert the data to 12-bits
        raw_adc = (data[0] & 0x0F) * 256 + data[1]
        if raw_adc > 2047 :
                raw_adc -= 4095
        current = (raw_adc * 0.01109)
# Output data to screen
        print "Current Output channel 2 : %.2f" %current
        time.sleep(DL)
############ channel 3
        bus.write_byte(address, 0x51)
        time.sleep(DL1)
# MCP3428 address, 0x68(104)
# Read data back from 0x00(0), 2 bytes
# raw_adc MSB, raw_adc LSB
        data = bus.read_i2c_block_data(address, 0x00, 2)
 
# Convert the data to 12-bits
        raw_adc = (data[0] & 0x0F) * 256 + data[1]
        if raw_adc > 2047 :
                raw_adc -= 4095
        current = (raw_adc * 0.01101)
# Output data to screen
        print "Current Output channel 3 : %.2f" %current
        time.sleep(DL)
####### channel 4
        bus.write_byte(address, 0x71)
        time.sleep(DL1)
# MCP3428 address, 0x68(104)
# Read data back from 0x00(0), 2 bytes
# raw_adc MSB, raw_adc LSB
        data = bus.read_i2c_block_data(address, 0x00, 2)
 
# Convert the data to 12-bits
        raw_adc = (data[0] & 0x0F) * 256 + data[1]
        if raw_adc > 2047 :
                raw_adc -= 4095
        current = (raw_adc * 0.01094)
# Output data to screen
        print "Current Output channel 4 : %.2f" %current
        time.sleep(DL)
from OmegaExpansion import onionI2C
import time
# Get I2C bus
i2c = onionI2C.OnionI2C()

Приведенный выше пример предназначен для импорта модуля Onion Omega I2C

long MCP3426::readADC()
{
 
    raw_adc = 0;
 
    while(CheckConversion() == 1);
 
    switch (SPS)
    {
  
        case 12:
                raw_adc = data[0];
                raw_adc &= 0b00001111;
                raw_adc = raw_adc << 8;
                raw_adc |= data[1];
 
                if(raw_adc > 2047)
                {
                    raw_adc = raw_adc - 4096;
                }
        
                // raw_adc = raw_adc * LSB(1 mV)/PGA for PGA = 1;
        
                break;
    
        case 14:
                raw_adc = data[0];
                raw_adc &= 0b00111111;
                raw_adc = raw_adc << 8;
                raw_adc |= data[1];
 
                if(raw_adc > 8191)
                {
                    raw_adc = raw_adc - 16384;
                }
        
                // raw_adc = raw_adc * LSB(250 µV)/PGA for PGA = 1;
       
                break;
    
        case 16:
 
                raw_adc = data[0];
                raw_adc = raw_adc << 8;
                raw_adc |= data[1];
 
                if(raw_adc > 32767)
                {
                    raw_adc = raw_adc - 65536;
                }
            
                // raw_adc = raw_adc * LSB(62.5 µV)/PGA for PGA = 1;
      
                break;
    }
    return raw_adc;
}

Приведенный выше раздел используется для настройки MCP3428 на считывание первого канала с 12-битным разрешением и усилением 2 (это очень важный момент). После того, как будут записаны байты настройки, вводится небольшая задержка, чтобы дать каналу некоторое время для настройки и успеть взять достаточно выборок для вычисления значения АЦП. Если задержка будет слишком маленькой, то могут возникнуть колебания показаний. При работе MCP3428 в 16-битном режиме необходимо установить более высокое значение задержки (около 1 секунды). Таблицу значений можно посмотреть здесь.

Адресация MCP3428

Плата приемника 4-20 мА имеет 2 перемычки с поддержкой плавающего значения адреса. Чтобы узнать больше о настройке адреса, смотрите приведенную ниже схему подключения:

sFuagQ2Fj9LXTLXoq92FJfw.thumb.png.040a01e16ef249974067437cadc7752d.png

Конфигурация MCP3428 и примеры настроек

Регистр конфигурации MCP3428 используется для настройки выбора канала , режима преобразования, частоты дискретизации и усиления. Этот регистр имеет 8 битов, которые можно изменить для получения определенной настройки. Наиболее распространенные биты, о которых важно знать, это:

  1. Выбор канала — биты 5 и 6 регистра конфигурации
  2. Режим преобразования — бит 4 (оставьте его установленным, чтобы использовать MCP3428 в непрерывном режиме
  3. Частота дискретизации — бит 3 и бит 2 для выбора частоты
  4. Gain — биты 1 и 0 (оставьте их равными 0, 1) для чтения входа 4-20 мА

 

  • Допустим мы хотим прочитать данные с первого канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

Бит 7 — 0, бит 6 — 00, бит 5 — 00, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 00010001 === 0x11

  • Допустим мы хотим прочитать данные со второго канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

Бит 7 — 0, бит 6 — 01, бит 5 — 01, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 00110001 === 0x31

  • Допустим мы хотим прочитать данные с третьего канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

Бит 7 — 0, бит 6 — 10, бит 5 — 10, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 01010001 === 0x51

  • Допустим мы хотим прочитать данные с 4-го канала с 12-битным разрешением. В таком случае наши биты будут выглядеть вот так:

Бит 7 — 0, бит 6 — 11, бит 5 — 11, бит 4 — 1, бит 3 — 00, бит 2 — 00, бит 1 — 01, бит 0 — 01 ====== 01110001 === 0x71

  • Допустим мы хотим прочитать данные с первого канала с 16-битным разрешением. В таком случае наши биты будут выглядеть вот так:

Бит 7 — 0, бит 6 — 00, бит 5 — 00, бит 4 — 1, бит 3 — 10, бит 2 — 10, бит 1 — 01, бит 0 — 01 ====== 00011001 === 0x19

Смотреть биты конфигурации можно также в таблице:

MCP3428_setip.thumb.jpg.431ff82fc03abf86792185b43b583227.jpg

Как только все это будет установлено, запустите библиотеку Python. По итогу Вы должны будете увидеть показания со всех четырех каналов, один за другим. Если ко входу 4-20 мА не будет подключен датчик, то Вы увидите следующие показания:

Onion-Omega-No-input-1038x882.thumb.png.35bdb25e8b53f7be1e00900052fdb8e4.png 

Показания при подключенном датчик 4мА выглядят так:

4mA-input.thumb.png.efc26ae2450032ba14ef1a05adcfc9da.png

Angle2.thumb.png.a837e76e92793636917c5e845e914a4f.png

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0