ENGLISH 简体中文 日本語 한국어  



   
 
キーワードまたは型番を入力    




アプリケーションノート 3497

MAX5581のPIC制御:PICマイクロコントローラをMAX5581高速セトリングDACにインタフェース接続する方法

要約:このアプリケーションノートでは、MAX5581 DACを用いてPIC®マイクロコントローラを使用する方法について説明します。詳細な回路図とソースコードを提示しています。

MAX5581の概要

MAX5581は、3線式SPI™シリアルインタフェースを搭載した12ビット高速セトリングDACです。MAX5581のインタフェースは、最大3マイクロ秒のセトリング時間で最大20MHzまでのSPIをサポートすることができます。このアプリケーションノートでは、最速ラインのPICマイクロコントローラ(PIC18Fコア)をMAX5581 DACに接続するために必要なアプリケーション回路とすべてのファームウェアを紹介しています。例として挙げたアセンブリプログラムは、MPLAB IDEバージョン6.10.0.0にて無償提供されているアセンブラを使用して、PIC18F442向けに記述したものです。

ハードウェアの概要

ここで取り上げるアプリケーション回路は、MAX5581評価(EV)キットを使用しています。このキットにはMAX5581、超高精度電圧リファレンス(MAX6126)、プッシュボタンスイッチ2個、ゲイン設定抵抗器、および検証されたPCBレイアウトが含まれています。PIC18F442は、MAX5581EVキットボード上にはありませんが、図1に示すアプリケーション回路図を完成するために、システムに追加しています。MAX5581EVキットの/CS\、SCLK、DIN、およびDOUTパッドを利用すれば、SPIシリアルインタフェースに簡単に接続することができます。

図1. MAX5581アプリケーション回路図(1/2)
大きな画像を見る

図1. MAX5581アプリケーション回路図(1/2)

図1. MAX5581アプリケーション回路図(2/2)
図1. MAX5581アプリケーション回路図(2/2)

アナログ/ディジタルグランドプレーン

図2に示すように、アナログとディジタルのグランドプレーンを分離するのが懸命な方法です。TDK MMZ1608B601Cなどのフェライトビーズを使用して、両グランドプレーンを接続します。これによって、マイクロコントローラのシステムクロックとその高調波がアナロググランドに流れ込むことを防止しています。PIC18F442のシステムクロックは40MHzですが、特定のインピーダンス対周波数特性のためにMMZ1608B601Cを選択しています。図3はMMZ1608B601Cのインピーダンス対周波数曲線を示しています。

図2. アナロググランドとディジタルグランドの分離
図2. アナロググランドとディジタルグランドの分離

図3. TDK MMZ1608B601Cフェライトビーズのインピーダンス対周波数曲線
図3. TDK MMZ1608B601Cフェライトビーズのインピーダンス対周波数曲線

ファームウェアの概要

リスト1に示すアセンブリプログラムの例は、PIC18F442の内部MSSP SPI周辺回路を使用してMAX5581を初期化しています。PIC18F442の40MHzシステムクロックによって、MSSPは最大10MHzまでのSPIクロック(SCLK)を供給することができます。表1は、電力供給後に必要な唯一の設定ワードを示しています。一度MAX5581の初期化が行われた後は、表2に示すようにプログラムは絶えずゼロスケールに続いてフルスケールをDAC出力レジスタにロードします。これを絶えずループすることによって、図4に示すような方形波が形成されます。これはMAX5581の高速セトリング時間を実証するものです。

図4. 80kHz方形波の実際のスコープ画面
図4. 80kHz方形波の実際のスコープ画面

リスト1:PIC18F442の内部MSSP SPI周辺回路を使用してMAX5581にインタフェース接続する、アセンブリプログラムの例

ダウンロード:P18F442.INC

Listing 1.asm

