一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AD527x系列數(shù)字電位器的驅(qū)動設(shè)計與實現(xiàn)

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-09 16:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在一些時候我們需要使用精度更高的數(shù)字電位器來實現(xiàn)我們的應(yīng)用。我們經(jīng)常使用AD527x系列數(shù)字電位器來實現(xiàn)這類應(yīng)用。在通常情況下,AD527x系列數(shù)字電位器完全能夠滿足要求。為了減少重復(fù)工作,在這里我們將分系并實現(xiàn)AD527x系列數(shù)字電位器的驅(qū)動。

1、功能概述

我們在這里討論的AD527x系列數(shù)字電位器包括:AD5270、AD5271、AD5272和AD5724,他們的功能是相同的,主要在數(shù)字位或通訊接口上有寫差別。

Dingtalk_20221206154648.jpg

AD527x系列數(shù)字電位器集業(yè)界領(lǐng)先的可變電阻性能與非易失性存儲器(NVM)于一體,這些器件的端到端電阻容差誤差小于1%,并提供50次可編程(50-TP)存儲器。將電阻值編程寫入50-TP存儲器之前,可進(jìn)行無限次調(diào)整。這些器件不需要任何外部電壓源來幫助熔斷熔絲,并提供50次永久編程的機(jī)會。在50-TP激活期間,一個永久熔斷熔絲指令會將游標(biāo)位置固定

對于AD527x系列數(shù)字電位器,皆有一個16位寬的移位寄存器,一切對AD527x系列數(shù)字電位器的操作都是同過這個以為寄存器完成的。移位寄存器的格式如下所示。

Dingtalk_20221206154648.jpg

該16位移位寄存器由兩個應(yīng)設(shè)為0的未用位、四個控制位和10個RDAC數(shù)據(jù)位組成,并且數(shù)據(jù)以MSB優(yōu)先方式加載。對于AD5271和AD5274只有8位數(shù)據(jù),則最后兩位會被忽略。四個控制位決定軟件命令的功能,具體的功能碼如下所示:

Dingtalk_20221206154648.jpg

我們對AD527x系列數(shù)字電位器的操作就是以這10個命令為基礎(chǔ)的,事實上NOP命令是可以忽略的,因為它不會有任何操作發(fā)生。其中有命令5和命令7需要說一下。

命令7則用于設(shè)置控制寄存器。控制寄存器僅后4為有效。C0用于設(shè)置50-TP的編程使能。C1用于設(shè)置RDAC的寫保護(hù)。C2用于電阻容差校準(zhǔn)。C3則是指示50-TP的編程狀態(tài)。具體結(jié)構(gòu)如下:

Dingtalk_20221206154648.jpg

Dingtalk_20221206154648.jpg

而命令5用于設(shè)置讀出的50-TP的內(nèi)容。就是說這條命令用于設(shè)置我下次讀取50-TP時究竟是那一條的類容,因為總共有50條。具體的取值如下:

Dingtalk_20221206154648.jpg

共50條需要50個編碼,使用了D0到DF5位,編號1開始一一對應(yīng)50個編程位置。

2、驅(qū)動設(shè)計與實現(xiàn)

我們已經(jīng)了解了AD527x系列數(shù)字電位器的基本情況,接下來我們就設(shè)計并實現(xiàn)AD527x系列數(shù)字電位器的驅(qū)動。

2.1、對象定義

同樣的我們將基于對象操作的思想來設(shè)計AD527x系列數(shù)字電位器的驅(qū)動。既如此,我們首先必須要定義AD527x系列數(shù)字電位器對象。

2.1.1、抽象對象類型

在抽象出AD527x系列數(shù)字電位器對象類型之前,我們先來分析一下AD527x系列數(shù)字電位器。一個對象最起碼包含屬性和操作兩個特性,我們來分析一下AD527x系列數(shù)字電位器對象包含有那些屬性和操作。

對于AD527x系列數(shù)字電位器包含有多種器件,不同的器件在通訊接口和檔位等方面會有差別,所以我們將設(shè)備的類型作為其屬性以分辯究竟是哪種器件,進(jìn)而分辨接口和檔位差異。游標(biāo)的當(dāng)前位置以及控制寄存器的值我們也將其設(shè)置為屬性以確定設(shè)備當(dāng)前的狀態(tài)。當(dāng)設(shè)備時I2C接口時,需要有一個設(shè)備地址,所以我們將設(shè)備地址設(shè)置為屬性,這個屬性只在I2C接口模式時才起作用。而在使用SPI接口的器件時,需要一個片選信號,所以我們將操作片選信號作為AD527x系列數(shù)字電位器的一個操作,這個操作只在使用SPI接口的器件時才起作用。此外,AD527x系列數(shù)字電位器對象還需要實現(xiàn)數(shù)據(jù)的發(fā)送與接收以及操作過程中必要的延時函數(shù),我們均將其作為對象的操作。據(jù)上述分析我們可以抽象出AD527x系列數(shù)字電位器對象類型如下:

