亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 466|回復: 5
收起左側

MCP4725(DAC)輸出電壓不變

[復制鏈接]
ID:322939 發表于 2026-4-21 10:30 | 顯示全部樓層 |閱讀模式
最近用一款MCP4725(DAC)芯片去控制DC-DC輸出電壓范圍,因為用PWM去控制和DC-DC輸出電壓不匹配,調參數太復雜了,改用DA芯片去控制,目前這芯片輸出電壓約1.63V不變,A0地址也換過還是不行,不知那位大佬用過?指點下。謝謝!
  1. #ifndef __MCP4725_H__
  2. #define __MCP4725_H__

  3. #include "STC8H.H"


  4. #define MCP4725_ADDR_W  0xC0  // A0接地 -> 0xC0; A0接VCC -> 0xC2
  5. #define VREF_MV         5000  // 參考電壓(mV),通常為VDD=5V

  6. // 引腳定義
  7. sbit I2C_SCL = P2^1;
  8. sbit I2C_SDA = P2^0;

  9. // 函數聲明
  10. void MCP4725_Init(void);
  11. void MCP4725_WriteVoltage(u16 voltage_mv);    // 電壓值,單位mV
  12. void MCP4725_WriteDigital(u16 dac_code);      // 直接寫入12位DAC碼

  13. #endif
  14. 2. 源文件 mcp4725.c
  15. c
  16. #include "mcp4725.h"
  17. #include "intrins.h"

  18. // 微秒延時函數,適用于24MHz主頻
  19. void delay_us(unsigned char us) {
  20.     unsigned char i, j;
  21.     do {
  22.         i = 2;
  23.         j = 3;
  24.         do {
  25.             while (--j);
  26.         } while (--i);
  27.     } while (--us);
  28. }

  29. // 設置SDA為輸入模式 (釋放總線,準備讀取)
  30. void SDA_IN(void) {
  31.     P2M1 |= 0x01;   // P2.0 設置為輸入模式 (M1=1, M0=0)
  32.     P2M0 &= ~0x01;
  33. }

  34. // 設置SDA為開漏輸出模式 (可輸出低電平或釋放總線由外部上拉至高電平)
  35. void SDA_OUT(void) {
  36.     P2M1 &= ~0x01;  // P2.0 設置為開漏輸出 (M1=0, M0=1)
  37.     P2M0 |= 0x01;
  38.     I2C_SDA = 1;    // 先釋放總線
  39. }

  40. // I2C初始化 (設置SCL為開漏輸出,SDA初始為開漏輸出)
  41. void IIC_Init(void) {
  42.     // SCL: P2.1 開漏輸出
  43.     P2M1 &= ~0x02;
  44.     P2M0 |= 0x02;
  45.     // SDA: P2.0 開漏輸出
  46.     SDA_OUT();
  47.     I2C_SCL = 1;
  48.     I2C_SDA = 1;
  49. }

  50. // 產生起始信號
  51. void IIC_Start(void) {
  52.     SDA_OUT();
  53.     I2C_SDA = 1;
  54.     I2C_SCL = 1;
  55.     delay_us(5);
  56.     I2C_SDA = 0;
  57.     delay_us(5);
  58.     I2C_SCL = 0;
  59.     delay_us(5);
  60. }

  61. // 產生停止信號
  62. void IIC_Stop(void) {
  63.     SDA_OUT();
  64.     I2C_SCL = 0;
  65.     I2C_SDA = 0;
  66.     delay_us(5);
  67.     I2C_SCL = 1;
  68.     delay_us(5);
  69.     I2C_SDA = 1;
  70.     delay_us(5);
  71. }

  72. // 等待從機應答
  73. // 返回值: 0-應答成功, 1-應答失敗
  74. bit IIC_Wait_Ack(void) {
  75.     unsigned char errTime = 0;
  76.     SDA_IN();           // 釋放SDA,準備讀取
  77.     I2C_SDA = 1;        // 先拉高總線(輸入模式下寫1無效,但保持兼容)
  78.     delay_us(2);
  79.     I2C_SCL = 1;
  80.     delay_us(2);
  81.     while (I2C_SDA) {   // 等待從機拉低SDA
  82.         errTime++;
  83.         if (errTime > 250) {
  84.             IIC_Stop();
  85.             return 1;
  86.         }
  87.     }
  88.     I2C_SCL = 0;
  89.     delay_us(2);
  90.     return 0;
  91. }

  92. // 發送一個字節,并返回應答狀態
  93. // 返回值: 0-應答成功, 1-應答失敗
  94. bit IIC_SendByte(unsigned char dat) {
  95.     unsigned char i;
  96.     SDA_OUT();
  97.     I2C_SCL = 0;
  98.     for (i = 0; i < 8; i++) {
  99.         I2C_SDA = (dat & 0x80) ? 1 : 0;
  100.         dat <<= 1;
  101.         delay_us(5);
  102.         I2C_SCL = 1;
  103.         delay_us(5);
  104.         I2C_SCL = 0;
  105.         delay_us(5);
  106.     }
  107.     return IIC_Wait_Ack();  // 等待應答并返回結果
  108. }

  109. // 讀取一個字節,并決定是否發送ACK
  110. unsigned char IIC_ReadByte(bit ack) {
  111.     unsigned char i, receive = 0;
  112.     SDA_IN();
  113.     for (i = 0; i < 8; i++) {
  114.         I2C_SCL = 0;
  115.         delay_us(5);
  116.         I2C_SCL = 1;
  117.         delay_us(5);
  118.         receive <<= 1;
  119.         if (I2C_SDA) receive++;
  120.     }
  121.     // 發送應答或非應答
  122.     SDA_OUT();
  123.     I2C_SCL = 0;
  124.     delay_us(5);
  125.     I2C_SDA = ack ? 0 : 1;   // ack=1: 發送ACK(拉低); ack=0: 發送NACK(拉高)
  126.     delay_us(5);
  127.     I2C_SCL = 1;
  128.     delay_us(5);
  129.     I2C_SCL = 0;
  130.     I2C_SDA = 1;            // 釋放總線
  131.     return receive;
  132. }

  133. // MCP4725初始化
  134. void MCP4725_Init(void) {
  135.     IIC_Init();
  136. }

  137. // 寫入電壓值 (單位: mV)
  138. void MCP4725_WriteVoltage(u16 voltage_mv) {
  139.     u16 dac_code;
  140.     u8 high_byte;
  141.    
  142.     // 限制電壓范圍
  143.     if (voltage_mv > VREF_MV) voltage_mv = VREF_MV;
  144.    
  145.     // 計算DAC碼 (MCP4725輸出與碼值成正比)
  146.     dac_code = (u16)(4095L * voltage_mv / VREF_MV);
  147.    
  148.     // 準備快速寫入模式的高字節 (命令字: 0x50 | 高4位數據)
  149.     high_byte = 0x50 | ((dac_code >> 8) & 0x0F);
  150.    
  151.     IIC_Start();
  152.     if (IIC_SendByte(MCP4725_ADDR_W)) {   // 地址無應答,退出
  153.         IIC_Stop();
  154.         return;
  155.     }
  156.     if (IIC_SendByte(high_byte)) {        // 高字節無應答
  157.         IIC_Stop();
  158.         return;
  159.     }
  160.     if (IIC_SendByte(dac_code & 0xFF)) {  // 低字節無應答
  161.         IIC_Stop();
  162.         return;
  163.     }
  164.     IIC_Stop();
  165. }

  166. // 直接寫入12位DAC碼
  167. void MCP4725_WriteDigital(u16 dac_code) {
  168.     u8 high_byte;
  169.     if (dac_code > 4095) dac_code = 4095;
  170.    
  171.     high_byte = 0x50 | ((dac_code >> 8) & 0x0F);
  172.    
  173.     IIC_Start();
  174.     if (IIC_SendByte(MCP4725_ADDR_W)) {
  175.         IIC_Stop();
  176.         return;
  177.     }
  178.     if (IIC_SendByte(high_byte)) {
  179.         IIC_Stop();
  180.         return;
  181.     }
  182.     if (IIC_SendByte(dac_code & 0xFF)) {
  183.         IIC_Stop();
  184.         return;
  185.     }
  186.     IIC_Stop();
  187. }
  188. ________________________________________

  189. #include "mcp4725.h"

  190. void main(void) {
  191.     // 系統初始化...
  192.     MCP4725_Init();
  193.    
  194.     while(1) {
  195.         MCP4725_WriteVoltage(2500);  // 輸出2.5V
  196.         delay_ms(2000);
  197.         MCP4725_WriteVoltage(5000);  // 輸出5.0V
  198.         delay_ms(2000);
  199.     }
  200. }