;******************************************************************************
; 
; Filename:Listing 1 (Absolute Code Version)
; Date: 2/25/05
; File Version: 1.0
;
; Author: Ted Salazar
; Company: Maxim
; 
;******************************************************************************
;
;Program Description:
;
;This program interfaces the internal SPI MSSP 
;(Peripheral) of the PIC18F442 to the MAX5581 SPI 
;Quad DAC. The program initializes the MAX5581 
;and dynamically generates a 50% duty cycle square
;wave with a frequency of 80KHz. 
;
;
;******************************************************************************
;
; History:
; 2/25/05: Tested SPI DAC format
; 2/25/05: Initialized MAX5591
; 12/14/04: Cleared tcount timer in HWSPI_W_spidata_W
;******************************************************************************
;******************************************************************************
;
;******************************************************************************
; 
; Files required: P18F442.INC 
; 
;******************************************************************************
radix hex ;Default to HEX
LIST P=18F442, F=INHX32;Directive to define processor and file format
#include ;Microchip's Include File
;******************************************************************************
;******************************************************************************
xmit equ06 ; Asynchronous TX is at C6
;
;******************************************************************************
;Configuration bits
; The __CONFIG directive defines configuration data within the .ASM file.
; The labels following the directive are defined in the P18F442.INC file.
; The PIC18FXX2 Data Sheet explains the functions of the configuration bits.
; Change the following lines to suit your application.
;T__CONFIG_CONFIG1H, _OSCS_OFF_1H & _RCIO_OSC_1H
;T__CONFIG_CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_OFF_2L
;T__CONFIG_CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
;T__CONFIG_CONFIG3H, _CCP2MX_ON_3H
;T__CONFIG_CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
;T__CONFIG_CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L 
;T__CONFIG_CONFIG5H, _CPB_ON_5H & _CPD_OFF_5H
;T__CONFIG_CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L 
;T__CONFIG_CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
;T__CONFIG_CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
;T__CONFIG_CONFIG7H, _EBTRB_OFF_7H
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used. 
; More variables may be needed to store other special function registers used
; in the interrupt routines.
CBLOCK0x080
WREG_TEMP;variable used for context saving 
STATUS_TEMP;variable used for context saving
BSR_TEMP;variable used for context saving
;
ENDC
CBLOCK0x000
EXAMPLE;example of a variable in access RAM
;
temp ;
temp2 
;
xmtreg ;
cntrb ;
cntra ;
bitctr ;
tcount;
speedLbyte;T Being used in HWSPI_speed
;
ENDC
;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.
ORG0x0000
gotoMain;go to start of main code
;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.
ORG0x0008
braHighInt;go to high priority interrupt routine
;******************************************************************************
;Low priority interrupt vector and routine
; This code will start executing when a low priority interrupt occurs.
; This code can be removed if low priority interrupts are not used.
ORG0x0018
movffSTATUS,STATUS_TEMP;save STATUS register
movffWREG,WREG_TEMP;save working register
movffBSR,BSR_TEMP;save BSR register
;*** low priority interrupt code goes here ***
movffBSR_TEMP,BSR;restore BSR register
movffWREG_TEMP,WREG;restore working register
movffSTATUS_TEMP,STATUS;restore STATUS register
retfie
;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here to avoid conflicting with
; the low priority interrupt vector.
HighInt:
;*** high priority interrupt code goes here ***
retfieFAST
;******************************************************************************
;Start of main program
; The main program code is placed here.
Main:
;*** main code goes here ***
start 
;*** Port Initialization ***
movlw0x0FF
movwfPORTB
clrfPORTA
movlw0x06 ;T Configure PortA as Digital 
movwf ADCON1
movlw 0x00FB ;T A2 OUTPUT, ALL OTHERS INPUT
movwf TRISA
movlw0x0001 ;T B0 INPUT, ALL OTHERS OUTPUT
movwfTRISB
movlw0x0093 ;T C7-C0 => bit7-0
;T OUTPUTs: C6(TX), C5(MOSI), C3(SCLK), C2(CS) 
;T INPUTs:C4 (MISO) and all others 
movwfTRISC ;T TRISC bit3 Master = 0
bsfPORTC,RC2;T RC2 = CS\ Make CS\ high
; *** SPI Initialization ***
callHWSPI_init ;T Initialize the MSSP for SPI
; *** SPI Configuration ***
movlwb'00000000' ;T load W with test byte for CPOLCPHA 0,0 
;T b'00000000' => CPOLCPHA 0,0
;T b'00000001' => CPOLCPHA 0,1
;T b'00000010' => CPOLCPHA 1,0
;T b'00000011' => CPOLCPHA 1,1
callHWSPI_W_configure
; *** SPI Speed ***
movlwb'00000000' ;T load W with test byte for SPI Freq 
;T b'00000000' => Fosc/4 = 10MHz
;T b'00000001' => Fosc/16 = 2.5Mhz
;T b'00000010' => Fosc/64 = 625kHz
;T b'00000011' => Reserved.
call HWSPI_W_speed
;******************************************************************************
; *** MAX5581 Initialization ***
bcfPORTC,RC2;T RC2 = CS\ Make CS\ Low 
movlw0xEC;T byte0 of settling time config
callHWSPI_W_spidata_W;T HW SPI WriteRead Operation
movlw0x0F;T byte1 of settling time config
callHWSPI_W_spidata_W;T HW SPI WriteRead Operation
bsfPORTC,RC2;T RC2 = CS\ Make CS\ high
; *** MAX5581 Load All DAC Outputs to Zero Scale ***
Loopforever bcfPORTC,RC2;T RC2 = CS\ Make CS\ Low 
movlw0xD0;T byte0 of load all input/output to zeros
callHWSPI_W_spidata_W;T HW SPI WriteRead Operation
movlw0x00;T byte1 of load all input/output to zeros
callHWSPI_W_spidata_W;T HW SPI WriteRead Operation
bsfPORTC,RC2;T RC2 = CS\ Make CS\ high
; *** MAX5581 Load All DAC Outputs to Full Scale ***
bcfPORTC,RC2;T RC2 = CS\ Make CS\ Low 
movlw0xDF;T byte0 of load all input/output to zeros
callHWSPI_W_spidata_W;T HW SPI WriteRead Operation
movlw0xFF;T byte1 of load all input/output to zeros
callHWSPI_W_spidata_W;T HW SPI WriteRead Operation
bsfPORTC,RC2;T RC2 = CS\ Make CS\ high
; movwf xmtreg;T move w to xmtreg
; call asyxmtc;T call UART routine
;
gotoLoopforever ;T loop forever
;******************************************************************************
errsrv 
movlw0x65; load w with 'e' = 0x65
movwfxmtreg ; move w to xmtreg
callasyxmtc; call UART routine
dead goto dead ; goto endless loop
;******************************************************************************
set_cf_error 
movlw 0x00 ; 0x00 into W
sublw 0x00 ; Subtract W-0x00: If W<=N C set; If W>N C clear.
return ; error=> cf=set
;******************************************************************************
clear_cf_ok 
movlw 0x01 ; 0x00 into W
sublw 0x00 ; Subtract W-0x00: If W<=N C set; If W>N C clear.
return ; success=> cf=clear
;******************************************************************************
HWSPI_init;T SPI MSSP Initialization for M2EAM schematic
;T CPOL,CPHA = 0,0 => CKP = 0 & CKE = 1
bcfSSPCON1,SSPEN;T Disable the MSSP, SSPCON-5
; 
bcfTRISC,SDO;T TRISC bit5 RC5/SDO = 0 MOSI Output
bcfTRISC,SCK;T TRISC bit3 RC3/SCK = 0 SCLK Output
bsfTRISC,SDI;T TRISC bit4 RC4/SDI = 1 MISO Input
movlw 0x0040 ;T SSPSTAT bit8 = 0 sampled in middle
;T SSPSTAT bit6 = CKE = 1 
movwf SSPSTAT ;T Used to be sspstat on older PICs
movlw 0x0020;T SSPCON1 bit5 SSPEN = 1 Enables sycn serial port
;T SSPCON1 bit4 = CKP = 0 
;T SSPCON1 bit3= 0 = Turn MSSP ON for SPI
;T SSPCON1 bit2-0 = 000b = SCLK = Fosc/4 
;T SSPCON1 bit2 = 0 = Master
movwf SSPCON1 ;T Used to be sspcon on older PICs
bsfINTCON,PEIE;T INTCON bit6 = PEIE = 1 = Enable periph interrupt
bsfPIE1,SSPIE ;T PIE1 bit3 = SSPIE = 1 = interrupt enable
movlw0x00;T load 0x00 into W
movwftcount;T initialize tcount to zero (0x00)
;******************************************************************************
HWSPI_W_configure
;Configure SPI Mode
;
;On Entry:WREG = confDATA 
;On Exit:
;On Success: return with C flag clear
;On Failure: return with C flag set
;
bcfSSPCON1,SSPEN;T Disable the MSSP, SSPCON1-5
movwftemp ;T move the confDATA byte to temp
btfscSSPCON1,SSPM3 ;T In SPI Mode?, skip if yes
call HWSPI_init;T MSSP is in wrong mode, Init for SPI
;
btfsctemp,1;T Is bit1 of confDATA byte clear? if so skip next
goto CPOL_1;T goto CPOL = 1 label => CPOL = 1
btfsctemp,0;T Is bit0 of confDATA byte clear? if so skip next
;T => CPOL = 0 , CPHA = ?
goto CPOLCPHA_01;T goto => CPOL = 0 CPHA = 1
;Configure for CPOL = 0, CPHA = 0
bcfSSPCON1,CKP;T SSPCON1 bit4 = CKP = 0 
bsfSSPSTAT,CKE;T SSPSTAT bit6 = CKE = 1 
btfsc SSPCON1,CKP;T Is SSPCON1 bit4 = CKP = 0 ? 
gotobadjump;T CKP bit test error
btfssSSPSTAT,CKE;T Is SSPSTAT bit6 = CKE = 1 ?
gotobadjump;T CKE bit test error 
goto okjump2;OK configured!
;
CPOL_1btfsctemp,0;T Is bit0 of confDATA byte clear? if so skip next
;T CPOL = 1 , CPHA = ?
gotoCPOLCPHA_11;T goto => CPOL = 1, CPHA = 1
;Configure for CPOL = 1, CPHA = 0
bsfSSPCON1,CKP;T SSPCON1 bit4 = CKP = 1 
bsfSSPSTAT,CKE;T SSPSTAT bit6 = CKE = 1 
btfss SSPCON1,CKP;T Is SSPCON1 bit4 = CKP = 1 ? 
gotobadjump;T CKP bit test error
btfssSSPSTAT,CKE;T Is SSPSTAT bit6 = CKE = 1 ?
gotobadjump;T CKE bit test error 
goto okjump2;OK configured!
;
CPOLCPHA_01
;configure for CPOL = 0, CPHA = 1
bcfSSPCON1,CKP;T SSPCON1 bit4 = CKP = 0 
bcfSSPSTAT,CKE;T SSPSTAT bit6 = CKE = 0 
btfsc SSPCON1,CKP;T Is SSPCON1 bit4 = CKP = 0 ? 
gotobadjump;T CKP bit test error
btfscSSPSTAT,CKE;T Is SSPSTAT bit6 = CKE = 0 ?
gotobadjump;T CKE bit test error 
goto okjump2;OK configured!
;
CPOLCPHA_11
;configure for CPOL = 1, CPHA = 1
bsfSSPCON1,CKP;T SSPCON1 bit4 = CKP = 1 
bcfSSPSTAT,CKE;T SSPSTAT bit6 = CKE = 0 
btfss SSPCON1,CKP;T Is SSPCON1 bit4 = CKP = 1 ? 
gotobadjump;T CKP bit test error
btfscSSPSTAT,CKE;T Is SSPSTAT bit6 = CKE = 0 ?
gotobadjump;T CKE bit test error 
goto okjump2;OK configured!
;
okjump2bsfSSPCON1,SSPEN;T Re-enable MSSP
gotoclear_cf_ok
return 
badjumpbsfSSPCON1,SSPEN;T Re-enable MSSP
goto set_cf_error;T configuration error
return
;******************************************************************************
HWSPI_W_speed
;On Entry:WREG = speedDATA & checks SSPCON1-3 for SPI mode
; speedDATA = 0x00 => Fosc/4
; speedDATA = 0x01 => Fosc/16
; speedDATA = 0x02 => Fosc/64
; speedDATA = 0x03 => Timer Divisor (Not working yet)
;
;On Exit:
;On Success: return with C flag clear
;On Failure: return with C flag set
;
bcfSSPCON1,SSPEN ;T Disable MSSP
movwf speedLbyte;T move speedDATA stored in W to speedLbyte
btfscSSPCON1,SSPM3 ;T In SPI Mode?, skip if yes
call HWSPI_init;T MSSP is in wrong mode, Init for SPI
;
;Test if speedLbyte = 0x00. If yes, SPI clock speed = Fosc/4
movlw0x00;T load 0x00 into W
subwfspeedLbyte,W;T subtract 0x00 from tcount result in w
btfssSTATUS,Z;T test zero flag, skip next instr if z set
gotofdiv16;T goto Fosc/16 section
bcfSSPCON1,SSPM1;T SSPCON1-1 = 0
bcfSSPCON1,SSPM0;T SSPCON1-0 = 0
goto okjump3;T Fosc/4 was selected
;Test if speedLbyte = 0x01. If yes, SPI clock speed = Fosc/16
fdiv16movlw0x01;T load 0x01 into W
subwfspeedLbyte,W;T subtract 0x01 from tcount result in w
btfssSTATUS,Z;T test zero flag, skip next instr if z set
gotofdiv64;T goto Fosc/64 section
bcfSSPCON1,SSPM1;T SSPCON1-1 = 0
bsfSSPCON1,SSPM0;T SSPCON1-0 = 1
goto okjump3;T Fosc/16 was selected
;Test if speedLbyte = 0x02. If yes, SPI clock speed = Fosc/64
fdiv64movlw0x02;T load 0x02 into W
subwfspeedLbyte,W;T subtract 0x02 from tcount result in w
btfssSTATUS,Z;T test zero flag, skip next instr if z set
gototimer;T goto Timer section
bsfSSPCON1,SSPM1;T SSPCON1-1 = 1
bcfSSPCON1,SSPM0;T SSPCON1-0 = 0
goto okjump3;T Fosc/64 was selected
;Test if speedLbyte >= 0x03. If yes, SPI clock speed will be set by the timer
;SETTING THE SPI CLOCK WITH THE TIMER WILL RETURN A FAILURE AT THIS TIME.
;Future To do: Implement the TIMER section
timermovlw0x03;T load 0x02 into W
subwfspeedLbyte,W;T subtract 0x02 from tcount result in w
btfssSTATUS,Z;T test zero flag, skip next instr if z set
gotobadjmp2;T goto error section to return failure
gotobadjmp2;T goto error section to return failure
;bsfSSPCON1,SSPM1;T SSPCON1-1 = 1
;bsfSSPCON1,SSPM0;T SSPCON1-0 = 1
;goto okjump3;T Fosc/64 was selected
okjump3bsfSSPCON1,SSPEN;T Re-enable MSSP
bcfSTATUS,C;T clear c flag on success
return 
badjmp2bsfSSPCON1,SSPEN;T Re-enable MSSP
bsfSTATUS,C;T set c flag on failure
return
;******************************************************************************
HWSPI_W_spidata_W
;Simultaneously write SPI data on MOSI and read SPI data on MISO
;
;on Entry:WREG = mosiDATA & checks bit3 of SSPCON1 for SPI mode
;On Exit:WREG = misoDATA
;On Success: return with C flag clear
;On Failure: return with C flag set
;
movwf temp2;T move mosiDATA stored in W to WREG_TEMP
btfscSSPCON1,SSPM3 ;T In SPI Mode?, skip if yes
call HWSPI_init;T MSSP is in wrong mode, Init for SPI
movftemp2,W;T load W with original mosiDATA
;
movwfSSPBUF;T move byte to transmit to SSPBUF (transmit buffer)
movlw0x00;T load 0x00 into W
movwftcount;T initialize tcount to zero (0x00)
again1btfscSSPSTAT,BF;T receive completed? if no, skip next
gotookjump1;T no. goto again
incf tcount,F;T increment tcount
movlw0xFF;T load w with literal
subwftcount,W;T subtract 0xFF from tcount result in w
btfssSTATUS,Z;T test zero flag, skip next instr if z set
goto again1 ;T loop until timeout
goto set_cf_error;T receive timeout error
return
okjump1 movf SSPBUF,W;T put received data in W
gotoclear_cf_ok
return 
;******************************************************************************
; UART routine
asyxmtc bcfPORTC,xmit ;T used to be portc,xmit
callfull 
movlw0x08 ;TEST_T "08" 
movwfbitctr 
asyxmt1 rrcf xmtreg,f 
btfsc STATUS,C 
goto asyxmt2 
bcf PORTC,xmit ;T used to be portc,xmit
goto asyxmt3 
asyxmt2 bsf PORTC,xmit ;T used to be portc,xmit
;
asyxmt3 callfull 
decfsz bitctr,f 
goto asyxmt1 
;
bsf PORTC,xmit ;T used to be portc,xmit
callfull 
retlw0 
;******************************************************************************
; UART baud rate of 115.2kbps using a 40MHz System Clock 
full movlwd'3' 
movwfcntrb
vdly0 movlwd'6' ; d'43' with 4MHz => 2400 baud 
movwfcntra
vdly1 decfsz cntra,f 
goto vdly1 
decfsz cntrb,f 
goto vdly0 
retlw0 
;******************************************************************************
;End of program
END

