Исследование внешнего i2c АЦП MCP3421, ИОН (2,048 вольта) встроен в чип АЦП


Код исходника избыточен, выложен для примера, опробованы 4 режима измерения (12 бит, 14 бит, 16 бит, 18 бит), выбирается константой в исходнике

'===============================================================================
'*
'*  Автор: Sasha_1973
'*  Дата:  17.05.2014 г.
'*  МК:  ATmega328P
'*  Тактовая частота МК:  1 MГц
'*
'*  Компилятор: BASCOM-AVR 2.0.7.1
'*  Используемый шрифт в Bascom: Consolas; размер = 14
'*
'*  Программа симулятор: Proteus 7.10 SR0 rus
'*
'*  Описание: Исследование внешнего i2c АЦП MCP3421
'*
'===============================================================================

  $map              ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"
  $crystal = 1000000
  $framesize = 32   ' Размер области используемой и необходимой для преобразований
  $hwstack = 40     ' Размер аппаратного стека
  $swstack = 16     ' Размер программного стека

  $baud = 4800 : Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'===============================================================================
'             Н А С Т Р О Й К А     Ш И Н Ы     i2c
'===============================================================================

  Config Sda = Portc.4       ' I2c Sda
  Config Scl = Portc.5       ' I2c Scl
  Config I2cdelay = 1       ' Скорость работы шины I2c на программном уровне
  I2cinit

'===============================================================================
'             И С П О Л Ь З У Е М Ы Е     К О Н С Т А Н Т Ы
'===============================================================================

  Const Const_дискретность_измерения = 16

  Const Чтение_mcp3421 = &B11010001       ' Адрес чтения MCP3421
  Const Запись_mcp3421 = &B11010000       ' Адрес записи MCP3421

  Dim Дискретность_измерения As Byte
  Дискретность_измерения = Const_дискретность_измерения

'  Настройки по умолчанию = &B10010000
'  Байт_настройки_MCP3421 = &B00000000
'                             ||||||||
'                             |||||||+--- 0 - Коэффициент усиления
'                             ||||||+---- 1 - Коэффициент усиления
'                             |||||+----- 2 - Выбор частоты дискретизации
'                             ||||+------ 3 - Выбор частоты дискретизации
'                             |||+------- 4 - Режим преобразования, 1 - непрерывное, 0 - одиночное с необходимостью перезапуска
'                             ||+-------- 5 - Выбор канала, в чипе MCP3421 не используется
'                             |+--------- 6 - Выбор канала, в чипе MCP3421 не используется
'                             +---------- 7 - При чтении - флаг готовности преобразования, при записи START преобразования

  Select Case Дискретность_измерения
      Case 12 : Const 12bit_ацп = &B10010000       ' 240 SPS (12 bits) (Default)
      Case 14 : Const 14bit_ацп = &B10010100       ' 60 SPS (14 bits)
      Case 16 : Const 16bit_ацп = &B10011000       ' 15 SPS (16 bits)
      Case 18 : Const 18bit_ацп = &B10011100       ' 3.75 SPS (18 bits)
  End Select        ' Дискретность_измерения

'===============================================================================
'             И С П О Л Ь З У Е М Ы Е     П Е Р Е М Е Н Н Ы Е
'===============================================================================

  Dim Флаг_минус As Byte
  Dim Сырые_данные_ацп(3) As Byte

  If Дискретность_измерения > 16 Then
      Dim Данные_ацп_long As Long At Сырые_данные_ацп(1) Overlay
    Else
      Dim Данные_ацп_integer As Integer At Сырые_данные_ацп(1) Overlay
  End If

  Dim Готовые_данные_single As Single
  Dim Готовые_данные_str As String * 10

'===============================================================================
'            И С П О Л Ь З У Е М Ы Е     П О Д П Р О Г Р А М М Ы
'===============================================================================

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

  Gosub Настройка_внешнего_ацп

  Waitms 200

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------

'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:

    Gosub Чтение_внешнего_ацп

    Select Case Дискретность_измерения
        Case 12 :
                  Готовые_данные_single = Данные_ацп_integer * 0.001
                  Готовые_данные_str = Fusing(готовые_данные_single , "#.###")
        Case 14 :
                  Готовые_данные_single = Данные_ацп_integer * 0.00025
                  Готовые_данные_str = Fusing(готовые_данные_single , "#.#####")
        Case 16 :
                  Готовые_данные_single = Данные_ацп_integer * 0.0000625
                  Готовые_данные_str = Fusing(готовые_данные_single , "#.#######")
        Case 18 :
                  Готовые_данные_single = Данные_ацп_integer * 0.000015625
                  Готовые_данные_str = Fusing(готовые_данные_single , "#.#########")
    End Select      ' Дискретность_измерения

    If Флаг_минус <> 0 Then
        Print "-" ; Готовые_данные_str ; " V"
        Флаг_минус = 0
      Else
        Print Готовые_данные_str ; " V"
    End If

    Waitms 200

  Goto Главный_цикл
End
'===============================================================================
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Чтение_внешнего_ацп:
'-------------------------------------------------------------------------------

    I2cstart
    I2cwbyte Чтение_mcp3421

    If Дискретность_измерения = 18 Then
        I2crbyte Сырые_данные_ацп(3) , Ack
        If Сырые_данные_ацп(3).7 = 1 Then Флаг_минус = 1
    End If

    I2crbyte Сырые_данные_ацп(2) , Ack
    If Сырые_данные_ацп(2).7 = 1 Then Флаг_минус = 1

    I2crbyte Сырые_данные_ацп(1) , Nack
    I2cstop

    Select Case Дискретность_измерения
        Case 12 :
                  Сырые_данные_ацп(2) = &B00000000 And Сырые_данные_ацп(2)
        Case 14 :
                  Сырые_данные_ацп(2) = &B00011111 And Сырые_данные_ацп(2)
        Case 16 :
                  Сырые_данные_ацп(2) = &B01111111 And Сырые_данные_ацп(2)
        Case 18 :
                  Сырые_данные_ацп(3) = &B00000011 And Сырые_данные_ацп(3)
                  Сырые_данные_ацп(2) = &B11111111 And Сырые_данные_ацп(2)
    End Select      ' Дискретность_измерения

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Настройка_внешнего_ацп:
'-------------------------------------------------------------------------------

    I2cstart
    I2cwbyte Запись_mcp3421

    Select Case Дискретность_измерения
        Case 12 : I2cwbyte 12bit_ацп
        Case 14 : I2cwbyte 14bit_ацп
        Case 16 : I2cwbyte 16bit_ацп
        Case 18 : I2cwbyte 18bit_ацп
    End Select      ' Дискретность_измерения

    I2cstop

'-------------------------------------------------------------------------------
  Return
'===============================================================================


Пределы входного напряжения:

  -2,048...2,048 вольт

Дискретность измерения:

12 bits 1 mV, 240 SPS,  -2048.....2047

14 bits 250 µV, 60 SPS,  -8192.....8191

16 bits 62.5 µV, 15 SPS,   -32768.....32767

18 bits 15.625 µV, 3.75 SPS,   -131072.....131071


! Дискретность выбирается соответсвенно в исходнике и симуляции !

http://sa.uploads.ru/t/PdfmJ.jpg

Симуляция (Протеус 7.10) + Исходник (Bascom 2.0.7.1) + документация --  скачать