打印
[数据转换器-信号链]

求助,DAC8760输出4-20ma不对!

[复制链接]
2533|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangjy|  楼主 | 2017-2-26 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DAC, pi, IO, gp, GPIO
一直在调DAC8760,输出范围4-20mA, 目前发现只能输出0mA 和 24mA,不知道什么原因,我附上程序,请帮我看看,是不是我配置的问题?






//库文件名: dac8760.h
#ifndef _dac8760_H
#define _dac8760_H   
//***********************************************************
//以下是使用到的SPI通讯端口,需要根据实际连接情况进行配置
#define DAC8760_GPIO                 GPIOB  


#define DAC8760_DIN_GPIO                 GPIOD


#define DAC8760_DIN                         GPIO_Pin_2
//写数据线
#define DAC8760_SCK                         GPIO_Pin_3
//时钟线
#define DAC8760_LAT                         GPIO_Pin_4
//使能线   
#define DIN_1                                         GPIO_SetBits(DAC8760_DIN_GPIO, DAC8760_DIN)   
#define DIN_0                                         GPIO_ResetBits(DAC8760_DIN_GPIO, DAC8760_DIN)  

#define SCK_1                                         GPIO_SetBits(DAC8760_GPIO, DAC8760_SCK)   
#define SCK_0                                         GPIO_ResetBits(DAC8760_GPIO, DAC8760_SCK)  
                                                     
#define LAT_1                                         GPIO_SetBits(DAC8760_GPIO, DAC8760_LAT)   
#define LAT_0                                         GPIO_ResetBits(DAC8760_GPIO, DAC8760_LAT)   


//**********************************************************
#define V_0_5                                          0x0000
//电压范围0-5V


#define V_0_10                                         0x0001
//电压范围0-10V   


#define I_4_20                                         ((unsigned short)(1<<9))
//电流范围4-20mA


#define I_0_20                                         ((unsigned short)(2<<9))
//电流范围0-20mA


#define I_0_24                                         ((unsigned short)(3<<9))
//电流范围0-24mA   
//**********************************************************


extern void DAC8760_Init(void);
extern void DAC8760_Out(unsigned short dat);  
#endif




//文件名: dac8760.c  
/****************************************************************************
                                                                                           DAC8760控制程序  
****************************************************************************/
#include "common.h"


//**********************************************************
void DAC8760_Write(unsigned char add,unsigned short dat);
void DAC8760_Config(void);
void DAC8760_Init(void);
void DAC8760_Out(unsigned short dat);


void delay_ms(unsigned int cnt)
{
        unsigned int i;


        for(i = 0; i < cnt; i++)
        {
         __nop();
        }
}


//写寄存器
void DAC8760_Write(unsigned char add,unsigned short dat)
{  
        unsigned char i;   unsigned char h_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;   
                }     
                delay_ms(100);
                SCK_1;      
                add<<=1;   
        }


        for(i=8;i>0;i--)
        //写高8位数据  
        {   
                SCK_0;     
                if(h_8bit&0x80)   
                {   
                        DIN_1;   
                }   
                else   
                {   
                        DIN_0;   
                }      
                delay_ms(100);
                SCK_1;      
                h_8bit<<=1;     
        }


        for(i=8;i>0;i--)
        //写低8位数据  
        {   
                SCK_0;     
                if(l_8bit&0x80)   
                {   
                        DIN_1;   
                }   
                else   
                {   
                        DIN_0;   
                }      
                delay_ms(100);
                SCK_1;      
                l_8bit<<=1;   
        }   
        delay_ms(100);
        LAT_1;  
        DIN_1;
}


void DAC8760_Config(void)
{  
        DAC8760_Write(0x56,0x0001);  
        delay_ms(1000);        
        //复位所有寄存器;   
        DAC8760_Write(0x55,(1<<12)| V_0_5);
        delay_ms(1000);
        //控制寄存器设置;    DB12 输出使能   | 电压输出范围0-5V  
        DAC8760_Write(0x57,(1<<8) | I_4_20);
        delay_ms(1000);
        //配置寄存器设置;    DB8  双输出使能 | 电流输出范围4-20mA     
        DAC8760_Write(0x01,0);
        delay_ms(1000);
       
        //输出0  
}


void DAC8760_Init(void)
{   
GPIO_InitTypeDef GPIO_InitStructure;
  /* Configure  DAC8760  */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);       

  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);       





        DAC8760_Config();
}   


