找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4616|回复: 14
打印 上一主题 下一主题
收起左侧

stm32的MCP4725程序遇到问题了,求解决

  [复制链接]
跳转到指定楼层
楼主
接线时,OUT直接接万用表的正极,GND接万用表的负极,VCC接单片机的5v引脚,GND也接单片机的地,但是主函数中调用MCP4725_WriteData_Voltage(4000);  不论取值时2000,4000,还是1000,还是4095,万用表测得的电压都是2.3v左右,是不是我程序哪里错了,求大佬们帮忙看看,拜托(注:单片机引脚的5v我用万用表测是4.7V左右,这会有影响吗)

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "MCP4725.h"
#include "myiic.h"


int main(void)
{        
         delay_init();            //延时函数初始化         
         MCP4725_Init();   //MCP4725初始化         
         uart_init(9600);     //串口初始化
         while(1)
        {
     MCP4725_WriteData_Voltage(4000);
                 //printf();
        }
}

MCP4725.c
#include "MCP4725.h"
#include "delay.h"
#include "usart.h"        


//初始化IIC接口
void MCP4725_Init(void)
{
        IIC_Init();
}

//使用快速模式写命令写DAC寄存器
void MCP4725_WriteData_Voltage(u16 Vout)   //电压单位mV
{
  u8 temp;
        u16 Dn;
        Dn = ( 4096 * Vout) / VREF_5V;
        temp = (0x0F00 & Dn) >> 8;  //12位数据
        
        IIC_Start();
        IIC_Send_Byte(0XC2);      //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 1;-> 1100 0010
  IIC_Wait_Ack();         
  IIC_Send_Byte(temp);         
  IIC_Wait_Ack();         
  IIC_Send_Byte(Dn);        //将低8位送到DAC寄存器
        IIC_Wait_Ack();        
  IIC_Stop();//产生一个停止条件         
        delay_ms(10);        
}

void MCP4725_WriteData_Digital(u16 data)   //12位数字量
{
  u8 data_H=0,data_L=0;
        data_H = ( 0x0F00 & data) >> 8;
        data_L = 0X00FF & data ;
        IIC_Start();
        IIC_Send_Byte(0XC0);      //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 0;-> 1100 0000
    IIC_Wait_Ack();         
    IIC_Send_Byte(data_H);         
    IIC_Wait_Ack();         
    IIC_Send_Byte(data_L);
        IIC_Wait_Ack();        
    IIC_Stop();//产生一个停止条件         
        delay_ms(10);        
}

MCP4725.h

#ifndef __MCP4725_H
#define __MCP4725_H
#include "myiic.h"   


#define VREF_5V      4760


void MCP4725_Init(void);
void MCP4725_WriteData_Digital(u16 data);
void MCP4725_WriteData_Voltage(u16 Vout);

#endif



0.jpg (29.41 KB, 下载次数: 75)

0.jpg

1571828645751.jpg (38.35 KB, 下载次数: 65)

1571828645751.jpg

MCP4725驱动.7z

185.46 KB, 下载次数: 49

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:511461 发表于 2019-10-23 19:38 | 只看该作者
程序的话,我就看的网上的例程
回复

使用道具 举报

板凳
ID:401564 发表于 2019-10-24 14:03 | 只看该作者
MCP4725的器件地址并不是固定的,它是在出厂的时候设定的,在数据手册的后面有流明的
所以,你网上下载的程序代码有可能和你现在手头上的IC器件地址是不对应的
C我不会,STM32没用过
但原理是一样的,你可以在写完器件的8位数据的应答信号之后加一个标志位,并通过屏幕或者一个LED指示灯提示出来,如果没有提示,就表明器件的地址不对,或者是其它的问题
只要能确定4725可以正常应答了,那么器件的地址就是对的
回复

使用道具 举报

