It is currently Thu Dec 13, 2018 2:29 am

НИЛ АСЭМ Научно - исследовательская лаборатория автоматизированных систем экологического мониторинга

DAC MCP4921, 12-Bit [SO-8], SPI Interface

by Admin » Tue May 22, 2018 4:06 pm

12-битный цифрово-аналоговый преобразователь MCP4921 с SPI - интерфейсом

Image Image
Структурная схема и внешний вид чипа

MCP4921 представляет собой одноканальный 12-битный ЦАП, который использует внешний источник опорного напряжения. Связь с устройством осуществляется с помощью простого последовательного интерфейса SPI. MCP4921 является частью семейства ЦАП, которые используют внешний источник опорного напряжения (VREF). Эти устройства обеспечивают очень высокую точность и низкий уровень шумов, и пригодны для потребительских и промышленных приложений.

Отличительные особенности:
· разрешение: 12 разрядов;
· дифференциальная нелинейность: ±0,2 младшего разряда (тип);
· интегральная нелинейность: ±2 младших разряда (тип);
· выходы Rail-to-Rail;
· SPI-интерфейс с частотой до 20МГц;
· синхронные защелки данных на обоих ЦАП;
· малое время установления: 4,5мкс;
· выбор выходного коэффициента усиления 1х или 2х;
· вход для внешнего источника опорного напряжения VREF;
· диапазон напряжения питания: 2,7В...5,5В;
· количество выводов: 8
· тип входа: последовательный
· температурный диапазон: -40°C...+125°C;
· корпуса: MSOP-8 (MS) и DIP-8 (P).

Области применения:
Калибраторы датчиков, генераторы уровня сдвига, цифровые делители/умножители напряжения, портативные инструменты с батарейным питанием, контроль в петле обратной связи управления двигателями.

Расположение выводов (Цоколевка):

Image
Выводы MCP4921

Функциональное назначение выводов:



Управляющий регистр MCP4921:
Image
Структура регистра и управляющие команды


Диаграмма записи команд:
Image
Взаимодействие с микроконтроллером


Схемы включения MCP4921:
Image
MCP4921 сопряжен с микроконтроллером 18F452 по стандартному SPI-интерфейсу, результат смоделирован в системе Proteus


Image
Схема включения MCP4921 в качестве биполярного источника напряжения

Управляющий код для микроконтроллера (на Proton BASIC Compiler):
Code: Select all
Device = 18F452
Xtal =  20
@Config_REQ
@__Config Config1H, OSCS_OFF_1 & HS_OSC_1
@__Config Config2L, BOR_OFF_2 & BORV_20_2 & PWRT_ON_2
@__Config Config2H, WDT_OFF_2 & WDTPS_128_2
@__Config Config3H, CCP2MX_OFF_3
@__Config Config4L, STVR_OFF_4 & LVP_OFF_4 & DEBUG_OFF_4
                         
Declare LCD_Type=0         
Declare LCD_DTPin PORTB.4         
Declare LCD_ENPin PORTB.3         
Declare LCD_RSPin PORTB.2         
Declare LCD_Interface 4           
Declare LCD_CommandUs 2000       
Declare LCD_DataUs 50             
Declare LCD_Lines 2             

    Symbol DAC_LAT = PORTD.1         ' To DAC LDAC pin (Active Low)
    Symbol DAC_SDO = PORTD.0         ' SPI SDO to DAC SDI
    Symbol DAC_SCK = PORTD.3         ' SPI SCK to DAC CLK
    Symbol DAC_CS = PORTD.2          ' SPI CS to DAC CS (Active Low)

    Dim mDacVar As PRODL.Word       ' Alias to PRODL\H
    Dim wDacValue As Word System    ' Holds the value to write to the DAC
    Dim bLoop As Byte System        ' Used as a loop counter
'-----------------------------------------------------------------------------
    GoTo Main                       ' Jump over the subroutines

