基于STM32F103驱动TLV5610八通道串行高速DAC模块输出信号

电子说

1.4w人已加入

描述

一、TLV5610模块简介

TLV5610是12位电压输出DAC,具有灵活的串行接口。串行数据接口可独立控制8路输出电压。可同时更新所有八个DAC输出,输出电压由一个轨至轨输出放大器进行缓冲,并具有可编程的建立时间,能够优化速度与功耗之间的关系。缓冲的高阻抗参考输入可以连接到电源电压。一般可用于可编程电压源,仪表和控制系统,传感器激励,运动过程控制,数字伺服控制回路。
STM32F103
参数特性

  • 模块供电:DC 6~8V
  • 模块电流:10mA(MAX)
  • 通讯协议:SPI串行
  • 输出电压范围:0~5V
  • DAC分辨率:12位
  • 输出通道数:8通道独立
  • 基准电压:5V,板载TI高性能基准源独立芯片
  • 电压建立时间:1us
  • DAC输出模拟带宽:100KHz

模块应用

  • 可编程电源源,仪表和控制系统,

二、TLV5610接口说明

STM32F103

LOAD加载DAC。仅当此信号为低电平时,DAC输出才会更新。这是一个异步输入。
FS帧同步输入
SCK串行时钟输入
DIN数字串行数据输入
DO数字串行数据输出
FRE预设输入

三、TLV5610功能框图和通讯说明

TLV5610是 8 通道、12 位、单电源 DAC,基于电阻串架构。它们由串行接口、速度和掉电控制逻辑、参考输入缓冲器、电阻串和轨到轨输出缓冲器组成。其中,REF 为参考电压,CODE 为数字输入值。TLV5610 的输入范围为 0x000 至 0xFFF。

STM32F103

内置的上电复位电路控制上电后的输出电压。上电时,包括预置寄存器在内的所有锁存器均被置零,但只有当 LDAC 为低电平时,DAC 输出才会被置零。DAC 输出可能存在由输出缓冲器引起的微小偏移误差。寄存器将保持为零,直到向 DAC 发送有效的写入序列,从而改变 DAC 寄存器的数据。这在需要了解上电后 DAC 输出状态的应用中非常有用。所有数字输入在施加数字和模拟电源之前必须为逻辑低电平。如果在 AVDD 和 DVDD 未供电的情况下,任何施加到逻辑输入引脚的逻辑高电压都可能通过过压保护二极管为器件逻辑电路供电,从而导致意外操作。当使用独立的模拟 (AVDD) 和数字 (DVDD) 电源时,AVDD 必须先于 DVDD 上电,以确保上电复位电路正常工作。

FS 的下降沿开始将 DIN 上的数据(从最高有效位开始)移至内部寄存器,并在 SCLK 的下降沿进行移位。传输 16 位数据后,移位寄存器的内容会根据数据字中的地址位被移至 DAC 的某个保持寄存器。LDAC 引脚为逻辑 0 时,需要将 DAC 保持寄存器的内容传输至 DAC 锁存器并更新 DAC 输出。LDAC 是一个异步输入。如果不需要同时更新所有八个通道,则可以将其保持为低电平。

STM32F103

看图1的时序图,TLV5610的FS可分两个模式控制(μC模式和DSP模式),其本质就是时序差异,可以看作FS(帧同步信号)什么时候拉高/拉低,决定数据什么时候生效。
μC模式(MODE=1):FS 必须一直保持低电平直到16bit发完,否则数据直接作废,DAC不更新。
DSP模式(MODE=0):FS 是一个“脉冲信号”,不是像CS那样包住整个数据,但额外要求在 FS 变低之前,必须有一个额外的 SCLK 下降沿,而且这个时钟必须在 FS 拉低前 ≥5ns。

STM32F103

四、TLV5610的数据格式与寄存器

TLV5610的数据格式由16 位数据字组成,其中高4位是地址位,用于控制哪个DAC / 哪个寄存器,低12位为数据位。
STM32F103

TLV5610有两个寄存器,用来开关电源,设置模式,控制输出。
CTRL0 寄存器用于多DAC串联(级联),其中PD位控制电源的开关,DO位控制数据输出。IM位为输入模式(默认为0)。
CTRL1 寄存器用于电源 + 速度控制。

STM32F103

五、TLV5610通道输出电压换算

