DAC8760完全资料含STM32驱动源码.docx
《DAC8760完全资料含STM32驱动源码.docx》由会员分享,可在线阅读,更多相关《DAC8760完全资料含STM32驱动源码.docx(16页珍藏版)》请在冰豆网上搜索。
DAC8760完全资料含STM32驱动源码
DAC8760资料
特性
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
增益寄存器可被设定为对器件进行数字校准
输出转换率也由寄存器设定
芯片管脚功能
1AVSS在双电源供电,模拟电源负极。
连接到GND做单电源供电
2DVDD数字电源。
DVDD-EN悬空时DVDD输出+4.6V,DVDD-EN接地时DVDD连接外部+5V电源
3/ALARM报警引脚。
开漏输出。
外接10K上拉电阻。
当检测到报警状态(超温断路,超时等等)该引脚警报拉低(主动)
4GND
5CLR-SEL选用上电复位清除VOUT状态
6CLR清除输入。
此引脚高电平时进入CLEAR状态,使VOUT=0
7LATCHDAC寄存器的输入锁存。
输入移位寄存器在此脚的上升沿将数据加载到数据寄存器和控制寄存器以更新DAC的输出。
此脚在SCLK的第24个时钟之前置低,之后置高更新输出,此脚功能类似于片选
8SCLK串行时钟输入。
速率可高达30MHz
9DIN串行数据输入。
数据在串行时钟输入的每个上升沿被计时至24位输入移位寄存器
10SDO串行数据输出。
数据在SCLK的上升沿有效
11GND
12GND
13ISET-R外部精密电阻连接引脚(15K)。
看到这个数据表操作部分的理论
14REFOUT内部参考输出。
连接至REFIN时使用内部参考
15REFIN参考输入
16DVDD-EN内部电源使能。
此引脚连接到GND禁用内部供应,或离开这个引脚无关,使内部供应。
该引脚时连接到GND,外部电源必须连接到的DVDD引脚
17CMP外部补偿电容连接销(可选)。
另外的外部电容器(连接在VOUT和这个引脚)提高了稳定性与高电容负载在VOUT引脚通过降低输出放大器的带宽,从而增加沉降时间。
18HART-INHART调制输入引脚
19IOUT电流输出引脚
20BOOST提高销。
外部晶体管连接(可选)。
21VOUT电压输出引脚
22+VSENSE为正电压输出负载连接针感
23-VSENSE对于负电压输出负载连接针感
24AVDD正模拟电源
简单的测试电路
理想输出电压为
通讯时序
写模式时序
回读模式时序
SPI移位寄存器
默认的框架是24位的(使用CRC校验则是32位数据模式)数据模式,数据高位在前,第个数据都在时钟SCLK的上升沿被锁存。
默认的24位输入模式是由一个8位地址加上一个16位数据组成
在24个时钟周期之后LATCH引脚的上升沿将输入的数据锁存,并更新输出状态。
上电复位后SPI移位寄存器复位到000000h地址
写操作地址
读操作
读操作的地址字节是0x02。
跟着读操作命令寻址的寄存器。
从寄存器中读出地址或数据。
读寄存器输出的数据高位在前,SDO在SCLK的下降沿连续输出数据,MCU在下一个SCLK的上升沿读取SDO上的数据。
指令和寄存器映射
DACx760寄存器描述
控制寄存器
该DACx760控制寄存器写入地址0x55。
配置寄存器
该DACx760配置寄存器写入地址0x57。
DAC寄存器
DAC寄存器包含一个数据寄存器一个DAC增益校准寄存器和一个DAC零校准寄存器.用户校准在用户校准部分描述,可以微调系统增益和零误差
DAC数据寄存器
DAC增益校准寄存器
DAC零校准寄存器
复位寄存器
该DACx760复位寄存器写入地址0x56。
状态寄存器
此只读寄存器由四个报警状态位(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。
DACCLEAR
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°C
•看门狗定时器超时(如果已启用)
•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,以下是PCB截图.
以下是在STM32F103上测试通过的程序,(72M系统时钟)
//库文件名:
dac8760.h
#ifndef_dac8760_H
#define_dac8760_H
#include"stm32f10x.h"
//***********************************************************
//以下是使用到的SPI通讯端口,需要根据实际连接情况进行配置
#defineDAC8760_GPIOGPIOA
#defineDAC8760_RCCRCC_APB2Periph_GPIOA
#defineDAC8760_DINGPIO_Pin_11//写数据线
#defineDAC8760_SCKGPIO_Pin_12//时钟线
#defineDAC8760_LATGPIO_Pin_13//使能线
#defineDIN_1GPIO_SetBits(DAC8760_GPIO,DAC8760_DIN)
#defineDIN_0GPIO_ResetBits(DAC8760_GPIO,DAC8760_DIN)
#defineSCK_1GPIO_SetBits(DAC8760_GPIO,DAC8760_SCK)
#defineSCK_0GPIO_ResetBits(DAC8760_GPIO,DAC8760_SCK)
#defineLAT_1GPIO_SetBits(DAC8760_GPIO,DAC8760_LAT)
#defineLAT_0GPIO_ResetBits(DAC8760_GPIO,DAC8760_LAT)
//**********************************************************
#defineV_0_50x0000//电压范围0-5V
#defineV_0_100x0001//电压范围0-10V
#defineI_4_20((u16)(1<<9))//电流范围4-20mA
#defineI_0_20((u16)(2<<9))//电流范围0-20mA
#defineI_0_24((u16)(3<<9))//电流范围0-24mA
//**********************************************************
externvoidDAC8760_Init(void);
externvoidDAC8760_Out(u16dat);
#endif
//文件名:
dac8760.c
/****************************************************************************
DAC8760控制程序
****************************************************************************/
#include"stm32f10x.h"
#include"dac8760.h"
//**********************************************************
voidDAC8760_Write(u8add,u16dat);
voidDAC8760_Config(void);
//u16DAC8760_Read(u16add);
voidDAC8760_Init(void);
voidDAC8760_Out(u16dat);
//**********************************************************
voidDAC8760_Write(u8add,u16dat)//写寄存器
{
u8i;
u8h_8bit,l_8bit;
h_8bit=(dat>>8)&0x00FF;//取高8位数据
l_8bit=dat&0x00FF;//取低8位数据
LAT_0;
for(i=8;i>0;i--)//写8位地址
{
SCK_0;
if(add&0x80)
{
DIN_1;
}
else
{
DIN_0;
}
SCK_1;
add<<=1;
}
for(i=8;i>0;i--)//写高8位数据
{
SCK_0;
if(h_8bit&0x80)
{
DIN_1;
}
else
{
DIN_0;
}
SCK_1;
h_8bit<<=1;
}
for(i=8;i>0;i--)//写低8位数据
{
SCK_0;
if(l_8bit&0x80)
{
DIN_1;
}
else
{
DIN_0;
}
SCK_1;
l_8bit<<=1;
}
LAT_1;
DIN_1;
}
/*
u16DAC8760_Read(u16add)//00读状态寄存器,01读数据寄存器,02读控制寄存器,0B读配置寄存器
{
u16i,dat;
DAC8760_Write(0x02,add);
LAT_0;
for(i=8;i>0;i--)//前8位数据无效
{
SCK_0;
__nop();
SCK_1;
__nop();
}
dat=0;
for(i=16;i>0;i--)
{
SCK_0;
dat<<=1;
SCK_1;
dat|=SDO;
}
returndat;
}
*/
voidDAC8760_Config(void)
{
DAC8760_Write(0x56,0x0001);//复位所有寄存器;
DAC8760_Write(0x55,(1<<12)|V_0_5);//控制寄存器设置;DB12输出使能|电压输出范围0-5V
DAC8760_Write(0x57,(1<<8)|I_4_20);//配置寄存器设置;DB8双输出使能|电流输出范围4-20mA
DAC8760_Write(0x01,0);//输出0
}
voidDAC8760_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(DAC8760_RCC,ENABLE);//使能外设时钟
GPIO_InitStructure.GPIO_Pin=DAC8760_DIN|DAC8760_SCK|DAC8760_LAT;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(DAC8760_GPIO,&GPIO_InitStructure);
DAC8760_Config();
}
voidDAC8760_Out(u16dat)
{
DAC8760_Write(0x01,dat);
}