八、DAC芯片的简介和使用

八、DAC芯片的简介和使用 一、DAC常见指标参数(1)参数名输出电压范围假如一个DAC为8位最大输出电压为5V。输入数字量255 电压5V输入数字量128 电压2.5V输入数字量64 电压1.25V。假如将输出的模拟电压值用英文U表示输入的数字值用code表示。U与code的关系表示为codeU*2^8/5。转换速率数字值转换为模拟值的速度常用单位KSPS/MSPS即kilo/Milion Samples per Second表示每秒采样千/百万次。分辨率由DAC芯片的数据位宽决定数据位宽越大分辨率越高对应的输出电压值也就越精确。线性度DAC的转换速率由建立时间输出电压量从最底端到最顶端所花费的时间决定。从输入全0变为全1时开始到输出电压稳定FSR在-二分之一到正二分之一LSB范围。DAC的数字输入量做等量增加时理论上模拟输出电压也应作等量增加但实际上会存在一定的偏差。转换精度理想情况下转换精度就是其分辨率实际使用中转换精度受外围电路以及电源精度影响。二、DAC类型常用的DAC可大致分为权电阻网络DAC、T型电阻网络DAC、倒T型电阻网络DAC以及权电流型DAC。三、DAC芯片使用方法针对TLV5618A型DACtsuCS-CK从信号CS_N被拉低到第一个SCLK下降沿所需保持的时间间隔就是SCLK下降沿之前CS_N信号要提前多久拉低这个时间受芯片后缀以及VDD供电电压的影响这里是5ns。twH、twLSCLK高/低脉冲持续时间对应时钟信号高低电平的时间这里是25ns如果这里按25ns来就和半个时钟周期时间统一起来了。tsuDSCLK下降沿的时候DAC芯片会锁存DIN信号上面的值就是要求在SCLK下降沿之前多久DIN上的数据就必须已经稳定好数据应该在SCLK下降之前多长时间内稳定这里是5ns。tsuC16-CS从第16个SCLK的下降沿到CS_N信号拉高所需要满足的时间这里是10ns。ps16位的数据写操作完成之后16位的数据会在第16个SCLK下降沿之后的下一个上升沿被自动更新到DAC芯片内部的保持和控制寄存器高四位D15、D14、D13、D12为配置位其中D14和D13用于配置速率和功率TLV5618芯片结构框图中power and speed control的那两个信号D15和D12用来控制寄存器选择数据写到buffer还是A或者B的两个通道的锁存器里面。两位都是0时将数据写到B的锁存器和buffer中01时将数据写到buffer中10将数据写到A的锁存器中并且更新锁存器B的数据到buffer同步更新DIN应该在SCLK的上升沿发生变化因为DAC芯片在SCLK下降沿采样DIN信号上的值这样传输的数据会更稳定利用启动信号Set_Go通知驱动模块开始工作将用户控制数据给到驱动模块的同时给出这个驱动信号告诉模块开始工作了第一轮传完了那什么时候传输第二轮呢利用Set_Done信号来输出设置完成的标志信号。控制器仿真和板级验证a.顶层代码module TLV5618_Driver( Clk, Rst_n, DAC_DATA, Set_Go, Set_Done, DAC_CS_N, DAC_SCLK, DAC_DIN ); input Clk; input Rst_n; input [15:0]DAC_DATA; input Set_Go; output reg Set_Done; output reg DAC_CS_N; output reg DAC_SCLK; output reg DAC_DIN; parameter CLOCK_FREQ 50_000_000; parameter SCLK_FREQ 12_500_000; parameter MCNT_DIV_CNT CLOCK_FREQ/(SCLK_FREQ * 2) - 1; reg[7:0]DIV_CNT; reg [5:0]LSM_CNT; reg [15:0]r_DAC_DATA; always(posedge Clk) if(Set_Go) r_DAC_DATA DAC_DATA; else r_DAC_DATA r_DAC_DATA; reg Set_En; //设置使能持续时间 always(posedge Clk or negedge Rst_n ) if(!Rst_n ) Set_En 1d0; else if(Set_Go) Set_En 1d1; else if((LSM_CNT 6d33) (DIV_CNT MCNT_DIV_CNT)) Set_En 1d0; else Set_En Set_En; always(posedge Clk or negedge Rst_n) if(!Rst_n) DIV_CNT 0; else if(Set_En)begin if(DIV_CNT MCNT_DIV_CNT) DIV_CNT 0; else DIV_CNT DIV_CNT 1d1; end else DIV_CNT 0; always(posedge Clk or negedge Rst_n) if(!Rst_n) LSM_CNT 6d0; else if(DIV_CNT MCNT_DIV_CNT)begin if(LSM_CNT 6d33) LSM_CNT 6d0; else LSM_CNT LSM_CNT 1d1; end else LSM_CNT LSM_CNT; always(posedge Clk or negedge Rst_n) if(!Rst_n)begin DAC_SCLK 1d1; DAC_DIN 1d1; DAC_CS_N 1d1; end else if(DIV_CNT MCNT_DIV_CNT)begin case(LSM_CNT) 0 : begin DAC_CS_N 1d0; DAC_DIN r_DAC_DATA[15];DAC_SCLK 1d1;end 1 : begin DAC_SCLK 1d0;end 2 : begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[14];end 3 : begin DAC_SCLK 1d0;end 4 : begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[13];end 5 : begin DAC_SCLK 1d0; end 6 : begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[12];end 7 : begin DAC_SCLK 1d0; end 8 : begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[11];end 9 : begin DAC_SCLK 1d0; end 10: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[10]; end 11: begin DAC_SCLK 1d0;end 12: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[9]; end 13: begin DAC_SCLK 1d0;end 14: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[8]; end 15: begin DAC_SCLK 1d0;end 16: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[7]; end 17: begin DAC_SCLK 1d0;end 18: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[6]; end 19: begin DAC_SCLK 1d0;end 20: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[5]; end 21: begin DAC_SCLK 1d0;end 22: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[4]; end 23: begin DAC_SCLK 1d0;end 24: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[3]; end 25: begin DAC_SCLK 1d0;end 26: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[2]; end 27: begin DAC_SCLK 1d0;end 28: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[1]; end 29: begin DAC_SCLK 1d0;end 30: begin DAC_SCLK 1d1; DAC_DIN r_DAC_DATA[0]; end 31: begin DAC_SCLK 1d0; end 32: begin DAC_SCLK 1d1;end 33: begin DAC_CS_N 1d1; end default: DAC_CS_N 1d1; endcase end always(posedge Clk or negedge Rst_n ) if(!Rst_n ) Set_Done 0; else if((LSM_CNT 33) (DIV_CNT MCNT_DIV_CNT)) Set_Done 1d1; else Set_Done 1d0; endmoduleb.仿真代码timescale 1ns / 1ps module TLV5618_Driver_tb(); reg Clk; reg Rst_n; reg [15:0]DAC_DATA; reg Set_Go; wire Set_Done; wire DAC_CS_N; wire DAC_DIN; wire DAC_SCLK; TLV5618_Driver TLV5618_Driver( .Clk(Clk), .Rst_n(Rst_n), .DAC_DATA(DAC_DATA), .Set_Go(Set_Go), .Set_Done(Set_Done), .DAC_CS_N(DAC_CS_N), .DAC_DIN(DAC_DIN), .DAC_SCLK(DAC_SCLK) ); initial Clk 1; always#10 Clk ~Clk; initial begin Rst_n 0; Set_Go 0; DAC_DATA 0; #201; Rst_n 1; #200; DAC_DATA 16hC_AAA; Set_Go 1; #20; Set_Go 0; #200; wait(Set_Done); #20001; DAC_DATA 16h4_555; Set_Go 1; #20; Set_Go 0; #200; wait(Set_Done); #20001; DAC_DATA 16h1_555; Set_Go 1; #20; Set_Go 0; #200; wait(Set_Done); #20001; DAC_DATA 16hf_555; Set_Go 1; #20; Set_Go 0; #200; wait(Set_Done); #20000; $stop; end endmodulec.仿真波形重点分析第三组数据的传输DAC_CS_N拉低的时候SCLK高电平有效DAC_DIN开始传输数据。其中DAC_DATA是你想输入的16数值r_DAC_DATA用来锁存想输入的数值当Set_Go信号有效DAC_CS_N拉低DAC_DIN信号根据你的数据格式开始写入到寄存器或者buffer中。四、DAC芯片数据手册针对DACx1416为R-2R型OUT0~OUT15各通道的模拟 DAC 输出电压。SDO在使用该引脚前必须通过设置SDO 使能位SDO-EN来启用它。数据会在串行时钟引脚SCLK的上升沿或下降沿同步下从输入移位寄存器中移出具体使用哪个时钟沿由FSDO 位配置默认使用上升沿。SCLK(SCK)串行接口时钟。SDI数据会在串行时钟引脚SCLK的每一个下降沿同步移入输入移位寄存器。CS(CSLD)低电平有效的串行数据使能端。该输入是串行数据的帧同步信号当信号为低电平时启用串行接口移位寄存器。VIOIO口供应电压1.7V~5.5V这个引脚用于设置设备的输入输出I/O工作电压。VCC31、40电源正模拟电源输出9V 至 41.5V。VSS32、39电源负模拟电源输出-21.5V 至 0V。VAA电源模拟电源电压4.5V 至 5.5V。该引脚必须与 VDD 引脚电位保持一致。VDD电源数字电源电压4.5V 至 5.5V。该引脚必须与 VAA 引脚电位保持一致。Thermal Pad散热焊盘—散热焊盘位于封装底部。需通过多个过孔将散热焊盘连接到 PCB 内部的地平面以保证良好的散热性能。方法根据传输时序图可以看出当转换还没有开始的时候CS非为高电平SCLK可以是高电平也可以是低电平当CS非为低电平并且SCLK也开始变化SDI在SCLK的每个上升沿变化因为DAC的芯片在SCLK的下降沿去读取的。每一轮传输数据的话包括24个SCLK周期当24个数据传完之后CS非拉高传输结束。Bit23最高位读写控制位R/W0 写操作1 读操作。Bit22预留位 / 固定位通常置 0芯片忽略。Bit21 ~ Bit16寄存器地址。指定读写操作时要访问的寄存器。6 位目标寄存器地址覆盖芯片所有寄存器16 通道 DAC 的通道配置、全局控制、校准寄存器等均通过此 6 位寻址Bit15~Bit0数据周期位。若为写入命令数据周期位即为要写入地址A[5:0]寄存器的值若为读取命令数据周期位则为无关值。空闲阶段CS 高电平SCLK 无有效时钟SDI 无有效数据。启动准备CS 下降沿触发后需等待tCSS​CS 建立时间确保设备完成初始化。数据传输SCLK 开始产生有效时钟每一个时钟周期同步一位 SDI 数据从Bit23到Bit0依次输入设备。结束传输所有数据位传输完成后SCLK 停止有效时钟CS 上升沿触发需等待tCSH​CS 保持时间确保设备完成数据锁存最终回到空闲状态。