void DAC8760_Out(unsigned short dat)
{  
        DAC8760_Write(0x01,dat);  
}








相关帖子

沙发
airwill| | 2017-2-26 10:39 | 只看该作者
看样子是 STM32 的程序
我第一感觉可能是时序的问题, 我查了一下 DAC 的手册,表面看时序是满足的。
不过你的程序里面有个缺陷。高电平的时间明显低于低电平。不过还是满足芯片时序要求的时间。具体还得用示波器验证。
估计问题不在这里,那么你怎么调电流的呢

使用特权

评论回复
板凳
zhangjy|  楼主 | 2017-2-26 14:43 | 只看该作者
是基于STM32的, 主要是手头没有示波器! 没法看时序

使用特权

评论回复
地板
zhangjy|  楼主 | 2017-2-26 15:08 | 只看该作者
直接调用 void DAC8760_Out(unsigned short dat)  这个函数, 输出电流

使用特权

评论回复
5
ddlxiaoxu| | 2017-2-26 21:34 | 只看该作者
是做旋转编码器???

使用特权

评论回复
6
airwill| | 2017-2-27 07:39 | 只看该作者
没法看时序,确实是个麻烦,可以去淘一个什么逻辑分析仪试试。
比快递费贵不了多少。挺好用的

使用特权

评论回复
7
zhangjy|  楼主 | 2017-2-27 13:12 | 只看该作者
ddlxiaoxu 发表于 2017-2-26 21:34
是做旋转编码器???

不是,怎么了?

使用特权

评论回复
8
zhangjy|  楼主 | 2017-2-27 13:13 | 只看该作者
airwill 发表于 2017-2-27 07:39
没法看时序,确实是个麻烦,可以去淘一个什么逻辑分析仪试试。
比快递费贵不了多少。挺好用的 ...

你这个建议不错,时间上面不知道来不来得及?

使用特权

评论回复
9
zhangjy|  楼主 | 2017-2-27 13:26 | 只看该作者
airwill 发表于 2017-2-26 10:39
看样子是 STM32 的程序
我第一感觉可能是时序的问题, 我查了一下 DAC 的手册,表面看时序是满足的。
不过 ...

我调用 DAC8760_Out(0); 按道理应该输出4mA,测量结果输出0mA;      我调用 DAC8760_Out(0xFFFF); 应该输出20mA, 测量结果输出23mA;   

使用特权

评论回复
10
zhangjy|  楼主 | 2017-2-27 13:26 | 只看该作者
已经搞了几天了,没有查明什么原因? 有谁指点一下。

使用特权

评论回复
11
airwill| | 2017-2-27 13:48 | 只看该作者
能够输出不同的电流,看来不是时序的问题
我查了下手册 ZHCSBX4A –JUNE 2013–REVISED DECEMBER 2013
第 30 页讲到有三个模式
For a 0-mA to 20-mA output range:
For a 0-mA to 24-mA output range:
For a 4-mA to 20-mA output range:
你这个好象跟 0~24mA 模式匹配,看样子还是设置问题。

使用特权

评论回复
12
zhangjy|  楼主 | 2017-2-27 15:57 | 只看该作者
airwill 发表于 2017-2-27 13:48
能够输出不同的电流,看来不是时序的问题
我查了下手册 ZHCSBX4A –JUNE 2013–REVISED DECEMBER 2013
第 3 ...

我用万用表mA电流档直接接到IOUT和GND之间, 不知道中间是否要串接电阻???

使用特权

评论回复
13
airwill| | 2017-2-27 17:28 | 只看该作者
万用表可以直接量的, 我查的手册那里说的内容你看到了吗
看看相关的内容, 是怎么设置这个配置的

使用特权

评论回复
14
YAOZHIQ| | 2017-12-1 16:11 | 只看该作者
楼主  在么  我也在调试这个  可以把这个工程发给我看看吗?小弟是新手,还望帮助!
2281124915@qq.com 这是我邮箱

使用特权

评论回复
15
soodesyt| | 2017-12-6 17:45 | 只看该作者
16
soodesyt| | 2017-12-6 17:45 | 只看该作者
楼主说的数值不正确吗

使用特权

评论回复
17
mnynt121| | 2017-12-6 17:46 | 只看该作者
硬件设计的没有问题吗?

使用特权

评论回复
18
mnynt121| | 2017-12-6 17:50 | 只看该作者
使用示波器测量输出的信号是否正确

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

73

帖子

0

粉丝