16_基于FPGA的DA_TLC5615驱动输出
实验原理
芯片简介
TLC5615 为美国德州仪器公司 1999 年推出的产品,是具有串行接口的数模转换器,其输出为电压型,最大输出电压是基准电压值的两倍。带有上电复位功能,即把 DAC 寄存器复位至全零。性能比早期电流型输出的 DAC 要好。只需要通过 3 根串行总线就可以完成 10 位数据的串行输入,易于和工业标准的微处理器或微控制器(单片机) 接口, 适用于电池供电的测试仪表、移动电话,也适用于数字失调与增益调整以及工业控制场合。
TLC5615 器件的引脚图及各引脚功能
TLC5615引脚图
DIN: 串行数据输入端; SCLK: 串行时钟输入端;
/CS: 芯片选用通端,低电平有效;
DOUT: 用于级联时的串行数据输出端;
AGND: 模拟地;
REFIN:基准电压输入端, 2V~ (VDD - 2),通常取2.048V;
OUT: DAC 模拟电压输出端;
VDD: 正电源端,4.5~5.5V ,通常取 5V。
功能框图
TLC5615 的内部功能框图如下图所示,它主要由以下几部分组成:
1、10 位 DAC 电路;
2、一个 16 位移位寄存器, 接受串行移入的二进制数,并且有一个级联的数据输出端DOUT ;
3、并行输入输出的 10 位 DAC 寄存器, 为 10 位 DAC 电路提供待转换的二进制数据;
4、电压跟随器为参考电压端REFIN提供很高的输入阻抗,大约10MΩ;
5、×2 电路提供最大值为 2 倍于 REFIN 的输出;
6、上电复位电路和控制电路。
两种工作方式:
(A)从上图可以看出,16 位移位寄存器分为高 4 位虚拟位、低两位填充位以及 10位有效位。在单片 TLC5615 工作时,只需要向 16 位移位寄存器按先后输入 10位有效位和低 2 位填充位, 2 位填充位数据任意,这是第一种方式,即 12 位数据序列。
(B)第二种方式为级联方式, 即 16 位数据列,可以将本片的 DOU T 接到下一片的 DIN , 需要向 16 位移位寄存器按先后输入高 4 位虚拟位、10 位有效位和低 2 位填充位, 由于增加了高 4 位虚拟位, 所以需要 16 个时钟脉冲。
TLC5615功能框图
TLC5615 的工作时序
TLC5615 工作时序如下图所示。可以看出,只有当片选 CS 为低电平时, 串行输入数据才能被移入 16位移位寄存器。当 CS 为低电平时,在每一个 SCLK 时钟的上升沿将 DIN 的一位数据移入 16 位移寄存器。注意, 二进制最高有效位被导前移入。接着,CS 的上升沿将 16 位移位寄存器的 10 位有效数据锁存于 10 位 DAC 寄存器, 供 DAC 电路进行转换; 当片选 CS 为高电平时,串行输入数据不能被移入 16 位移位寄存器。注意, CS 的上升和下降都必须发生在 SCLK 为低电平期间。
TLC5615工作时序
工作原理
在我们的实验中,我们采用TLC5615的12位工作模式。其中10位是有效位,2位是填充位,填充位补0即可。芯片在片选/CS为低电平时工作。在每个SCLK上升沿将DIN的一位数据移入寄存器中。/CS的上升和下降都必须发生在SCLK为低电平的时候。在实验中,我们可以根据需要输出的电压,设置一个10位二进制数,
计算公式:Vout=VREF*(N/1024) N为10位二进制码。
开发板DA芯片VDD=5V,VREF=3.3V
硬件原理图
为了方便大家能观察TLC5615输出的电压,我们附加一个例程,该例程添加了AD_TLC549芯片,只要用杜邦线把相应IO连接,通过数码管就可以显示输出的电压。
实验代码
TLC5615控制LED亮度
/********************************版权声明************************************** ** 大西瓜团队 ** **----------------------------文件信息-------------------------- ** 文件名称: TLC615.v ** 创建日期: ** 功能描述:使用10位串行DA芯片TLC5615将数字信号转换为模拟信号,开发板DA芯片VDD=5V,VREF=3.3V 计算公式:Vout=VREF*(N/1024) N为10位二进制码 ** 操作过程:根据需求,在程序改变10位二进制数,在DA芯片的Vout脚输出相应电压 ** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com ** 版权声明:本代码属个人知识产权,本代码仅供交流学习. **---------------------------修改文件的相关信息---------------- ** 修改人: ** 修改日期: ** 修改内容: *******************************************************************************/ module TLC5615 (clk, //内部时钟 sclk, //TLC5615 sclk时钟脚 din, //TLC5615 din数据脚 cs); //TLC5615 cs片选 input clk; output din; output cs; output sclk;
reg din; reg cs; reg sclk; reg[3:0] count1,count2,count3; reg [15:0] count4; reg clk_div; reg[9:0] din_reg; //10位数据寄存器 initial //初始化 begin cs=1; din=0; count1=0; count2=0; count3=0; din_reg=10'b00_0000_1111; //实验者可以根据需要修改10为二进制码 end
/*** sclk的频率设置为2.5MHz ***/ always@(posedge clk) begin if(count3==4'd9) begin sclk<=~sclk; count3<=0; end else count3<=count3+1; end
always@(posedge clk) begin if(count4==16'b1111_1111_1111_1111) begin clk_div<=~clk_div; count4<=16'b0; end else count4<=count4+1'b1; end
always @(posedge clk_div) begin if(din_reg==10'b11_1111_1111) din_reg<=10'b00_0000_0000; else din_reg<=din_reg+1'b1; end
/*** TLC5615 cs片选 ***/ always@(negedge sclk) begin if(count1>=4'd12&&count1<4'd15) begin cs<=1; //拉高片选 count1<=count1+4'd1; end else if(count1==4'd15) begin count1<=0; end else begin cs<=0; //拉低片选 count1<=count1+4'd1; end end
/*** 10位二进制码进行数模转换(采用12位传送方式即10位有效位+2位填充位) ***/ always@(posedge sclk) begin if(cs==0) begin case(count2) 4'd0:din<=1'd0; //无效位 4'd1:begin din<=din_reg[9];end //10位有效位 4'd2:begin din<=din_reg[8];end 4'd3:begin din<=din_reg[7];end 4'd4:begin din<=din_reg[6];end 4'd5:begin din<=din_reg[5];end 4'd6:begin din<=din_reg[4];end 4'd7:begin din<=din_reg[3];end 4'd8:begin din<=din_reg[2];end 4'd9:begin din<=din_reg[1];end 4'd10:begin din<=din_reg[0];end
4'd11:begin din<=1'd0;end //填充位 补0即可 4'd12:begin din<=1'd0;end //填充位 补0即可
4'd13:din<=1'd0; //无效位 4'd14:din<=1'd0; //无效位 4'd15:din<=1'd0; //无效位 default:begin count2<=0;din<=0;end endcase end if(count2==4'd15) count2<=0; else count2<=count2+4'd1; end endmodule |
TLC5615与TLC549联合实验
/********************************版权声明************************************** ** 大西瓜团队 ** **----------------------------文件信息-------------------------- ** 文件名称: TLC615.v ** 创建日期: ** 功能描述:使用10位串行DA芯片TLC5615将数字信号转换为模拟信号,开发板DA芯片VDD=5V,VREF=3.3V 计算公式:Vout=VREF*(N/1024) N为10位二进制码 最后使用开发板上AD芯片TLC549将电压显示于数码管上 ** 操作过程:根据需求,在程序改变10位二进制数,在DA芯片的Vout脚输出相应电压 ** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com ** 版权声明:本代码属个人知识产权,本代码仅供交流学习. **---------------------------修改文件的相关信息---------------- ** 修改人: ** 修改日期: ** 修改内容: *******************************************************************************/ module TLC5615_display (clk, //内部时钟 sclk, //TLC5615 sclk时钟脚 din, //TLC5615 din数据脚 cs); //TLC5615 cs片选 input clk; output din; output cs; output sclk;
reg din; reg cs; reg sclk; reg[3:0] count1,count2,count3; reg[9:0] din_reg; //10位数据寄存器
initial //初始化 begin cs=1; din=0; count1=0; count2=0; count3=0; din_reg=10'd250; //实验者可以根据需要修改10为二进制码 end
/*** sclk的频率设置为2.5MHz ***/ always@(posedge clk) begin if(count3==4'd9) begin sclk<=~sclk; count3<=0; end else count3<=count3+1; end
/*** TLC5615 cs片选 ***/ always@(negedge sclk) begin if(count1>=4'd12&&count1<4'd15) begin cs<=1; //拉高片选 count1<=count1+4'd1; end else if(count1==4'd15) begin count1<=0; end else begin cs<=0; //拉低片选 count1<=count1+4'd1; end end
/*** 10位二进制码进行数模转换(采用12位传送方式即10位有效位+2位填充位) ***/ always@(posedge sclk) begin if(cs==0) begin case(count2) 4'd0:din<=1'd0; //无效位 4'd1:begin din<=din_reg[9];end //10位有效位 4'd2:begin din<=din_reg[8];end 4'd3:begin din<=din_reg[7];end 4'd4:begin din<=din_reg[6];end 4'd5:begin din<=din_reg[5];end 4'd6:begin din<=din_reg[4];end 4'd7:begin din<=din_reg[3];end 4'd8:begin din<=din_reg[2];end 4'd9:begin din<=din_reg[1];end 4'd10:begin din<=din_reg[0];end 4'd11:begin din<=1'd0;end //填充位 补0即可 4'd12:begin din<=1'd0;end //填充位 补0即可 4'd13:din<=1'd0; //无效位 4'd14:din<=1'd0; //无效位 4'd15:din<=1'd0; //无效位 default:begin count2<=0;din<=0;end endcase end if(count2==4'd15) count2<=0; else count2<=count2+4'd1; end endmodule |
实验操作
实验效果
TLC5615控制LED亮度
TLC5615与TLC549联合实验
大西瓜FPGA-->https://daxiguafpga.taobao.com
配套开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-24211932856.3.489d7241aCjspB&id=633897209972
博客资料、代码、图片、文字等属大西瓜FPGA所有,切勿用于商业! 若引用资料、代码、图片、文字等等请注明出处,谢谢!
每日推送不同科技解读,原创深耕解读当下科技,敬请关注微信公众号"科乎"。