/*定義用于SPI接口的對象類型*/
typedef struct AD527xObject {
  AD527xType type;//設(shè)備類型
  uint8_t devAddress;//設(shè)備地址,用于I2C接口
  uint8_t conreg;//控制寄存器
  uint16_t rdac;//游標(biāo)寄存器現(xiàn)值
  void (*ChipSelcet)(AD527xCSType en);//片選信號,用于SPI接口
  void (*Receive)(struct AD527xObject *rx,uint8_t *rData,uint16_t rSize);
  void (*Transmit)(struct AD527xObject *rx,uint8_t *wData,uint16_t wSize);
  void (*Delayms)(volatile uint32_t nTime);       //ms延時操作指針
}AD527xObjectType;

2.1.2、對象的初始化

一個對象我們需要對其初始化才能使用,初始化函數(shù)至少包含有2方面內(nèi)容:一是為對象變量賦必要的初值;二是檢查這些初值是否是有效的。特別是一些操作指針錯誤的話可能產(chǎn)生嚴(yán)重的后果?;谶@一原則,我們設(shè)計AD527x系列數(shù)字電位器的對象初始化函數(shù)如下:

/* 初始化AD527x對象,I2C接口必須初始化devAddress,SPI接口必需初始化void (*ChipSelcet)(bool) */
void AD527xInitialization(AD527xObjectType *rx,
                          uint8_t address,
                          AD527xType type,
                          AD527xReceive recieve,
                          AD527xTransmit transmit,
                          AD527xChipSelcet cs,
                          AD527xDelayms delayms)
{
  if((rx==NULL)||(recieve==NULL)||(transmit==NULL)||(delayms==NULL))
  {
  return;
  }


  if((type==AD5270)||(type==AD5271))//使用SPI接口
  {
    if(cs==NULL)//硬件電路實現(xiàn)片選
    {
      rx->ChipSelcet=DefaultChipSelcet;
    }
    else
    {
      rx->ChipSelcet=cs;
    }
    rx->devAddress=0x00;
  }
  else//使用I2C接口
  {
    if((address==0x58)||(address==0x5C)||(address==0x5E))
    {
      rx->devAddress=address;
    }
    else if((address==0x2C)||(address==0x2E)||(address==0x2F))
    {
      rx->devAddress=(address<<1);
    }
    else
    {
      rx->devAddress=0x00;
    }


    rx->ChipSelcet=NULL;
  }
  
  rx->type=type;


  rx->conreg=0x00;
  rx->rdac=0x0000;


  rx->Receive=recieve;
  rx->Transmit=transmit;
  rx->Delayms=delayms;


  ReadControlRegister(rx);


  SetSoftShutMode(rx,SOFT_NORMAL_MODE);
}

2.2、對象操作

前面我們已經(jīng)描述過,對AD527x系列數(shù)字電位器的操作命令有9個。這9個命令皆是對寄存器進(jìn)行讀寫操作的,所以我們這里將這些操作分為讀寄存器操作和寫寄存器操作,并以此設(shè)計驅(qū)動程序。

2.2.1、寫寄存器操作

首先我們需要說明寫寄存器操作是針對對象的操作函數(shù),而不是對象變量包含的操作,因為我們只在對象變量中放入依賴于外界平臺的基本操作。寫寄存器操作會以回調(diào)的方式調(diào)用對象變量包含的基本操作。

因為AD527x系列數(shù)字電位器對象包括不同接口和不同檔位的器件,所以我們設(shè)計寫寄存器操作時需要考慮AD527x系列數(shù)字電位器對象的類型。而這個類型已在初始化時賦予了對象變量。據(jù)此我們設(shè)計寫寄存器操作函數(shù)如下:

/* 寫寄存器操作 */
static void AD527xWriteRegister(AD527xObjectType *rx,uint16_t cmd)
{
  uint8_t tData[2];


  tData[0]=(uint8_t)(cmd>>8);
  tData[1]=(uint8_t)cmd;


  if((rx->type==AD5270)||(rx->type==AD5271))//SPI接口
  {
    rx->ChipSelcet(AD527xCS_ENABLE);
    rx->Delayms(1);
  }
 
  rx->Transmit(rx,tData,2);


  if((rx->type==AD5270)||(rx->type==AD5271))//SPI接口
  {
    rx->Delayms(1);
    rx->ChipSelcet(AD527xCS_DISABLE);
  }
}