地板
ID:511461 发表于 2019-10-26 18:49 | 只看该作者
//使用快速模式写命令写DAC寄存器
void MCP4725_WriteData_Voltage(u16 Vout)   //电压单位mV
{
  u8 temp;
        u16 Dn;
        LED_Init();                                  //初始化与LED连接的硬件接口
        Dn = ( 4096 * Vout) / VREF_5V;
        temp = (0x0F00 & Dn) >> 8;  //12位数据
       
        IIC_Start();
        IIC_Send_Byte(0XC2);      //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 1;-> 1100 0010
  IIC_Wait_Ack();         
  IIC_Send_Byte(temp);        
  IIC_Wait_Ack();         
  IIC_Send_Byte(Dn);        //将低8位送到DAC寄存器
        IIC_Wait_Ack();       
        LED0=0;                 //   我用LED0的亮做了提示
  IIC_Stop();//产生一个停止条件         
        delay_ms(10);       
}
结果LED亮了,是不是代表我的IIC地址没错
回复

使用道具 举报

5#
ID:511461 发表于 2019-10-26 18:53 | 只看该作者
我这样做提示,没有问题吧,但我的程序现在还是不能用
回复

使用道具 举报

6#
ID:401564 发表于 2019-10-27 01:34 | 只看该作者
aaaaaa。 发表于 2019-10-26 18:53
我这样做提示,没有问题吧,但我的程序现在还是不能用

这不是第一步
首先,你要先看到MCP4725上面的丝印是什么,然后才能确定地址位是多少,并不是绝对的0xC2的,不同的丝印的器件地址位是不同的
看不清楚的话可以用放大镜或者手机拍下来看
先确定了器件地址再说
回复

使用道具 举报

7#
ID:630813 发表于 2019-10-27 10:58 | 只看该作者
怎么看丝印啊
回复

使用道具 举报

8#
ID:18297 发表于 2019-10-27 11:06 | 只看该作者
我认为你的MCP4725的A0脚应该接地或上拉,不应该悬空。
这样程序对了,输出结果才对。
回复

使用道具 举报

9#
ID:401564 发表于 2019-10-27 17:13 | 只看该作者
aaaaaa。 发表于 2019-10-26 18:53
我这样做提示,没有问题吧,但我的程序现在还是不能用

还有A0端口,要么上拉,要么接地,不能空着
最后,根据A0的高低电平和丝印来先确定器件的地址
回复

使用道具 举报

10#
ID:383537 发表于 2020-2-22 10:15 | 只看该作者
Y_G_G 发表于 2019-10-27 01:34
这不是第一步
首先,你要先看到MCP4725上面的丝印是什么,然后才能确定地址位是多少,并不是绝对的0xC2的, ...

感谢大佬提醒
回复

使用道具 举报

11#
ID:511461 发表于 2020-7-19 11:20 | 只看该作者
谢谢大佬们指点
回复

使用道具 举报

12#
ID:143694 发表于 2020-11-7 22:05 | 只看该作者
我的调通了,地址是0xC0,
说来也不容易啊,卖家给的地址是 0x60 或0x61,怎么试验都不行,
后来我自动累加地址试验串口输出观察地址和示波器上的电压
(最后需要注意的是 两个地方需要改地址)
回复

使用道具 举报

13#
ID:848585 发表于 2021-7-26 15:22 | 只看该作者
张小帅1126 发表于 2020-11-7 22:05
我的调通了,地址是0xC0,
说来也不容易啊,卖家给的地址是 0x60 或0x61,怎么试验都不行,
后来我自动累 ...

那两个地方啊
回复

使用道具 举报

14#
ID:401564 发表于 2021-7-26 20:34 | 只看该作者

两年了,又看到这个帖子了,在数据手册的27页面和43页面有说明:高位是1100,A2,A1的值要看你手头上芯片的丝印,A0就是芯片的A0引脚电平,一定要接VCC或者GND,不能悬空


回复

使用道具 举报

15#
ID:491875 发表于 2023-8-10 12:48 | 只看该作者
Y_G_G 发表于 2021-7-26 20:34
两年了,又看到这个帖子了,在数据手册的27页面和43页面有说明:高位是1100,A2,A1的值要看你手头上芯片的丝 ...

这个已经很贴切的说明了地址(A2,A1),丝印AJ对应A0(00),AP对应A1(01),AQ对应A2(10),AR对应A3(11),A0的地址由用户自己设定0(接地)或者1(通过10k左右电阻接VDD)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表