国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32F103驅動DAC1220 20位/16位DAC數模轉換模塊輸出可調±10V基準和三角波信號

jf_88434166 ? 來源:jf_88434166 ? 2026-01-10 10:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、DAC1220模塊簡介

DAC1220是一款在一定溫度范圍內,能實現20位或16位線性轉換的低功耗串行數模轉換器。原理上利用Σ-△技術實現其線性特性,可軟件配置為16位輸入模式和20位輸入模式。20位輸入時,建立時間可在15ms內達到0.003%;16位輸入時,建立時間最大可在2ms內達到0.012%。輸出電壓最大為外部參考電壓的2倍, 片上自校準電路可動態減少失調和增益誤差,最大輸出線性誤差僅為±0.0015%。DAC1220采用同步串行接口,單一轉換系統只需2根信號線控制即可,多轉換系統需要片選信號配合。采用單電源供電(+5V,cM0s結構保證其低功耗特性,具有低噪聲線性誤差小、溫漂小等特點。DAC1220可用于工業控制高精度檢測、測量系統。
特性

  • 供電電壓:5V
  • 通訊協議:SPI串行
  • DAC分辨率位數:20位 / 16位,軟件切換
  • 輸出通道數:1個
  • 輸出電壓范圍:±10V
  • 輸出電壓驅動能力:10mA
  • 基準電壓:2.5V
  • 電壓建立時間:16位:2ms,20位:15ms

應用場景

二、DAC1220模塊接口說明

V+輸入正
GND輸入負
SCLK串行時鐘輸入
SDIO串行數據輸入/輸出
CS片選

三、功能框圖和時序圖分析說明

功能框圖

時序圖

DAC1220 的 SPI 不是標準 SPI,它是 SDIO 半雙工 3 線接口,SDIO 既當 MOSI(輸入) 又當 MISO(輸出)。

Figure 9:CS 始終拉低時的寫入/讀取時序(不使用 CS)
寄存器數據:SDIO = 輸入模式,每個字節按 bit7→bit0 依次從 SDIO 寫入,在 SCLK 上升沿采樣。
讀寄存器數據:SDIO 在讀階段變成輸出,SDIO 輸出 OUTM(MSB)、OUT1...OUT0,MCU 在 SCLK 上升沿讀取。

Figure 10:使用 CS 的時序
CS 拉低開始通信,SCLK 工作期間保持 CS 低,CS 拉高結束通信,這個版本更像“普通 SPI”,更好實現。

Figure 11:SDIO 從輸入到輸出切換時序
MCU 必須在切換期間把 SDIO 設置為:寫階段:SDIO = 輸出,讀階段:SDIO = 輸入,否則會導致總線沖突 → 芯片損壞風險。

四、主要寄存器說明

DAC1220 中有四個寄存器,命令寄存器(CMR)、數據輸入寄存器(DIR)、偏移校準寄存器(OCR)、滿量程校準寄存器(FCR)。每個讀/寫命令由 1 字節命令 + N 字節數據 組成。
命令字節格式:R/W (bit7), MB(bits6–5: 表示要讀/寫 1/2/3 字節), ADR(bits3–0: 起始寄存器地址)。也就是說可以讀/寫寄存器映射中的連續字節(如寫 DIR 的 3 個字節或讀 OCR 的 3 字節),下圖為命令字格式和起始寄存器地址。


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


數據輸入寄存器(DIR):決定正常模式下的輸出電壓。在睡眠模式下,寫入此寄存器不會影響輸出,但其值會被存儲。進入正常模式后,DIR中的值立即生效。復位后,DIR的值將為零。

偏移校準寄存器(OCR)和滿量程校準寄存器(FCR):
偏移校準寄存器包含一個 24 位二進制補碼值。在 DAC 轉換之前,該值會加到 DIR 寄存器中的值上。在睡眠模式下,寫入此寄存器不會影響輸出,但該值會被存儲。進入正常模式后,OCR 中的值立即生效。復位后,OCR 的值為零。
滿量程校準寄存器存儲增益校準常數。在 DAC 轉換之前,DIR 寄存器的內容會乘以該值進行調整。在睡眠模式下,寫入此寄存器不會影響輸出,但該值會被存儲。進入正常模式后,FCR 中的值立即生效。

五、STM32F103驅動DAC1220數模轉換

準備工作

STM32F103C8T6開發板,DAC1220數模轉換模塊,OLED屏幕。

接線說明

STM32F103C8T6DAC1220
5VV+
GNDGND
PA0SCLK
PA1SDIO
PA2CS
PB8OLED->SCL
PB9OLED->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;		//數據移位
		delay_us(5);
		DAC_SCLK=0;		//鎖存數據
	}
}
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;		//鎖存數據
	}
	delay_us(5);
	return data;
}