2.2.2、讀寄存器操作

與寫寄存器操作一樣,讀寄存器操作一樣要考慮到AD527x系列數(shù)字電位器對象的類型。在使用SPI接口的對象類型種需要考慮片選信號的處理。我們設(shè)計讀寄存器操作如下:

/* 讀寄存器操作 */
static void AD527xReadRegister(AD527xObjectType *rx,uint16_t cmd,uint8_t *rData)
{
  uint8_t tData[2];


  if((rx->type==AD5270)||(rx->type==AD5271))//SPI接口
  {
    rx->ChipSelcet(AD527xCS_ENABLE);
    rx->Delayms(1);
  }


  rx->Transmit(rx,tData,2);
 
  rx->Receive(rx,rData,2);


  if((rx->type==AD5270)||(rx->type==AD5271))//SPI接口
  {
    rx->Delayms(1);
    rx->ChipSelcet(AD527xCS_DISABLE);
  }
}

2.2.3、面向命令的操作

我們已經(jīng)實現(xiàn)了對繼存存其的讀操作和寫操作,但我們并不想通過調(diào)用這兩個函數(shù)并傳遞命令來實現(xiàn)我們的應(yīng)用。所以我們將不同的操作命令所要完成的功能封裝成函數(shù),在這些函數(shù)中調(diào)用讀寫寄存器操作函數(shù)來完成。這樣使用驅(qū)動就變得更為簡便。例如我們設(shè)計讀寫RDAC的函數(shù)如下:

/* 設(shè)置AD527x游標(biāo)位置 */
void SetRDACForAd527x(AD527xObjectType *rx,uint16_t data)
{
  uint16_t temp=0;
  
  if((rx->type==AD5271)||(rx->type==AD5274))//256檔
  {
  temp=data>255?255:data;
  }
  else if((rx->type==AD5270)||(rx->type==AD5272))//1024檔
  {
  temp=data>1023?1023:data;
  }


  temp=COMMAND_W_RDAC|temp;


  if(((rx->conreg)&0x02)!=0x02)
  {
    SetControlRegister(rx,PROGRAM_RDAC_ENABLE|rx->conreg);
  }


  AD527xWriteRegister(rx,temp);
}
 
/* 讀取RDAC游標(biāo)寄存器的內(nèi)容 */
uint16_t ReadRDACFromAd527x(AD527xObjectType *rx)
{
  uint8_t rData[2];
 
  uint16_t cmd=COMMAND_R_RDAC;
 
  AD527xReadRegister(rx,cmd,rData);
 
  rx->rdac=(rData[0]<<8)+rData[1];
  
  return rx->rdac;
}

3、驅(qū)動的使用

我們已經(jīng)實現(xiàn)了AD527x系列數(shù)字電位器的驅(qū)動。接下來我們來考慮如何使用這一驅(qū)動實現(xiàn)我們的應(yīng)用。

3.1、聲明并初始化對象

我們已經(jīng)定義了AD527x系列數(shù)字電位器對象類型。所以我們先要使用對象類型聲明一個AD527x系列數(shù)字電位器對象變量。形式如下:

AD527xObjectType ad527x;

當(dāng)然,這里定義的這個對象變量還不能直接使用。我們需要使用初始化函數(shù)對這個對象變量進(jìn)行初始化。初始化函數(shù)前面已經(jīng)說過,傳遞的參數(shù)皆是與對象變量相關(guān)的。初始化函數(shù)的參數(shù)如下:

AD527xObjectType *rx,待初始化的對象變量。
uint8_t address,采用I2C接口通訊是的設(shè)備地址。
AD527xType type,對象的設(shè)備類型。
AD527xReceive recieve,數(shù)據(jù)接收函數(shù)指針。
AD527xTransmit transmit,數(shù)據(jù)發(fā)送函數(shù)指針。
AD527xChipSelcet cs,使用SPI接口通訊時,片選操作函數(shù)指針。
AD527xDelayms delayms,毫秒延時操作函數(shù)指針。

對于這些參數(shù),對象變量我們已經(jīng)定義了。對象類型根據(jù)實際器件輸入即可。而設(shè)備地址在使用I2C接口時按要求輸入即可,如果是SPI接口則任意uint8_t類型的值均可。最主要的是我們需要定義幾個函數(shù),并將函數(shù)指針作為參數(shù)。這幾個函數(shù)的類型圖下:

/*定義片選信號函數(shù)指針類型*/
typedef void (*AD527xChipSelcet)(AD527xCSType en);
/*定義接收數(shù)據(jù)函數(shù)指針類型*/
typedef void (*AD527xReceive)(struct AD527xObject *rx,uint8_t *rData,uint16_t rSize);
/*定義發(fā)送數(shù)據(jù)函數(shù)指針類型*/
typedef void (*AD527xTransmit)(struct AD527xObject *rx,uint8_t *wData,uint16_t wSize);
/*定義ms延時操作指針*/
typedef void (*AD527xDelayms)(volatile uint32_t nTime);

對于這幾個函數(shù)我們根據(jù)樣式定義就可以了,具體的操作可能與使用的硬件平臺有關(guān)系。片選操作函數(shù)只在使用SPI接口是需要定義,否則可以傳入NULL即可。具體函數(shù)定義如下:

/*定義片選信號函數(shù)*/
void AD527xCS(AD527xCSType en)
{
  if(AD527xCS_ENABLE==en)
  {
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4, GPIO_PIN_RESET);
  }
  else
  {
    HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4, GPIO_PIN_SET);
  }
}
 
/*定義接收數(shù)據(jù)函數(shù)*/
void AD527xReceiveData(struct AD527xObject *rx,uint8_t *rData,uint16_t rSize)
{
  HAL_SPI_Receive (&hspi, rData, rSize, 1000);
}
 
/*定義發(fā)送數(shù)據(jù)函數(shù)*/
void AD527xTransmitData(struct AD527xObject *rx,uint8_t *wData,uint16_t wSize)
{
  HAL_SPI_Transmit (&hspi, wData, wSize, 1000);
}

對于延時函數(shù)我們可以采用各種方法實現(xiàn)。我們曹勇的STM32平臺和HAL庫則可以直接使用HAL_Delay()函數(shù)。于是我們可以調(diào)用初始化函數(shù)如下:

AD527xInitialization(&ad527x,0x00,AD5270,AD527xReceiveData,AD527xTransmitData,AD527xCS,HAL_Delay);

這是使用SPI接口器件的初始化操作,使用I2C接口的初始化操作類似次操作即可。

3.2、基于對象進(jìn)行操作

我們已經(jīng)定義了對象變量并對其進(jìn)行了初始化。接下來我們就要看看如何操作對象得到我們想要的結(jié)果。

我們在前面已經(jīng)根據(jù)操作命令做了封裝,所以我們需要什么養(yǎng)的功能只需要調(diào)用相應(yīng)的函數(shù)就可以了。如我們想要設(shè)置RDAC為最大值則:

SetValueToAd5270(&ad527x,1023);

其中第1個參數(shù)為要操作的對象指針,第2個參數(shù)為要設(shè)置的游標(biāo)位置值。

4、應(yīng)用總結(jié)

我們已經(jīng)實現(xiàn)AD527x系列數(shù)字電位器的驅(qū)動及基于此驅(qū)動的應(yīng)用,得到了與我們預(yù)期一致的結(jié)果,說明驅(qū)動的設(shè)計時符合需求的。

在使用驅(qū)動時需注意,采用I2C接口的器件需要考慮設(shè)備地址的問題。設(shè)備地址由ADDR引腳的狀態(tài)決定。由三種取值如下:

Dingtalk_20221206154648.jpg