復制代碼


回復

使用道具 舉報

ID:401564 發表于 2026-4-21 11:32 | 顯示全部樓層
先用放大鏡看一下這個芯片的絲印,再根據絲印去更改從機地址,它的從機地址并不是固定的,規格書中有說明的
回復

使用道具 舉報

ID:322939 發表于 2026-4-21 11:53 | 顯示全部樓層
芯片絲印是AJAH,地址:有的是0xC0,有的是0x60,也試過都不行
回復

使用道具 舉報

ID:401564 發表于 2026-4-21 15:34 | 顯示全部樓層
那沒辦法了,只能一步一步的驗證了,你可以把延時改成1秒的,然后每個時鐘加一個閃燈的代碼
然后8個時鐘后,驗證從機有沒有應答,應答里面用死循環,沒有應答就是從機的問題,一步一步排查你也可以參考我這個5年前寫的,4725可以支持高速IIC,對延時要求不高
MCP4725.rar (1.25 KB, 下載次數: 0)

回復

使用道具 舉報

ID:322939 發表于 2026-4-21 16:55 | 顯示全部樓層
Y_G_G 發表于 2026-4-21 15:34
那沒辦法了,只能一步一步的驗證了,你可以把延時改成1秒的,然后每個時鐘加一個閃燈的代碼
然后8個時鐘后,驗 ...

多謝了!已經弄好了
回復

使用道具 舉報

ID:190832 發表于 2026-4-23 08:42 | 顯示全部樓層
LAW1100 發表于 2026-4-21 16:55
多謝了!已經弄好了

結貼了請說一下怎么解決的,不要自己一句解決了就不管了,別人不是也回復幫助你了嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表