16位DAC
+10V至+36V单电源,或者18V的双电源供电
输出电流:4-20mA或0-20mA或0-24mA
输出电压:0-5V或0-10V或5V或10V,可以通过设置寄存器超出量程10%的范围.
同步电压和电流输出
CRC校验
看门狗
过热告警
开路告警,适中电流限制
加电复位功能,以确保在一个已知状态中加电(IOUT和VOUT被禁用,并且处于高阻抗(Hi-Z)状态)
CLR和CLR-SEL引脚可将输出设定为0
增益寄存器可被设定为对器件进行数字校准
输出转换率也由寄存器设定
1、 AVSS在双电源供电,模拟电源负极。连接到GND做单电源供电
2、 DVDD数字电源。DVDD-EN悬空时DVDD输出+4.6V,DVDD-EN接地时DVDD连接外部+5V电源
3、 /ALARM报警引脚。开漏输出。外接10K上拉电阻。当检测到报警状态(超温断路,超时等等)该引脚警报拉低(主动)
4、 GND
5、 CLR-SEL选用上电复位清除VOUT状态
6、 CLR清除输入。此引脚高电平时进入CLEAR状态,使VOUT=0
7、 LATCHDAC寄存器的输入锁存。输入移位寄存器在此脚的上升沿将数据加载到数据寄存器和控制寄存器以更新DAC的输出。此脚在SCLK的第24个时钟之前置低,之后置高更新输出,此脚功能类似于片选
8、 SCLK串行时钟输入。速率可高达30MHz
9、 DIN串行数据输入。数据在串行时钟输入的每个上升沿被计时至24位输入移位寄存器
10、 SDO 串行数据输出。数据在SCLK的上升沿有效
11、 GND
12、 GND
13、 ISET-R外部精密电阻连接引脚(15K)。看到这个数据表操作部分的理论
14、 REFOUT内部参考输出。连接至REFIN时使用内部参考
15、 REFIN参考输入
16、 DVDD-EN内部电源使能。此引脚连接到GND禁用内部供应,或离开这个引脚无关,使内部供应。该引脚时连接到GND,外部电源必须连接到的DVDD引脚
17、 CMP外部补偿电容连接销(可选)。另外的外部电容器(连接在VOUT和这个引脚)提高了稳定性与高电容负载在VOUT引脚通过降低输出放大器的带宽,从而增加沉降时间
18、 HART-INHART调制输入引脚
19、 IOUT电流输出引脚
20、 BOOST提高销。外部晶体管连接(可选)
21、 VOUT电压输出引脚
22、 +VSENSE为正电压输出负载连接针感
23、 -VSENSE对于负电压输出负载连接针感
24、 AVDD正模拟电源
LATCH 输入移位寄存器在此脚的上升沿将数据加载到数据寄存器和控制寄存器以更新DAC的输出。此脚在SCLK的第24个时钟之前置低,之后置高更新输出
默认的框架是24位的(使用CRC校验则是32位数据模式)数据模式,数据高位在前,第个数据都在时钟SCLK的上升沿被锁存。默认的24位输入模式是由一个8位地址加上一个16位数据组成
在24个时钟周期之后LATCH引脚的上升沿将输入的数据锁存,并更新输出状态。上电复位后SPI移位寄存器复位到000000h地址
读操作的地址字节是0x02。跟着读操作命令寻址的寄存器。从寄存器中读出地址或数据。读寄存器输出的数据高位在前, SDO在SCLK的下降沿连续输出数据,MCU在下一个SCLK的上升沿读取SDO上的数据。
DAC寄存器包含一个数据寄存器一个DAC增益校准寄存器和一个DAC零校准寄存器.用户校准在用户校准部分描述,可以微调系统增益和零误差
此只读寄存器由四个报警状态位(CRC-FLT,WD-FLT,I-FLT,T-FLT)和SR-ON位显示转换率状态。该装置连续监视输出和模块温度。当报警发生时,对应的报警状态位置1。每当一个报警状态位被设置,直到造成问题的事件被解决。报警位只能通过执行软复位清除,或上电复位,或错误已经解决了。这些位是重申如果报警条件继续在下一监测周期存在。报警位置“0”的条件是当错误解决了。
在正常模式下的电压和电流输出(VOUT和IOUT不同时启用)
当输出电压和输出电流的同时启用(双输出模式)通过设置配置寄存器中的DUALOUTEN位,电压输出范围在控制寄存器的RANGE位设置,电流输出范围在配置寄存器中的IOUTRANGE位设置。
DACx760包括一个集成的5V参考电源(REFOUT),有5mA的驱动能力,初始精度为±5mV。
内部产生4.6v电压输出,具有10mA驱动能力,可悬空DVD-EN引脚使DVDD引脚上输出。这个供电缓解了系统的电源设计时的隔离需要交叉产生的数字电源。它可以用来驱动隔离组件用于数字数据线和其它部件。如果选择外部电源给DVDD引脚供电,可以通过把DVD-EN引脚接到GND。
DAC具有异步清零功能,通过将CLR引脚置高电平,允许输出电压被清除为零或中值。这动作是用户通过选择CLR-SEL引脚和设置控制寄存器的CLRSEL位决定的。电流输出的值清除到最小范围。当CLR信号返回到低,输出保持在清理后的值。清除前的值可以通过LATCH-信号在没有任何时钟和数据恢复。一个新的值不会被编程到CLR引脚返回到低。要注意的是,在双输出模式,DAC数据寄存器的值被清除之后,设置电压输出模式。
除了定义一个明确的操作的输出值,该CLRSEL位和CLR-SEL引脚也定义默认值。一个新的电压范围在选择,输出值对应于表14中给出的定义。为了避免在输出毛刺,写一个‘0’到OUTEN位改变之前禁用输出电压范围。当OUTEN位设置为1时,输出到默认值由CLRSEL位和CLR-SEL引脚定义。
DACx760具有内部上电复位(POR)功能,有数字DVDD和模拟AVDD两个供电电路。这个电路可以确保内部逻辑上电状态的DAC电源上升到适当的状态独立的电源序列。虽然没有所需的电源上电顺序,建议先有数字的DVDD供电上来,然后由模拟电源AVDD和AVSS。如果使用双电源供电时AVSS接电源的负极,否则,AVSS连接到GND。
…………
该模块还提供报警检测功能。当下列一个或多个事件发生时,报警引脚变为低电平
电流输出负载开路
在电流输出电压达到一定的水平,对输出电流的精度受到损害。这种情况通过监测电流输出电路内部电压水平检测并通常低于指定的遵从电压余量(指AVDD和IOUT引脚之间的电压降)至少2V
模块的温度已超过142℃
看门狗定时器超时(如果已启用)
CRC校验时遇到一个错误(如果已启用)
此功能是用于确保主处理器和DACx760之间的联络不丢失。可以通过设置配置寄存器的WDEN位置1启用”。看门狗超时周期可以设置配置寄存器的WDPD位,如下表所示。定时器的周期是基于一个内部振荡器在8MHz时的典型值
如果启用,该芯片必须通过SPI为0x95地址写入的装置程序超时时间。否则,ALARM引脚被拉低并且状态寄存器的WD-FLT位设置为“1”。要注意的是,ALARM引脚可以拉低任何条件不同解释的报警检测部分。可以通过软件复位将WD-FLT位复位到“0”,或通过禁用看门狗定时器,或通过关闭装置。
如果DACx760在嘈杂的环境中使用,错误检查可用于检查该设备与主处理器之间的SPI通信数据的完整性。这个功能可以通过将配置寄存器的CRCEN位设置为“1”启用。帧错误检测方案是基于CRC-8-ATM(HEC)多项式X8+x2+x+1(即,100000111)。当错误检查已启用,SPI的宽度是32位,如下表所示。从默认的24位帧使用帧错误检测并通过CRCEN位切换到32位的框架。主处理器正常的24位SPI数据被追加的8位CRC多项式,然后传给设备。从寄存器读出,CRC多项式在通过器件SDO引脚输出成为32位框架的一部分。
DACx760解码的32位输入帧数据来计算CRC余数。如果没有错误帧存在,CRC余数为零。当余数非零,ALARM引脚拉低且状态寄存器CRC-FLT位也被置为1。要注意的是,ALARM引脚可以拉低任何不同的条件,这在报警检测部分有解释。可以通过软件复位将CRC-FLT位复位到0,或通过禁用帧错误检查,或给设备断电。在CRC错误的情况下,特定的SPI框架是禁止写入设备。
可编程的转换率
读状态寄存器0X200000
读数据寄存器0X200001
读控制寄存器0X200002
读配置寄存器0X20000B
读增益校准寄存器0X200013
读零校准寄存器0X200017
写复位寄存器0X560001
写数据寄存器0X01+16位DAC数据
写控制寄存器0X55+(1<<14)增加输出范围10%+(1<<13)
外部电流设置电阻使能+(1<<12)输出使能
+000电压输出范围(000,0-5V;001,0-10V)
写配置寄存器0X57+(00<<9)
电流输出范围 (01,4-20mA;10,0-20mA;11,0-24mA)+(1<<8)
双输出使能+(1<<5)
用户校准功能开启+(1<<3)
CRC校验+(1<<2)
使能看门狗+00
看门狗定时周期(00,10mS;01,51mS;10,102mS;11,204mS)
写增益校准寄存器0X58+16位数据
写零校准寄存器0X59+16位数据
写看门狗寄存器0X95+???
电压输出范围0-5V, 电流输出范围0-24mA
————————————————————————————————————START
/*本段为DAC8760+STM32F407硬件测试程序*/
/**时钟频率 168MHz
***IDE:Keil v5
***直接采用IO口模拟SPI总线时序,方便了解DAC8760的通讯时序
***DAC8760采用DC24V单电源供电
***输出电压0-5V
*/
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#define LED_ON GPIO_ResetBits(GPIOC,GPIO_Pin_11); //PC11 点亮LED
#define LED_OFF GPIO_SetBits(GPIOC,GPIO_Pin_11); //PC11 熄灭LED
#define DAC8760_LATCH_0 GPIO_ResetBits(GPIOB,GPIO_Pin_11) //片选拉低
#define DAC8760_LATCH_1 GPIO_SetBits(GPIOB,GPIO_Pin_11) //片选拉高
#define DAC8760_CLK_0 GPIO_ResetBits(GPIOB,GPIO_Pin_13) //时钟拉低
#define DAC8760_CLK_1 GPIO_SetBits(GPIOB,GPIO_Pin_13) //时钟拉高
#define DAC8760_MI_0 GPIO_ResetBits(GPIOB,GPIO_Pin_14) //数据输入拉低
#define DAC8760_MI_1 GPIO_SetBits(GPIOB,GPIO_Pin_14) //数据输入拉高
#define DAC8760_MO_0 GPIO_ResetBits(GPIOB,GPIO_Pin_15) //数据输出拉低
#define DAC8760_MO_1 GPIO_SetBits(GPIOB,GPIO_Pin_15) //数据输出拉高
/*****************/
#define V_0_5 0x0000 //电压范围0-5V
#define V_0_10 0x0001 //电压范围0-10V
/* DAC8760 8位地址 */
#define W_ADDR_NOP 0x00
#define W_ADDR_DATA 0x01 // 写数据寄存器
#define W_ADDR_READ 0x02 // 读数据寄存器
#define W_ADDR_CTRL 0x55 // 写控制寄存器
#define W_ADDR_RESET 0x56 // 写复位寄存器
#define W_ADDR_CONFIG 0x57 // 写配置寄存器
#define W_ADDR_GAIN 0x58 // 写增益校准寄存器
#define W_ADDR_ZERO 0x59 // 写零校准寄存器
#define W_ADDR_WDT 0x95 // 写看门狗寄存器
/* 读操作命令寻址的寄存器地址 */
#define R_ADDR_SATUS 0x00
#define R_ADDR_DATA 0x01
#define R_ADDR_CTRL 0x02
#define R_ADDR_CONFIG 0x0B
#define R_ADDR_GAIN 0x13
#define R_ADDR_ZERO 0x17
void IO_init(void){ //引脚初始化程序
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
//GPIOB 11初始化设置 作为DAC8760的片选信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
GPIO_ResetBits(GPIOB,GPIO_Pin_11); //GPIOB 11
GPIO_ResetBits(GPIOB,GPIO_Pin_13); //GPIOB 13
GPIO_ResetBits(GPIOB,GPIO_Pin_14); //GPIOB 14
GPIO_ResetBits(GPIOB,GPIO_Pin_15); //GPIOB 15
}
void LED(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化
GPIO_SetBits(GPIOC,GPIO_Pin_11); //GPIOC11 LED OFF
}
//DAC8760写数据函数
//函数名: u16 Write_DAC8760(uint8_t ch_Addr, uint16_t ch_Data)
//函数入口参数: ch_Addr 写入地址 ch_Data 写入数据
u16 Write_DAC8760(uint8_t ch_Addr, uint16_t ch_Data){
u8 i;
u8 h_8bit, i_8bit;
i_8bit=(ch_Data&0x00ff); //取写入数据的低8位
h_8bit=(ch_Data>>8)&0x00ff; //取写入数据的高8位
DAC8760_LATCH_0; //拉低片选
for(i=8;i>0;i--){ //写8位地址
DAC8760_CLK_0;
if(ch_Addr&0x80){
DAC8760_MO_1;
}
else{
DAC8760_MO_0;
}
delay_us(500);
DAC8760_CLK_1;
delay_us(500);
ch_Addr<<=1;
}
for(i=8;i>0;i--){ //先写高8位地址
DAC8760_CLK_0;
if(h_8bit&0x80){
DAC8760_MO_1;
}
else{
DAC8760_MO_0;
}
delay_us(500);
DAC8760_CLK_1;
delay_us(500);
h_8bit<<=1;
}
for(i=8;i>0;i--){ //再写低8位地址
DAC8760_CLK_0;
if(i_8bit&0x80){
DAC8760_MO_1;
}
else{
DAC8760_MO_0;
}
delay_us(500);
DAC8760_CLK_1;
delay_us(500);
i_8bit<<=1;
}
DAC8760_LATCH_1; //数据写完,拉高片选,DAC8760才会将数据加载到数据寄存器和控制寄存器以更新DAC的输出
DAC8760_CLK_0; //保持时钟总线空闲时低电位
DAC8760_MO_0; //主机输出总线空闲时低电位
}
void DAC8760_Config(void){
Write_DAC8760(W_ADDR_RESET,0x0001); // 0x56 复位寄存器 0x0001执行软件复位
Write_DAC8760(W_ADDR_CTRL,(1<<12)|V_0_5); // 0x55 控制寄存器 (1<<12)|V_0_5设置电压输出模式0-5V,并且使能控制寄存器第12位
Write_DAC8760(W_ADDR_CONFIG,0x0000); // 0x57 配置寄存器 0x0000设置单电压模式,电流输出0
Write_DAC8760(0x01,0); //输出清空
}
void DAC_init(void){ //DAC初始化程序
IO_init(); //引脚初始化程序
// SPI2_Init(); //SPI2初始化
DAC8760_Config(); //DAC8760初始配置
}
void DAC8760_Output(u16 dat){ //DAC8760数据输出 Vout=DIN/65536*Vref
Write_DAC8760(W_ADDR_DATA,dat);
}
int main(void)
{
u16 i=0;
// uart_init(115200);
delay_init(168);
LED();
DAC_init();
while(1){ //从0V开始,每2s电压增加电压0.5V,伴随LED闪烁,直到电压等于5V
DAC8760_Output(i);
LED_ON;
delay_ms(2000);
i=i+6553;
if(i>=65535) i=0;
LED_OFF;
delay_ms(2000);
}
}
—————————————————————————————————————END