/*復位DA*/
void DAC1220_Reset(void)
{
	DAC_SCLK = 0;
	delay_us(10);
	
//****//
//SCLK復位模式
//DAC1220沒有專用的復位引腳。
//相反,它包含一個等待特殊模式出現在SCLK上的電路,并在檢測到特殊模式時觸發內部硬件復位線。
//此模式稱為SCLK重置模式。
//這種模式與SCLK上通常出現的時鐘模式有很大的不同,在正常工作時不太可能被意外檢測到。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;			//緩存命令字節
	DAC1220_IO_Init();
	DAC1220_Reset();
	DAC1220_Self_Calibration();//自校準
	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位模式,(直接二進制)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高字節
	DAC1220_Write_Byte(command);
	delay_us(10);
	command=(dat >>16)&0X00FF;			//寫DIR高位數據
	DAC1220_Write_Byte(command);
	delay_us(10);

	command=0x01;		//寫中位數據
	DAC1220_Write_Byte(command);
	delay_us(10);
	command=(dat >>8)&0X00FF;
	DAC1220_Write_Byte(command);
	delay_us(10);

	command=0x02;		//寫低位數據
	DAC1220_Write_Byte(command);
	delay_us(10);
	command=(dat >>0)&0X00FF;
	DAC1220_Write_Byte(command);
	delay_us(10);

}

void DAC1220_Self_Calibration(void) //自校準
{
	DAC1220_Write_Byte(0x04);//寫命令 寄存器高字節
	delay_us(10);
	DAC1220_Write_Byte(0x00);//校準期間輸出將斷開
	delay_us(10);
	DAC1220_Write_Byte(0x05);//寫命令 寄存器低字節
	delay_us(10);
	DAC1220_Write_Byte(0xA1);	//配置成20位模式,(直接二進制)Straight binary  校準模式
	delay_ms(600); //等待校準
	
	DAC1220_Write_Byte(0x85);//讀命令 寄存器低字節
	delay_us(10);
	while((DAC1220_Read_Byte()&0x03)!=0) //檢測校準是否完成
	{
		delay_ms(500);
	}
	
}
void DAC1220VolWrite(float v)
{
	uint32_t dacData;
	dacData=mapfloat(v,-10.0,10.0,0,1048575);
	DAC1220_WDAT(dacData);
}


/*
************************************************************
*	函數名稱:	mapfloat
*
*	函數功能:	將一個區間內的值,映射到另一個區間
*
*	入口參數:	x輸入值、
*						in_min輸入最小值,
*						in_max輸入最大值,
*						out_min輸出最小值,
*						out_max輸出最大值。
*	返回參數:	映射后的值
*	說明:	
************************************************************/
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);	//設置中斷分組
	delay_init(72);	//初始化延時函數
	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);
	}
}

效果展示


六、注意事項與常見問題

注意事項:

  1. 模塊供電電源不超過5.5V。
  2. 由于模塊是高精度器件,為了避免不必要的干擾,建議 使用線性電源供電。
  3. 輸出信號線建議使用SMA對應接口。接口不匹配容易導致接觸不良,劣質的線材可能導致信號衰減或者噪聲過大。
  4. 如需簡單測試模塊功能,建議搭配本店控制板使用,正確接線后給控制板供電即可實現模擬電壓輸出。

常見問題:

Q: 模塊輸出電壓是多少?輸出電壓的驅動能力是多少?
A: 目前模塊的電路能輸出±10V,驅動能力10mA以內。

