一、DAC1220模塊簡(jiǎn)介
DAC1220是一款在一定溫度范圍內(nèi),能實(shí)現(xiàn)20位或16位線性轉(zhuǎn)換的低功耗串行數(shù)模轉(zhuǎn)換器。原理上利用Σ-△技術(shù)實(shí)現(xiàn)其線性特性,可軟件配置為16位輸入模式和20位輸入模式。20位輸入時(shí),建立時(shí)間可在15ms內(nèi)達(dá)到0.003%;16位輸入時(shí),建立時(shí)間最大可在2ms內(nèi)達(dá)到0.012%。輸出電壓最大為外部參考電壓的2倍, 片上自校準(zhǔn)電路可動(dòng)態(tài)減少失調(diào)和增益誤差,最大輸出線性誤差僅為±0.0015%。DAC1220采用同步串行接口,單一轉(zhuǎn)換系統(tǒng)只需2根信號(hào)線控制即可,多轉(zhuǎn)換系統(tǒng)需要片選信號(hào)配合。采用單電源供電(+5V,cM0s結(jié)構(gòu)保證其低功耗特性,具有低噪聲線性誤差小、溫漂小等特點(diǎn)。DAC1220可用于工業(yè)控制或高精度檢測(cè)、測(cè)量系統(tǒng)。
特性
- 供電電壓:5V
- 通訊協(xié)議:SPI串行
- DAC分辨率位數(shù):20位 / 16位,軟件切換
- 輸出通道數(shù):1個(gè)
- 輸出電壓范圍:±10V
- 輸出電壓驅(qū)動(dòng)能力:10mA
- 基準(zhǔn)電壓:2.5V
- 電壓建立時(shí)間:16位:2ms,20位:15ms
應(yīng)用場(chǎng)景
- 可編程電壓源,儀表和控制系統(tǒng),傳感器激勵(lì),運(yùn)動(dòng)過程控制

二、DAC1220模塊接口說明

| V+ | 輸入正 |
|---|---|
| GND | 輸入負(fù) |
| SCLK | 串行時(shí)鐘輸入 |
| SDIO | 串行數(shù)據(jù)輸入/輸出 |
| CS | 片選 |
三、功能框圖和時(shí)序圖分析說明
功能框圖
時(shí)序圖
DAC1220 的 SPI 不是標(biāo)準(zhǔn) SPI,它是 SDIO 半雙工 3 線接口,SDIO 既當(dāng) MOSI(輸入) 又當(dāng) MISO(輸出)。
Figure 9:CS 始終拉低時(shí)的寫入/讀取時(shí)序(不使用 CS)
寫寄存器數(shù)據(jù):SDIO = 輸入模式,每個(gè)字節(jié)按 bit7→bit0 依次從 SDIO 寫入,在 SCLK 上升沿采樣。
讀寄存器數(shù)據(jù):SDIO 在讀階段變成輸出,SDIO 輸出 OUTM(MSB)、OUT1...OUT0,MCU 在 SCLK 上升沿讀取。
Figure 10:使用 CS 的時(shí)序
CS 拉低開始通信,SCLK 工作期間保持 CS 低,CS 拉高結(jié)束通信,這個(gè)版本更像“普通 SPI”,更好實(shí)現(xiàn)。
Figure 11:SDIO 從輸入到輸出切換時(shí)序
MCU 必須在切換期間把 SDIO 設(shè)置為:寫階段:SDIO = 輸出,讀階段:SDIO = 輸入,否則會(huì)導(dǎo)致總線沖突 → 芯片損壞風(fēng)險(xiǎn)。
四、主要寄存器說明
DAC1220 中有四個(gè)寄存器,命令寄存器(CMR)、數(shù)據(jù)輸入寄存器(DIR)、偏移校準(zhǔn)寄存器(OCR)、滿量程校準(zhǔn)寄存器(FCR)。每個(gè)讀/寫命令由 1 字節(jié)命令 + N 字節(jié)數(shù)據(jù) 組成。
命令字節(jié)格式:R/W (bit7), MB(bits6–5: 表示要讀/寫 1/2/3 字節(jié)), ADR(bits3–0: 起始寄存器地址)。也就是說可以讀/寫寄存器映射中的連續(xù)字節(jié)(如寫 DIR 的 3 個(gè)字節(jié)或讀 OCR 的 3 字節(jié)),下圖為命令字格式和起始寄存器地址。

命令寄存器(CMR):用于配置工作模式,分辨率選擇,濾波等參數(shù)。寫入后在最后一個(gè) SCLK 的下降沿生效。

數(shù)據(jù)輸入寄存器(DIR):決定正常模式下的輸出電壓。在睡眠模式下,寫入此寄存器不會(huì)影響輸出,但其值會(huì)被存儲(chǔ)。進(jìn)入正常模式后,DIR中的值立即生效。復(fù)位后,DIR的值將為零。
偏移校準(zhǔn)寄存器(OCR)和滿量程校準(zhǔn)寄存器(FCR):
偏移校準(zhǔn)寄存器包含一個(gè) 24 位二進(jìn)制補(bǔ)碼值。在 DAC 轉(zhuǎn)換之前,該值會(huì)加到 DIR 寄存器中的值上。在睡眠模式下,寫入此寄存器不會(huì)影響輸出,但該值會(huì)被存儲(chǔ)。進(jìn)入正常模式后,OCR 中的值立即生效。復(fù)位后,OCR 的值為零。
滿量程校準(zhǔn)寄存器存儲(chǔ)增益校準(zhǔn)常數(shù)。在 DAC 轉(zhuǎn)換之前,DIR 寄存器的內(nèi)容會(huì)乘以該值進(jìn)行調(diào)整。在睡眠模式下,寫入此寄存器不會(huì)影響輸出,但該值會(huì)被存儲(chǔ)。進(jìn)入正常模式后,F(xiàn)CR 中的值立即生效。
五、STM32F103驅(qū)動(dòng)DAC1220數(shù)模轉(zhuǎn)換
準(zhǔn)備工作
STM32F103C8T6開發(fā)板,DAC1220數(shù)模轉(zhuǎn)換模塊,OLED屏幕。
接線說明
| STM32F103C8T6 | DAC1220 |
|---|---|
| 5V | V+ |
| GND | GND |
| PA0 | SCLK |
| PA1 | SDIO |
| PA2 | CS |
| PB8 | OLED->SCL |
| PB9 | OLED->SDA |
代碼示例
dac1220.c
#include "DAC1220.h"
u32 TriangleWave_Value[256]={
0 ,8192 , 16384 , 24576 , 32768 , 40960 , 49152 , 57344 , 65536 , 73728 , 81920 , 90112 , 98304 , 106496 ,
114688 , 122880 , 131072 , 139264 , 147456 , 155648 , 163840 , 172032 , 180224 , 188416 , 196608 , 204800 ,
212992 , 221184 , 229376 , 237568 , 245760 , 253952 , 262144 , 270336 , 278528 , 286720 , 294912 , 303104 ,
311296 , 319488 , 327680 , 335872 , 344064 , 352256 , 360448 , 368640 , 376832 , 385024 , 393216 , 401408 ,
409600 , 417792 , 425984 , 434176 , 442368 , 450560 , 458752 , 466944 , 475136 , 483328 , 491520 , 499712 ,
507904 , 516096 , 524288 , 532480 , 540672 , 548864 , 557056 , 565248 , 573440 , 581632 , 589824 , 598016 ,
606208 , 614400 , 622592 , 630784 , 638976 , 647168 , 655360 , 663552 , 671744 , 679936 , 688128 , 696320 ,
704512 , 712704 , 720896 , 729088 , 737280 , 745472 , 753664 , 761856 , 770048 , 778240 , 786432 , 794624 ,
802816 , 811008 , 819200 , 827392 , 835584 , 843776 , 851968 , 860160 , 868352 , 876544 , 884736 , 892928 ,
901120 , 909312 , 917504 , 925696 , 933888 , 942080 , 950272 , 958464 , 966656 , 974848 , 983040 , 991232 ,
999424 , 1007616 , 1015808 , 1024000 , 1032192 , 1040384 , 1048576 ,1040384 , 1032192 , 1024000 , 1015808 , 1007616 ,
999424 , 991232 , 983040 , 974848 , 966656 , 958464 , 950272 , 942080 , 933888 , 925696 , 917504 , 909312 , 901120 , 892928 ,
884736 , 876544 , 868352 , 860160 , 851968 , 843776 , 835584 , 827392 , 819200 , 811008 , 802816 , 794624 , 786432 , 778240 ,
770048 , 761856 , 753664 , 745472 , 737280 , 729088 , 720896 , 712704 , 704512 , 696320 , 688128 , 679936 , 671744 , 663552 ,
655360 , 647168 , 638976 , 630784 , 622592 , 614400 , 606208 , 598016 , 589824 , 581632 , 573440 , 565248 , 557056 , 548864 ,
540672 , 532480 , 524288 , 516096 , 507904 , 499712 , 491520 , 483328 , 475136 , 466944 , 458752 , 450560 , 442368 , 434176 ,
425984 , 417792 , 409600 , 401408 , 393216 , 385024 , 376832 , 368640 , 360448 , 352256 , 344064 , 335872 , 327680 , 319488 ,
311296 , 303104 , 294912 , 286720 , 278528 , 270336 , 262144 , 253952 , 245760 , 237568 , 229376 , 221184 , 212992 , 204800 ,
196608 , 188416 , 180224 , 172032 , 163840 , 155648 , 147456 , 139264 , 131072 , 122880 , 114688 , 106496 , 98304 , 90112 ,
81920 , 73728 , 65536 , 57344 , 49152 , 40960 , 32768 , 24576 , 16384 , 8192
};
void DAC1220_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( DAC_SCL_CLK|DAC_SDA_CLK|DAC_CS_CLK|RCC_APB2Periph_AFIO, ENABLE );
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = DAC_SCL_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DAC_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DAC_SDA_PIN;
GPIO_Init(DAC_SDA_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DAC_CS_PIN;
GPIO_Init(DAC_CS_PORT, &GPIO_InitStructure);
DAC_CS = 0;
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DAC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DAC_SDA_PORT, &GPIO_InitStructure);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DAC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DAC_SDA_PORT, &GPIO_InitStructure);
}
void DAC1220_Write_Byte(uint8_t out_data)
{
uint8_t index;
SDA_OUT();
DAC_SCLK=0;
DAC_SDIO=0;
for(index=0;index< 8;index++)
{
delay_us(5);
DAC_SCLK=1;
if((out_data&0x80)==0x80)
{
DAC_SDIO=1;
}
else
{
DAC_SDIO=0;
}
out_data=out_data< 1; //數(shù)據(jù)移位
delay_us(5);
DAC_SCLK=0; //鎖存數(shù)據(jù)
}
}
uint8_t DAC1220_Read_Byte(void)
{
uint8_t data=0,index=0;
SDA_IN();
DAC_SCLK=0;
for(index=0;index< 8;index++)
{
delay_us(5);
DAC_SCLK=1;
data< <=1;
if(R_DAC_SDIO)
data++;
delay_us(5);
DAC_SCLK=0; //鎖存數(shù)據(jù)
}
delay_us(5);
return data;
}
/*復(fù)位DA*/
void DAC1220_Reset(void)
{
DAC_SCLK = 0;
delay_us(10);
//****//
//SCLK復(fù)位模式
//DAC1220沒有專用的復(fù)位引腳。
//相反,它包含一個(gè)等待特殊模式出現(xiàn)在SCLK上的電路,并在檢測(cè)到特殊模式時(shí)觸發(fā)內(nèi)部硬件復(fù)位線。
//此模式稱為SCLK重置模式。
//這種模式與SCLK上通常出現(xiàn)的時(shí)鐘模式有很大的不同,在正常工作時(shí)不太可能被意外檢測(cè)到。CS低有效
//詳見DAC1220.PDF:頁11:Table 5. Reset Timing Characteristics
DAC_SCLK = 1;
delay_us(600*TXIN);
DAC_SCLK = 0;
delay_us(20*TXIN);
DAC_SCLK = 1;
delay_us(1100*TXIN);
DAC_SCLK = 0;
delay_us(20*TXIN);
DAC_SCLK = 1;
delay_us(2100*TXIN);
DAC_SCLK = 0;
//****//
delay_us(10);
}
void DAC1220_Init(void)
{
uint8_t command; //緩存命令字節(jié)
DAC1220_IO_Init();
DAC1220_Reset();
DAC1220_Self_Calibration();//自校準(zhǔn)
command=0x04;
DAC1220_Write_Byte(command);
delay_us(10);
DAC1220_Write_Byte(0x00);
delay_us(10);
command=0x05;
DAC1220_Write_Byte(command);
delay_us(10);
DAC1220_Write_Byte(0xA0); //配置成正常20位模式,(直接二進(jìn)制)Straight binary
delay_us(10);
}
void DAC1220_WDAT(uint32_t dat)
{
uint8_t command;
if(dat > 1048575)
dat = 1048575;
dat = dat< 4;
delay_us(10);
command=0x00; //DIR高字節(jié)
DAC1220_Write_Byte(command);
delay_us(10);
command=(dat >>16)&0X00FF; //寫DIR高位數(shù)據(jù)
DAC1220_Write_Byte(command);
delay_us(10);
command=0x01; //寫中位數(shù)據(jù)
DAC1220_Write_Byte(command);
delay_us(10);
command=(dat >>8)&0X00FF;
DAC1220_Write_Byte(command);
delay_us(10);
command=0x02; //寫低位數(shù)據(jù)
DAC1220_Write_Byte(command);
delay_us(10);
command=(dat >>0)&0X00FF;
DAC1220_Write_Byte(command);
delay_us(10);
}
void DAC1220_Self_Calibration(void) //自校準(zhǔn)
{
DAC1220_Write_Byte(0x04);//寫命令 寄存器高字節(jié)
delay_us(10);
DAC1220_Write_Byte(0x00);//校準(zhǔn)期間輸出將斷開
delay_us(10);
DAC1220_Write_Byte(0x05);//寫命令 寄存器低字節(jié)
delay_us(10);
DAC1220_Write_Byte(0xA1); //配置成20位模式,(直接二進(jìn)制)Straight binary 校準(zhǔn)模式
delay_ms(600); //等待校準(zhǔn)
DAC1220_Write_Byte(0x85);//讀命令 寄存器低字節(jié)
delay_us(10);
while((DAC1220_Read_Byte()&0x03)!=0) //檢測(cè)校準(zhǔn)是否完成
{
delay_ms(500);
}
}
void DAC1220VolWrite(float v)
{
uint32_t dacData;
dacData=mapfloat(v,-10.0,10.0,0,1048575);
DAC1220_WDAT(dacData);
}
/*
************************************************************
* 函數(shù)名稱: mapfloat
*
* 函數(shù)功能: 將一個(gè)區(qū)間內(nèi)的值,映射到另一個(gè)區(qū)間
*
* 入口參數(shù): x輸入值、
* in_min輸入最小值,
* in_max輸入最大值,
* out_min輸出最小值,
* out_max輸出最大值。
* 返回參數(shù): 映射后的值
* 說明:
************************************************************/
uint32_t mapfloat(float x, float in_min, float in_max, uint32_t out_min, uint32_t out_max)
{
uint32_t out;
out=(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
return out;
}
main.c
#include "stm32_config.h"
#include "stdio.h"
#include "DAC1220.h"
#include "timer.h"
#include "oled.h"
#include "key.h"
uint8_t Num;
int32_t Vol = 1000;
uint16_t dacValue = 0;
int main(void)
{
MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2); //設(shè)置中斷分組
delay_init(72); //初始化延時(shí)函數(shù)
OLED_Init();
Key_Init();
Timer_Init();
DAC1220_Init();
delay_ms(100);
OLED_ShowString(1,5,"DAC1220");
while(1)
{
//電壓輸出
Vol += Key_GetNum();
OLED_ShowSignedNum(2,1,Vol,5);
DAC1220VolWrite((float)Vol/1000);
//三角波輸出
// DAC1220_WDAT(TriangleWave_Value[dacValue]);
// dacValue++;
// if(dacValue >= 256) dacValue = 0;
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
Num++;
if(Num > 20)
{
Key_Loop();
Num = 0;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
效果展示


六、注意事項(xiàng)與常見問題
注意事項(xiàng):
- 模塊供電電源不超過5.5V。
- 由于模塊是高精度器件,為了避免不必要的干擾,建議 使用線性電源供電。
- 輸出信號(hào)線建議使用SMA對(duì)應(yīng)接口。接口不匹配容易導(dǎo)致接觸不良,劣質(zhì)的線材可能導(dǎo)致信號(hào)衰減或者噪聲過大。
- 如需簡(jiǎn)單測(cè)試模塊功能,建議搭配本店控制板使用,正確接線后給控制板供電即可實(shí)現(xiàn)模擬電壓輸出。
常見問題:
Q: 模塊輸出電壓是多少?輸出電壓的驅(qū)動(dòng)能力是多少?
A: 目前模塊的電路能輸出±10V,驅(qū)動(dòng)能力10mA以內(nèi)。
Q: 用電壓表測(cè)試電壓正常,接上負(fù)載后電壓降低是什么情況?
A: 由于模塊只有10mA的驅(qū)動(dòng)能力,當(dāng)負(fù)載功率大時(shí),輸出電壓就會(huì)被拉低。
-
dac
+關(guān)注
關(guān)注
44文章
2818瀏覽量
197533 -
數(shù)模轉(zhuǎn)換器
+關(guān)注
關(guān)注
14文章
1481瀏覽量
85930 -
STM32F103
+關(guān)注
關(guān)注
34文章
497瀏覽量
68128
發(fā)布評(píng)論請(qǐng)先 登錄
DAC1220受干擾損壞怎么解決?
為什么STM32F103 DA設(shè)置輸出三角波輸出沒反應(yīng)?
基于AT32F403的DAC基礎(chǔ)配置(STM32F103類似)
如何用STM32F103的DAC輸出一個(gè)周期2khz的正弦波呢
DAC數(shù)模轉(zhuǎn)換器的主要特點(diǎn)有哪些
DAC1020和DAC1220數(shù)模轉(zhuǎn)換器為電路提供優(yōu)良的溫度和跟蹤特性的概述
LTC2704 - 16 位、4 路 VOUT DAC 具 ±10V 的軟件可編程輸出范圍
DAC(數(shù)模轉(zhuǎn)換模塊)-STM32F103
基于STM32F103的DAC8411驅(qū)動(dòng)程序
DAC1220一款20位數(shù)模(D/A)轉(zhuǎn)換器數(shù)據(jù)表
DAC80516 十六通道 16 位電壓輸出數(shù)模轉(zhuǎn)換器(DAC)產(chǎn)品文檔總結(jié)
深入解析DAC1220:20位低功耗數(shù)模轉(zhuǎn)換器的卓越性能與應(yīng)用
基于STM32F103驅(qū)動(dòng)DAC1220 20位/16位DAC數(shù)模轉(zhuǎn)換模塊輸出可調(diào)±10V基準(zhǔn)和三角波信號(hào)
評(píng)論