表1:4つのすべてのDACのセトリング時間を3µsに設定する設定書き込みコマンド
SPI Line C7 C6 C5 C4 C3 C2 C1 C0 D7 D6 D5 D4 D3 D2 D1 D0
DIN 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 1

表2:すべてのDAC出力をロードするコマンド
SPI Line C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
DIN (1st) 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
DIN (2nd) 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1

表2では、最初のコマンドですべてのDAC出力をゼロスケールに設定し、2つ目のコマンドですべてのDAC出力をフルスケールに設定します。


関連製品  APP 3497: Sep 15, 2005
MAX5581 バッファ付き、高速セトリング、クワッド、12/10/8ビット、電圧出力DAC フルデータシート
(PDF, 880kB)
無料
サンプル
MAX5582 バッファ付き、高速セトリング、クワッド、12/10/8ビット、電圧出力DAC フルデータシート
(PDF, 880kB)
無料
サンプル
MAX5583 バッファ付き、高速セトリング、クワッド、12/10/8ビット、電圧出力DAC フルデータシート
(PDF, 880kB)
無料
サンプル
MAX5584 バッファ付き、高速セトリング、クワッド、12/10/8ビット、電圧出力DAC フルデータシート
(PDF, 880kB)
無料
サンプル
MAX5585 バッファ付き、高速セトリング、クワッド、12/10/8ビット、電圧出力DAC フルデータシート
(PDF, 880kB)
無料
サンプル

自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。


We Want Your Feedback!



フィードバックをお寄せください。
内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。—マキシムはお客様からいただく訂正、提案を元に改善していきます。 このページを評価し、フィードバックを送信する。

 

ダウンロード、PDFフォーマットダウンロード、PDFフォーマット(84kB)
 AN3497, AN 3497, APP3497, Appnote3497, Appnote 3497

        •         •         •     プライバシーポリシー     •     法的お知らせ

    Copyright © 2009 by Maxim Integrated Products