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

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


Структурная схема и внешний вид чипа
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).
Области применения:
Калибраторы датчиков, генераторы уровня сдвига, цифровые делители/умножители напряжения, портативные инструменты с батарейным питанием, контроль в петле обратной связи управления двигателями.
Расположение выводов (Цоколевка):

Выводы MCP4921
Функциональное назначение выводов:
Управляющий регистр MCP4921:

Структура регистра и управляющие команды
Диаграмма записи команд:

Взаимодействие с микроконтроллером
Схемы включения MCP4921:

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

Схема включения 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. Фирменная документация.
На главную