Q: 用電壓表測試電壓正常,接上負載后電壓降低是什么情況?
A: 由于模塊只有10mA的驅動能力,當負載功率大時,輸出電壓就會被拉低。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • dac
    dac
    +關注

    關注

    44

    文章

    2713

    瀏覽量

    197065
  • 數模轉換器
    +關注

    關注

    14

    文章

    1296

    瀏覽量

    85733
  • STM32F103
    +關注

    關注

    34

    文章

    495

    瀏覽量

    67686
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    DAC1220受干擾損壞怎么解決?

    使用DAC1220作為基準源,在我公司一臺高壓脈沖電源上工作,50kV電壓通過閘流管放電產生4us的電壓和電流脈沖,因此地線存在較大干擾。整個DAC輸出電平上都會疊加一個高頻振蕩,在
    發表于 01-14 07:18

    為什么STM32F103 DA設置輸出三角輸出沒反應?

    STM32F103 DA設置輸出三角輸出沒反應不知道哪里設置錯了。
    發表于 08-09 00:10

    基于AT32F403的DAC基礎配置(STM32F103類似)

    基于AT32F403的DAC基礎配置(STM32F103類似):AT32的DAC有兩個獨立通道,每個通道可以分別產生穩定電平,三角
    發表于 12-14 19:40

    如何用STM32F103DAC輸出一個周期2khz的正弦

    什么是DAC數模轉換器?DAC數模轉換器是由哪些部分組成的?如何用STM32F103DAC
    發表于 11-15 06:27

    16電壓輸出數模轉換DAC7644

    16電壓輸出數模轉換DAC7644
    發表于 04-30 17:28 ?39次下載

    DAC1020和DAC1220數模轉換器為電路提供優良的溫度和跟蹤特性的概述

    DAC1020和DAC1220分別是10和12二進制乘法數模轉換器。沉積薄膜R2R電阻梯形劃
    發表于 05-16 16:29 ?11次下載
    <b class='flag-5'>DAC</b>1020和<b class='flag-5'>DAC1220</b><b class='flag-5'>數模轉換</b>器為電路提供優良的溫度和跟蹤特性的概述

    STM32_ DAC輸出三角波形

    STM32_DAC輸出三角波形
    的頭像 發表于 04-08 10:56 ?9557次閱讀
    <b class='flag-5'>STM32</b>_ <b class='flag-5'>DAC</b><b class='flag-5'>輸出</b><b class='flag-5'>三角</b>波形

    LTC2704 - 16 、4 路 VOUT DAC 具 ±10V 的軟件可編程輸出范圍

    LTC2704 - 16 、4 路 VOUT DAC 具 ±10V 的軟件可編程輸出范圍
    發表于 03-21 08:37 ?11次下載
    LTC2704 - <b class='flag-5'>16</b> <b class='flag-5'>位</b>、4 路 VOUT <b class='flag-5'>DAC</b> 具 ±<b class='flag-5'>10V</b> 的軟件可編程<b class='flag-5'>輸出</b>范圍

    基于STM32f103使用的DAC正弦

    基于STM32f103使用的DAC正弦
    發表于 08-02 10:05 ?118次下載

    DAC數模轉換模塊)-STM32F103

    注意本文章內容只適用于大容量的STM32F101xx和STM32F103xx產品。DAC 簡介(數模轉換)數字/模擬
    發表于 11-16 15:36 ?49次下載
    <b class='flag-5'>DAC</b>(<b class='flag-5'>數模</b><b class='flag-5'>轉換</b><b class='flag-5'>模塊</b>)-<b class='flag-5'>STM32F103</b>

    基于STM32F103DAC8411驅動程序

    基于STM32F103DAC8411驅動程序,親測可用,歡迎大家一起交流
    發表于 08-28 11:21 ?25次下載

    DAC1220一款20位數模(D/A)轉換器數據表

    電子發燒友網站提供《DAC1220一款20位數模(D/A)轉換器數據表.pdf》資料免費下載
    發表于 07-26 09:11 ?2次下載
    <b class='flag-5'>DAC1220</b>一款<b class='flag-5'>20</b><b class='flag-5'>位數模</b>(D/A)<b class='flag-5'>轉換</b>器數據表

    DAC80516 十六通道 16 電壓輸出數模轉換器(DAC)產品文檔總結

    16DAC80516是一款低功耗、16通道、緩沖電壓輸出數模轉換器(
    的頭像 發表于 10-23 15:58 ?786次閱讀
    <b class='flag-5'>DAC</b>80516 十六通道 <b class='flag-5'>16</b> <b class='flag-5'>位</b>電壓<b class='flag-5'>輸出</b><b class='flag-5'>數模轉換</b>器(<b class='flag-5'>DAC</b>)產品文檔總結

    DAC3154 雙通道、10、500MSPS數模轉換器(DAC)技術手冊

    DAC3154/DAC3164是雙通道 10/12 、引腳兼容系列,頻率為 500 MSPS 數模轉換器 (
    的頭像 發表于 11-14 13:49 ?741次閱讀
    <b class='flag-5'>DAC</b>3154 雙通道、<b class='flag-5'>10</b><b class='flag-5'>位</b>、500MSPS<b class='flag-5'>數模轉換</b>器(<b class='flag-5'>DAC</b>)技術手冊

    深入解析DAC122020低功耗數模轉換器的卓越性能與應用

    ? 在電子工程師的設計世界里,數模轉換器(DAC)是連接數字世界和模擬世界的重要橋梁。今天,我們要深入探討一款性能卓越的20低功耗數模轉換
    的頭像 發表于 12-09 14:34 ?748次閱讀
    深入解析<b class='flag-5'>DAC1220</b>:<b class='flag-5'>20</b><b class='flag-5'>位</b>低功耗<b class='flag-5'>數模轉換</b>器的卓越性能與應用