'-----------------------------------------------------------------------------
' Implementation of a Software Mode 0 Master SPI (out only) interface.
' Transmits 16-bits using the SPI protocol mode 0 (MSB first)
' SCK is idle-low, and bits are latched on SCK rising.
(*
bit 15      A/B: DACA or DACB Select bit
                1 = Write to DACB
                0 = Write to DACA
bit 14      BUF: VREF Input Buffer Control bit
                1 = Buffered
                0 = Unbuffered
bit 13      GA: Output Gain Select bit
                1 = 1x (VOUT = VREF * D/4096)
                0 = 2x (VOUT = 2 * VREF * D/4096)
bit 12      SHDN: Output Power Down Control bit
                1 = Output Power Down Control bit
                0 = Output buffer disabled, Output is high impedance
bit 11-0    D11:D0: DAC Data bits
                12 bit number "D" which sets the output value. Contains a value between 0 and 4095.
*)
Reminders = Off

$define DacOut(pValue) mDacOut pValue

mDacOut Macro pValue
    #if((Prm_1 == Num8) || (Prm_1 == Num16) || (Prm_1 == Num32))
        Num_Word pValue, mDacVar
    #endif
    #if(Prm_1 == Byte)
        Byte_Word pValue,mDacVar
    #endif
    #if((Prm_1 == Word) || (Prm_1 == Dword))
        Word_Word pValue,mDacVar
    #endif
    GoSub _OutSPI_Mode0
    Endm

#ifdef mDacOut#req
'
' Input     : PRODL\H hold the 16-bit value to send
'           : DAC_SCK is the LAT.BIT of the SPI Clock pin
'           : DAC_SDO is the LAT.BIT of the SPI Data Out Pin
'           : DAC_LAT is the LAT.BIT of the LDAC Pin
'           : DAC_CS is the LAT.BIT of the SPI CS Pin
' Output    : None
' Notes     : Uses WREG as the loop counter
'
_OutSPI_Mode0:
    Set DAC_LAT
    Clear DAC_CS
    mDacVar.Byte1 = mDacVar.Byte1 | %00110000   ' OR in the 4 control bits (15 to 12)
                                                ' 0: Write to DACA
                                                ' 0: Unbuffered
                                                ' 1: 1x Gain
                                                ' 1: Power up
    WREG = 16                           ' 16-bit SPI loop
_OutSPI_Lp:
        Set DAC_SDO                     ' \
        Btfss mDacVar.15                '  Put current outgoing bit on DAC_SDO
        Clear DAC_SDO                   ' /
        Set DAC_SCK                     ' Set DAC_SCK high
        mDacVar = mDacVar << 1          ' Shift next bit into MSB
        Clear DAC_SCK                   ' Pull DAC_SCK low
    Djnz WREG,_OutSPI_Lp                ' Do 16-bits
    Set DAC_CS
    Clear DAC_LAT                       ' Transfer the buffer to the output
    Return
#endif

'-----------------------------------------------------------------------------
' Main program starts here
Main:
'
' Setup the DAC SPI lines
'
     
    High DAC_LAT
    Output DAC_SDO
    Output DAC_SCK
    High DAC_CS                         ' Disable the DAC for now
        Cls
    While 1 = 1                         ' Create an infinite loop
        '
        ' Increase the voltage from the DAC
        '
        For wDacValue = 0 To 4095
            Print At 1,1,"Inc wDacValue: ",Dec wDacValue
            DacOut(wDacValue)
           
            Print At 2,1,"V = ",Dec (5.0*wDacValue)/4096
            'DelayMS 5
        Next
        'DelayMS 10
        '
        ' Decrease the voltage from the DAC
        '
        Cls
        For wDacValue = 4095 To 0 Step -1
            Print At 1,1,"Dec wDacValue: ",Dec wDacValue
            DacOut(wDacValue)
           
            Print At 2,1,"V = ",Dec (5.0*wDacValue)/4096
            'DelayMS 5
        Next
    Wend


Модель работы ЦАП в Proteus:

Видео симуляции работы устройства по программе (видео Моисеева Д.Н.)

Литература:
1. Фирменная документация.

На главную
Admin
Site Admin
 
Posts: 209
Joined: Wed Sep 20, 2017 9:55 am

Return to Промежуточные исследования и разработки

cron

User Menu

Login