在使用驅(qū)動時需注意,采用SPI接口的器件需要考慮片選操作的問題。如果片選信號是通過硬件電路來實現(xiàn)的,我們在初始化時給其傳遞NULL值。如果是軟件操作片選則傳遞我們編寫的片選操作函數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124543
  • 數(shù)字電位器
    +關(guān)注

    關(guān)注

    4

    文章

    267

    瀏覽量

    84023
  • 驅(qū)動設(shè)計
    +關(guān)注

    關(guān)注

    1

    文章

    111

    瀏覽量

    15555
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    AD8400系列數(shù)字電位器驅(qū)動設(shè)計與實現(xiàn)

    一些時候我們需要在系統(tǒng)使用過程中改變某些電路電阻值以達(dá)到改變設(shè)定的目的,這時候我們就會使用電位器。在我們使用數(shù)字控制電路時多選擇數(shù)字電位器。在這一篇我們就來設(shè)計AD8400
    的頭像 發(fā)表于 12-09 16:08 ?4323次閱讀
    AD8400<b class='flag-5'>系列</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>的<b class='flag-5'>驅(qū)動</b>設(shè)計與<b class='flag-5'>實現(xiàn)</b>

    數(shù)字電位器

    最近打算用數(shù)字電位器來平衡電橋測量電阻,遇到幾個問題。1.有沒有1M的數(shù)字電位器啊,有的話能夠推薦下型號嗎2.我發(fā)現(xiàn)我所知道的數(shù)字
    發(fā)表于 03-28 14:13

    什么是數(shù)字電位器

    數(shù)字電位器的工作原理數(shù)字電位器的典型應(yīng)用
    發(fā)表于 04-08 06:58

    數(shù)字電位器的應(yīng)用特性分析

    利用數(shù)字電位器可以對模擬數(shù)字混合信號處理電路的參數(shù)特性進(jìn)行自動調(diào)整。并可配合單片機(jī)完成多種測量和控制功能。文中對美國Xicor公司研制的X9C系列
    發(fā)表于 04-24 15:04 ?24次下載

    理解和應(yīng)用數(shù)字電位器

    理解和應(yīng)用數(shù)字電位器         主題詞:數(shù)字電位器,機(jī)械電位器
    發(fā)表于 10-23 23:41 ?52次下載

    X9241數(shù)字電位器的原理及在DSP中的應(yīng)用

    X9241數(shù)字電位器的原理及在DSP中的應(yīng)用.pdf
    發(fā)表于 11-14 15:06 ?40次下載

    DAC與數(shù)字電位器

    DAC與數(shù)字電位器摘要:本應(yīng)用筆記對數(shù)/模轉(zhuǎn)換(DAC)和數(shù)字電位進(jìn)行了對比,傳統(tǒng)的數(shù)字
    發(fā)表于 11-16 11:45 ?62次下載

    數(shù)字電位器替代機(jī)械電位器

    數(shù)字電位器替代機(jī)械電位器 摘要:數(shù)字可調(diào)節(jié)電位器,也稱為數(shù)字
    發(fā)表于 11-27 17:38 ?3098次閱讀
    用<b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>替代機(jī)械<b class='flag-5'>電位器</b>

    數(shù)字電位器替代機(jī)械電位器

    摘要:數(shù)字可調(diào)節(jié)電位器,也稱為數(shù)字電位器或digpot,不僅能夠在眾所周知的音頻應(yīng)用中替代機(jī)械電位器,而且能夠在所有電子設(shè)備中替代傳統(tǒng)的機(jī)械
    發(fā)表于 04-28 10:22 ?1849次閱讀
    用<b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>替代機(jī)械<b class='flag-5'>電位器</b>

    理解和應(yīng)用數(shù)字電位器

    描述了數(shù)字電位器工作原理、特點、分類及廣泛應(yīng)用,闡述了與機(jī)械電位器相比,數(shù)字電位器的優(yōu)點,同時也描述了數(shù)
    發(fā)表于 05-09 16:13 ?153次下載
    理解和應(yīng)用<b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>

    數(shù)字電位器應(yīng)用實例_數(shù)字電位器四大應(yīng)用電路

    本文主要介紹了數(shù)字電位器的應(yīng)用,包括了介紹了X9313數(shù)字電位器的應(yīng)用、數(shù)字
    發(fā)表于 01-23 09:39 ?4.8w次閱讀
    <b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>應(yīng)用實例_<b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>四大應(yīng)用電路

    數(shù)字電位器工作原理詳解_數(shù)字電位器應(yīng)用_數(shù)字電位器選型指南

    本文介紹了什么是數(shù)字電位器、數(shù)字電位器的特點與數(shù)字電位器工作原理,其次詳細(xì)的介紹了
    發(fā)表于 01-23 10:20 ?6.1w次閱讀
    <b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>工作原理詳解_<b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>應(yīng)用_<b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>選型指南

    AD527x IBIS型號

    AD527x IBIS型號
    發(fā)表于 04-10 12:05 ?0次下載
    <b class='flag-5'>AD527x</b> IBIS型號

    數(shù)字電位器Linux驅(qū)動程序

    數(shù)字電位器Linux驅(qū)動程序
    發(fā)表于 04-21 16:56 ?9次下載
    <b class='flag-5'>數(shù)字</b><b class='flag-5'>電位器</b>Linux<b class='flag-5'>驅(qū)動</b>程序

    AD527x IBIS型號

    AD527x IBIS型號
    發(fā)表于 06-10 09:30 ?5次下載
    <b class='flag-5'>AD527x</b> IBIS型號