精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用裝有DS3900的PC與DS1267、DS1867和DS1868通信

星星科技指導員 ? 來源:ADI ? 作者:ADI ? 2023-02-25 11:06 ? 次閱讀

本應用筆記介紹如何使用DS3900 PC串口轉3線接口與DS1267、DS1867和DS1868三個數字電位器通信,DS3900、DS3223和DS232使用該移位寄存器接口進行編程。DS3是一個模塊,具有MAX3900 RS-<>收發器和一個微處理器,微處理器充當PC串行端口與被控制的<>線器件之間的接口。收發器允許模塊的微處理器與PC通信,微處理器通過其并行端口實現命令結構,以允許PC讀取或寫入三個數字電位計。應用筆記描述了DS<>以及如何將其連接到被測器件。本文中描述的源代碼可在達拉斯半導體的FTP站點上找到。

介紹

DS1267、DS1867和DS1868均為數字電位器,采用獨特的3線協議,很難與PC接口。本應用筆記提供了一個簡單的硬件/軟件解決方案,用于生成用于調整電位器設置的PC接口,以及用于讀取和寫入這些器件的示例C++算法。圖1所示軟件及其源代碼可在ADI網站上找到。

poYBAGP5eymAKmW6AAA4QkGu8DU447.gif

圖1.ADI公司的3線評估軟件(DS3線.exe)。

硬件

為該應用生成的硬件利用DS3900與IC通信。DS3900是具有MAX3223 RS232收發器和微處理器的模塊。收發器允許模塊的微處理器與PC通信,微處理器實現命令結構,允許PC讀取或寫入模塊上的任何I / O引腳。除DS3900和3線IC外,還應使用去耦電容來降低V上的噪聲。抄送由DS3900和電位器的數字接口引起。圖2所示為使用DS3和DS3900Wire應用與3線器件通信所需的連接。

pYYBAGP5eyqAJcx5AABTlPdBzPo070.gif

圖2.DS3Wire應用原理圖

軟件

圖 1 所示的軟件有三個主要例程;初始化DS3900和對話框(OnInitDialog),讀取17位寄存器(OnRead),寫入17位寄存器(OnWrite)。這些例程是使用名為“CdsPic”的C++類實現的。CdsPic包含子程序,允許使用預先編寫和測試的RS232/DS3900代碼來創建3線算法。DS3Wire應用中CdsPic類的實例稱為“DS3900”。CdsPic類和RS232功能可在ADI網站上找到,任何感興趣的人都可以使用。對于那些對DS3900實現的細節不感興趣的人,函數名稱足夠通用,可以被視為偽代碼。表 1 中列出了一些示例函數名稱及其說明,以供參考。

描述
DS3900.主板禮物() 如果在CdsPic類初始化代碼期間檢測到DS3900,則返回TRUE;如果未檢測到DS3900,則返回FALSE。
DS3900.寫入 1(真) 引腳P1設置為輸出并強制其高電平。如果在通信過程中未檢測到錯誤,則返回 TRUE。
DS3900.寫1(假) 引腳P1設置為輸出并強制其低電平。如果在通信過程中未檢測到錯誤,則返回 TRUE。
DS3900.讀取 1(狀態) 引腳 P1 設置為輸入、讀取,P1 的輸入電平返回到布爾變量“狀態”。如果在通信過程中未檢測到錯誤,則返回 TRUE。
DS3900讀取4(狀態) 引腳 P4 設置為輸入、讀取,P4 的輸入電平返回到布爾變量“狀態”。如果在通信過程中未檢測到錯誤,則返回 TRUE。

3線基礎知識