每个通道的输出电压(满量程由外部参考电压决定)由下式给出:
STM32F103

六、STM32F103驱动TLV5610

准备工作

STM32F103C8T6开发板,TLV5610 八通道串行DAC转换模块,导线若干。

接线说明

STM32F103C8T6TLV5610
PA0LOAD
PA1DIN
PA2SCK
PA3FS
PA4FRE
PA5DO
GNDGND

STM32F103

代码示例

TLV5610.c

#include "TLV56xx.H"
#include "delay.h"

void DAC_Tlv56xx_Init(void)
{
	int i;
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PC端口时钟

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;		
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOE
	GPIO_ResetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);						 //PBA 输出高
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	LDAC_HIGH;	
	FRE_HIGH;
	delay_ms(100);
	for(i = 0; i < 8; i++)
		TLV56XX_WriteChannelValue(i, 0);
	delay_ms(50);
}
////volatile  uint16_t Cmd;
////void WriteChannelValue(uint8_t channel, uint16_t value)
////{
//// 
////  int i;
////  uint16_t bit_state;
////  //TLV5608     10BIT
////  Cmd = (channel< < 12)|((value< < 2)&0X0FFC);
////  
////  LDAC_HIGH;
////  FS_HIGH;
////  FS_LOW;
////  for(i = 0; i < 16; i++)
////  {
////    SCLK_HIGH;
////    bit_state = Cmd&0X8000;
////    if(bit_state)
////      DATA_HIGH;
////    else
////      DATA_LOW;
////    SCLK_LOW;
////    Cmd < <= 1;
////  }
////  FS_HIGH;  
////  LDAC_LOW;
////}
volatile  uint16_t Cmd;
void WriteChannelValue(uint8_t channel, uint16_t value)
{
 
  int i;
  uint16_t bit_state;
  //TLV5610     12BIT
  Cmd = (channel< < 12)|((value)&0X0FFF);
  
//  LDAC_HIGH;
  FS_HIGH;
  FS_LOW;
  for(i = 0; i < 16; i++)
  {
    SCLK_HIGH;
    bit_state = Cmd&0X8000;
    if(bit_state)
      DATA_HIGH;
    else
      DATA_LOW;   
    SCLK_LOW;
    Cmd < <= 1; 
  }
	FS_HIGH;  
	LDAC_LOW;
//  LDAC_LOW;
	
	LDAC_HIGH;
}
void TLV56XX_WriteChannelValue(uint8_t channel, uint16_t value)
{
	WriteChannelValue(channel, value);
}

main.c

#include "stm32_config.h"
#include "stdio.h"
#include "TLV56xx.H"
#include "task_manage.h"

int main(void)
{
	MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2);	//设置中断分组
	delay_init(72);	//初始化延时函数

	DAC_Tlv56xx_Init();

	TLV56XX_WriteChannelValue(0, 4095/8*1);
	TLV56XX_WriteChannelValue(1, 4095/8*2);
	TLV56XX_WriteChannelValue(2, 4095/8*3);
	TLV56XX_WriteChannelValue(3, 4095/8*4);
	TLV56XX_WriteChannelValue(4, 4095/8*5);
	TLV56XX_WriteChannelValue(5, 4095/8*6);
	TLV56XX_WriteChannelValue(6, 4095/8*7);
	TLV56XX_WriteChannelValue(7, 4095/8*8);
	while(1);
}

效果展示

8通道同时输出,1通道为0.629V到8通道的5.003V。

STM32F103

七、注意事项和常见问题解答

注意事项
(1)模块为低功耗模,供电电源不超过9V。
(2)由于模块是高精度器件,为了避免不必要的干扰,建议使用线性电源供电。
(3)输出信号线建议接触良好,接触不良或劣质的线材可能导致信号哀减或者噪声过大。

常见问题解答
(1)模块为低功耗模,供电电源不超过9V。
(2)由于模块是高精度器件,为了避免不必要的干扰,建议使用线性电源供电。
(3)输出信号线建议接触良好,接触不良或劣质的线材可能导致信号哀减或者噪声过大。
(4)配送的代码仅为配套主控板使用,不提供单片机教程,宝贝详情展示以外的功能需自行开发。
(5)如需简测试模块功能,建议搭配本店控制板使用,正确接线后给控制板供电即可实现模拟电压输入。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分