如果將這個特定版本的3線接口視為具有兩個控制信號時鐘(CLK)和移位使能(“/RST”)以及兩個數據信號(數據輸入(DQ)和數據輸出(C外).當“/RST”為高電平時,接口未復位;因此,移位寄存器已啟用。當“/RST”為高電平時,CLK上收到的任何正邊沿都將導致移位寄存器將所有數據移位一個位置,將DQ的現值移動到第一個位置。這種轉變也會改變C的值外,始終顯示寄存器中第 17 位的當前值。一旦所有17位數據移入器件,復位信號就會調低,這將把新設置傳輸到控制電位計位置并禁用3線接口的寄存器。

該 C外PIN旨在提供在同一條3線總線上將多個3線器件級聯在一起的能力,但它確實提供了對移位寄存器的讀取訪問。通過使能接口(將“/RST”設置為高電平)并將移位寄存器中的17位時鐘設置為C來執行讀取外一次可以讀取一位。當“/RST”被停用時,移位寄存器中的值將是DQ在讀取周期內寫入器件的值,因為數據在移出時被移入器件。這需要將 DQ 重寫為 C 的當前值外在每個時鐘脈沖啟動之前,否則讀取操作將是破壞性的。破壞性讀取操作將導致電位計在停用“/RST”時改變位置。

此接口有兩個主要問題需要避免:

部分寫入(移位小于 17 位)將產生移位寄存器垃圾,這是先前數據和新數據的產物。因此,如果不寫入所有17位,就不可能改變一個電阻的值。

讀取功能具有破壞性,除非移出移位寄存器的數據輪換回移位寄存器。

第一個問題很容易解決,不要執行部分寫入。第二個問題可以解決兩個 不同的方式。數據手冊顯示了使用反饋電阻(10kΩ)自動寫入C值外到 DQ,除非 DQ 在寫入周期內由輸出驅動。雖然這可以用DS3900實現,但設計是用C語言實現的。外驅動單獨的輸入引腳。這演示了在無法使用反饋電阻時如何實現接口。微處理器(在本例中為DS3900)必須在固件/軟件中執行反饋電阻的功能。在 C 上讀取值時外,它將在3線器件時鐘之前寫入DQ。

無法使用反饋電阻的最常見情況是將3線器件連接至集電極開路I/O端口。集電極開路I/O引腳將具有一個上拉電阻,以輸出高電壓電平。該電阻將與反饋電阻爭用。如果反饋電阻小于上拉電阻,則C外將始終寫入 DQ,包括在寫入周期期間,當目的是將新值寫入設備時。如果反饋電阻大于上拉電阻,則在讀取期間DQ將始終為高電平。

OnInitDialog

OnInitDialog是Windows調用的用于初始化對話框的函數。如果使用 Microsoft Developer Studio 生成對話框,則其中一個對話框構造選項會在代碼中為程序員留下注釋。這將在此函數的末尾留下一個“TODO”注釋,說明在此處放置額外的初始化代碼。

本例中添加了以下代碼,以確保DS3900正確上電,將CLK和“/RST”設置為低電平,并使用電位器的當前位置初始化編輯框。如果未檢測到DS3900,則會顯示一條錯誤消息通知用戶。

      // TODO: Add extra initialization here <-Developer Studio Comments
      if(DS3900.BoardPresent()) // <- BoardPresent() checks for DS3900
      {                                                              // <-If found path
             m_sEDIT_Status= "DS3900 Found!";                        // new status message, all systems go
             DS3900.Write1(false);                                   // initialize clock
             DS3900.Write2(false);                                   // initialize reset
             OnRead();                                               // read pots and update edit boxes
      }
      else
      {                                                              // <-If not found path
             m_sEDIT_Status = "DS3900 not found!@#$";                // new status message, error detect
             UpdateData(FALSE);                                      // Update Dialog Values
             MessageBox("DS3900 Not Found
Check Power and Serial Cable
Restart
                           Applicaion","DS3900 Error");
      }

圖3.向 OnInitDialog 函數添加了額外的初始化代碼

讀取時

OnRead 函數讀取 17 位移位寄存器。它在按下讀取按鈕時和 OnInitDialog 期間執行。該算法假設 C外引腳連接到單獨的DS3900輸入,如圖2所示。這需要軟件寫入在 C 上讀取的值外在3線器件時鐘之前到DQ,或者在讀取操作期間無意中調整電位計。圖 4 顯示了應用程序使用的算法。除了讀取 17 位之外,它還將數據重建為表示 Pot0、Pot1 和堆棧選擇位的變量,并使用 UpdateData(FALSE) 函數更新對話框。每次從PC到DS3900的傳輸都會被監控錯誤,任何對通信的干擾都將導致交易終止并顯示錯誤信息。如果未發生錯誤,則會向狀態框寫入“讀取成功”消息。此功能大約需要 95 毫秒才能執行,但結果可能會因所用 PC 的速度而異。

void OnRead()
{
      //Variables used by subroutine
      int success;
      bool bit;
      unsigned char mask=0x80;
      unsigned char pot0=0;
      unsigned char pot1=0;

      if(DS3900.BoardPresent())                               // Only Read if DS3900 found
      {
             success = DS3900.Write2(true);                   // Pull reset high
             if(success)                                      // Abort Read if comm fail.
             {
                    success += DS3900.Read5(bit);             // Read Cout (stack bit first)
                    success += DS3900.Write4(bit);            // Copy Read Contents to DQ
                    success += DS3900.Write1(true);           // Clock bit
                    success += DS3900.Write1(false);          // Clock bit
                    m_RADIO_Stack = bit;                      // <-Update Dialog Box Variable
                    if(success == 5)                          // Abort Read if comm fail.
                    {
                           for(int x = 0; x <8 ; x++)         // Pot 1 Read Loop
                           {
                                  success += DS3900.Read5(bit);      // Read Cout (stack bit first)
                                  success += DS3900.Write4(bit);     // Copy Read Contents to DQ
                                  success += DS3900.Write1(true);    // Clock bit
                                  success += DS3900.Write1(false);   // Clock bit
                                  if(bit)                            // If bit set, set bit in Pot variable
                                         pot1 |= mask;
                                  mask = mask >> 1;                  // Adjust Mask for next pass
                           }
                           m_ucEDIT_Pot1 = pot1;                     // <-Update Dialog Box Variable
                           mask=0x80;                                // Reset Mask
                           for(int y = 0; y <8 ; y++)                // Pot 0 Read Loop
                           {
                                  success += DS3900.Read5(bit);      // Read Cout (stack bit first)
                                  success += DS3900.Write4(bit);     // Copy Read Contents to DQ
                                  success += DS3900.Write1(true);    // Clock bit
                                  success += DS3900.Write1(false);   // Clock bit
                                  if(bit)                            // If bit set, set bit in Pot variable
                                         pot0 |= mask;
                                  mask = mask >> 1;                  // Adjust Mask for next pass
                           }
                           m_ucEDIT_Pot0 = pot0;                     // <-Update Dialog Box Variable
                    }
             }
             success += DS3900.Write2(false);                 // Pull reset low
             if(success == 70)                                // Determine if comm has failed

                    m_sEDIT_Status = "Successful Read";       // Success Message
             else
                    m_sEDIT_Status = "Read Failed";           // Fail Message
      }
      UpdateData(FALSE);                                      // <-Triggers Dialog Box Update
}

圖4.讀取功能

請注意,讀取算法的最后一個 if 語句更新對話框的狀態消息。如果DS3900初始化成功,則在顯示對話框之前,將用“成功讀取”覆蓋初始化的“找到DS3900!”消息。

寫入時

OnWrite 函數讀取用戶在對話框中鍵入的值,并將其寫入 3 線器件。若要讀取對話框值,將調用 UpdateData(TRUE) 函數。除了讀取數據外,UpdateData(TRUE) 還將 ASCII 字符串轉換為電位計寄存器的無符號字符,以及堆棧選擇位單選按鈕的整數值。這些值自動存儲在m_ucEDIT_Pot0、m_ucEDIT_Pot1和m_RADIO_Stack變量中。讀取新的所需設置后,寫入算法指示DS3900一次發送一位17位數據。

在寫入過程中,與DS3900的通信被監測錯誤,“成功”變量保持成功數據傳輸次數的運行總數。如果DS3900的每次讀/寫操作都成功,程序將更新狀態框,使其顯示為“寫入成功”;否則,它將中止命令并返回錯誤消息。該函數執行大約需要 70 毫秒,如圖 5 所示。

void OnWrite()
{
      UpdateData(TRUE);                                       //Read values of Dialog Box
      //variables used by subroutine
      int success;
      unsigned char mask = 0x80;
      unsigned char pot0 = m_ucEDIT_Pot0;
      unsigned char pot1 = m_ucEDIT_Pot1;
      bool bit = false;

      if(m_RADIO_Stack)                                       // place stack select bit into "bit" variable.
      bit = true;

      if(DS3900.BoardPresent())                               // Only Write if DS3900 Found
      {
             success = DS3900.Write2(true);                   // Pull reset high

             if(success)                                      // Write abortion if comm. fail
             {
                    success += DS3900.Write4(bit);            // write stack select bit
                    success += DS3900.Write1(true);           // Clock bit
                    success += DS3900.Write1(false);          // Clock bit

                    if(success == 4)                          // Write abortion if comm. fail
                    {
                           for(int x = 0; x <8 ; x++)         // Loop for 8 bits of pot 1
                           {
                                  if(pot1 & mask)             // Read next DQ value with mask
                                         success += DS3900.Write4(true);
                                  else
                                         success += DS3900.Write4(false);
                                  success += DS3900.Write1(true);    // Clock bit
                                  success += DS3900.Write1(false);   // Clock bit
                                  mask = mask >> 1;                  // Adjust mask to next position
                           }

                           mask = 0x80;                       // Reset mask
                           for(int y = 0; y <8 ; y++)         // Loop for 8 bits of pot 0
                           {
                                  if(pot0 & mask)             // Read next DQ value with mask
                                         success += DS3900.Write4(true);
                                  else
                                         success += DS3900.Write4(false);
                                  success += DS3900.Write1(true);    // Clock bit
                                  success += DS3900.Write1(false);   // Clock bit
                                  mask = mask >> 1;                  // Adjust mask to next position.
                           }
                    }
             }
             success += DS3900.Write2(false);                 // Pull reset low
      }
      if(success == 53)                                       // Comm. Pass/Fail notification.

             m_sEDIT_Status = "Successful Write";             // Pass Message
      else
             m_sEDIT_Status = "Write Failed";                 // Fail Message
      UpdateData(FALSE);                                      // <-Trigger Dialog Update
}

圖5.寫入函數

結論

本應用筆記提供了一種簡單的C++算法,用于使用DS3對包含17位移位寄存器的3900線器件進行讀寫。寫入操作大約需要 70ms,不使用反饋電阻的讀取操作大約需要 95ms 才能執行。雖然相對于3線接口的最大數據速率而言,這并不快,但足以評估電位計。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 收發器
    +關注

    關注

    10

    文章

    3397

    瀏覽量

    105864
  • 寄存器
    +關注

    關注

    31

    文章

    5317

    瀏覽量

    120013
  • 電位器
    +關注

    關注

    14

    文章

    1005

    瀏覽量

    66725
收藏 人收藏

    評論

    相關推薦

    DS1267 pdf datasheet (Dual Dig

    The DS1267 has two 256-position potentiometers, with wiper positions each set by stored 8-bit
    發表于 10-04 20:20 ?24次下載

    DS1868 雙路、數字電位器芯片

    DS1868 雙路、數字電位器芯片 The DS1868 has two 256-position potentiometers, with wiper positions each set
    發表于 10-04 20:11 ?2151次閱讀
    <b class='flag-5'>DS1868</b> 雙路、數字電位器芯片

    DS1267 雙路、±5V、數字電位器芯片

    DS1267 雙路、±5V、數字電位器芯片 The DS1267 has two 256-position potentiometers, with wiper positions each
    發表于 10-04 20:24 ?1322次閱讀
    <b class='flag-5'>DS1267</b> 雙路、±5V、數字電位器芯片

    運用LabView控制DS3900串口通信模塊

    運用LabView控制DS3900串口通信模塊 本篇應用筆記討論了DS3900串口通信模塊和LabView的使用問題,LabView是適用于嵌入式應用的圖形化界面開發平臺。本文可作為
    發表于 01-06 13:52 ?1157次閱讀
    運用LabView控制<b class='flag-5'>DS3900</b>串口<b class='flag-5'>通信</b>模塊

    運用LabView控制DS3900串口通信模塊

    摘要:本篇應用筆記討論了DS3900串口通信模塊和LabView的使用問題,LabView是適用于嵌入式應用的圖形化界面開發平臺。本文可作為面向DS3900的LabView界面用戶指南。
    發表于 04-28 11:38 ?778次閱讀
    運用LabView控制<b class='flag-5'>DS3900</b>串口<b class='flag-5'>通信</b>模塊

    Using a PC with a DS3900 to Co

    to communicate with the three digital pots, the DS1267, DS1867, and DS1868, which use this shift register interfa
    發表于 04-28 11:50 ?886次閱讀
    Using a <b class='flag-5'>PC</b> with a <b class='flag-5'>DS3900</b> to Co

    Interfacing a DS1868 3-Wire De

    Abstract: The DS1868 uses a dual digital potentiometer with a 3-wire (shift register) interface.
    發表于 04-28 11:57 ?789次閱讀
    Interfacing a <b class='flag-5'>DS1868</b> 3-Wire De

    DS1867 Power Supply Conditioni

    DS1867 Pow
    發表于 04-28 12:03 ?832次閱讀
    <b class='flag-5'>DS1867</b> Power Supply Conditioni

    運用LabView控制DS3900串口通信模塊

    摘要:本篇應用筆記討論了DS3900串口通信模塊和LabView的使用問題,LabView是適用于嵌入式應用的圖形化界面開發平臺。本文可作為面向DS3900的LabView界面用戶指南。
    發表于 05-07 11:30 ?553次閱讀
    運用LabView控制<b class='flag-5'>DS3900</b>串口<b class='flag-5'>通信</b>模塊

    Using a PC with a DS3900 to Co

    to communicate with the three digital pots, the DS1267, DS1867, and DS1868, which use this shift register interfa
    發表于 05-08 09:09 ?790次閱讀
    Using a <b class='flag-5'>PC</b> with a <b class='flag-5'>DS3900</b> to Co

    數字電位器DS126的結構和工作原理及DS1267在電橋自動平衡的應用說明

    DS1267是DALLAS公司生產的256 結點雙數字電位器,它具有三種串行接口且功耗很低,很容易與單片機接口,文中介紹了數字電位器DS1267的結構和工作原理,同時給出了DS1267在瞬態應變波形存貯器中的應用線路和軟件流程圖
    發表于 11-20 17:48 ?13次下載
    數字電位器<b class='flag-5'>DS</b>126的結構和工作原理及<b class='flag-5'>DS1267</b>在電橋自動平衡的應用說明

    數字電位器DS1267中文資料及應用

    DS1267是DALLAS公司生產的256結點雙數字電位器,它具有三種串行接口且功耗很低,很容易與單片機接口,文中介紹了數字電位器DS1267的結構和工作原理,同時給出了DS1267在瞬態應變波形存貯器中的應用線路和軟件流程圖。
    發表于 04-14 10:40 ?13次下載

    使用帶 DS3900PCDS1267DS1867DS1868 通信

    發表于 11-18 23:45 ?0次下載
    使用帶 <b class='flag-5'>DS3900</b> 的 <b class='flag-5'>PC</b> 與 <b class='flag-5'>DS1267</b>、<b class='flag-5'>DS1867</b> 和 <b class='flag-5'>DS1868</b> <b class='flag-5'>通信</b>

    使用DS3900評估I2C兼容器件是否成功實現雙向通信

    DS3900用于評估I2C兼容元件,利用PC的串行端口與2線器件進行快速的雙向通信。圖1所示為在DS3900和I2C兼容器件之間建立通信的推
    的頭像 發表于 01-10 10:43 ?748次閱讀
    使用<b class='flag-5'>DS3900</b>評估I2C兼容器件是否成功實現雙向<b class='flag-5'>通信</b>

    使用多個DS1267數字電位器和8051微處理器產生3線信號

    本應用筆記概述了通過公共總線與多個DS1267通信的不同配置。它還提供與兩個以菊花鏈形式串聯在一起的DS1267通信所需的硬件和軟件。
    的頭像 發表于 02-20 10:23 ?1165次閱讀
    使用多個<b class='flag-5'>DS1267</b>數字電位器和8051微處理器產生3線信號