一些時候我們需要在系統(tǒng)使用過程中改變某些電路電阻值以達(dá)到改變設(shè)定的目的,這時候我們就會使用電位器。在我們使用數(shù)字控制電路時多選擇數(shù)字電位器。在這一篇我們就來設(shè)計AD8400系列數(shù)字電位器的驅(qū)動。
1、功能概述
AD8400/AD8402/AD8403分別是單通道/雙通道/四通道、256位、數(shù)字控制可變電阻(VR)器件,可實現(xiàn)與機(jī)械電位計或可變電阻相同的電子調(diào)整功能。AD8400內(nèi)置一個可變電阻,采用緊湊的SOIC-8封裝。AD8402內(nèi)置兩個獨立的可變電阻,采用節(jié)省空間的SOIC-14表面貼裝封裝。AD8403內(nèi)置四個獨立的可變電阻,提供24引腳PDIP、SOIC和TSSOP三種封裝。各器件均內(nèi)置一個帶游標(biāo)觸點的固定電阻,該游標(biāo)觸點在載入控制串行輸入寄存器的數(shù)字碼所確定的數(shù)字碼分接該固定電阻值。游標(biāo)與固定電阻任一端點之間的電阻值,隨傳輸至VR鎖存器中的數(shù)字碼呈線性變化。在A端與游標(biāo)或B端與游標(biāo)之間,各可變電阻提供一個完全可編程電阻值。A至B固定端接電阻(1 kΩ、10 kΩ、50 kΩ或100 kΩ)的通道間匹配容差為±1%,標(biāo)稱溫度系數(shù)為500 ppm/°C。借助獨特的開關(guān)電路,可將傳統(tǒng)開關(guān)電阻設(shè)計中固有的高脈沖干擾降至最低,從而避免任何先合后開或先開后合操作。
每個VR均有各自的VR鎖存器,用來保存其編程電阻值。這些VR鎖存器由一個SPI兼容型串行至并行移位寄存器更新,該移位寄存器從一個標(biāo)準(zhǔn)三線式串行輸入數(shù)字接口加載數(shù)據(jù)。由10個數(shù)據(jù)位構(gòu)成的數(shù)據(jù)字傳輸至串行輸入寄存器。
該數(shù)據(jù)字經(jīng)過解碼,前2位確定需要載入的VR鎖存器地址,后8位是數(shù)據(jù)。利用串行寄存器相對端的串行數(shù)據(jù)輸出引腳,就可以簡單的菊花鏈形式將多個VR連接,而無需額外的外部解碼邏輯。
復(fù)位(RS)引腳通過將80H載入VR鎖存器來迫使游標(biāo)移到中間電平。SHDN引腳則迫使A端的電阻變?yōu)槎说蕉碎_路狀態(tài),并使游標(biāo)與B端短路,從而實現(xiàn)毫瓦級功耗的關(guān)斷狀態(tài)。當(dāng)SHDN回到邏輯高電平時,先前的鎖存器設(shè)置將使游標(biāo)處于關(guān)斷前的電阻值設(shè)置。數(shù)字接口在關(guān)斷期間仍有效,以便更改代碼,當(dāng)器件脫離關(guān)斷狀態(tài)時,游標(biāo)將處于新的位置。
2、驅(qū)動設(shè)計與實現(xiàn)
我們已經(jīng)了解了AD840x系列數(shù)字電位器的基本情況,接下來我們將基于此實現(xiàn)AD840x系列數(shù)字電位器的驅(qū)動。
2.1、對象定義
我們的的驅(qū)動設(shè)計都是基于對象的操作,所以我們先要抽象出AD840x系列數(shù)字電位器的對象類型。這是一個系列對象所以有不同的類型,每種類型又有不同的標(biāo)稱電阻值。這些都可以區(qū)別不同的對象,我們將其抽象為AD840x對象的屬性。而對于操作則相對簡單,我們只需要向AD840x對象寫數(shù)據(jù),所以將寫數(shù)據(jù)作為它的操作。具體定義如下:
/* 定義AD840x類型枚舉 */
typedef enum AD840x{
AD8400,
AD8402,
AD8403
}AD840xType;
/* 定義AD840x通道選擇枚舉 */
typedef enum AD840xLdac{
AD840x_VR1=0x00,
AD840x_VR2=0x01,
AD840x_VR3=0x02,
AD840x_VR4=0x03
}AD840xLdacType;
/* 定義AD840x標(biāo)稱電阻枚舉 */
typedef enum AD840xNR{
AD840x_NR1k,//標(biāo)稱電阻為1K
AD840x_NR10k,//標(biāo)稱電阻為10K
AD840x_NR50k,//標(biāo)稱電阻為50K
AD840x_NR100k//標(biāo)稱電阻為100K
}AD840xNRType;
/* 定義AD840x對象類型 */
typedef struct AD840xObject{
AD840xType type;//AD840x對象類型
float nominalValue;//標(biāo)稱電阻值
void (*Write)(uint8_t rdac);//寫數(shù)據(jù)操作函數(shù)指針
}AD840xObjectType;
有操作對象后,還需要對該對象變量作初始化才可使用,所以我們還需要定義一個初始化函數(shù)用于對象的初始化。AD840x對象的初始化函數(shù)如下:
/* 初始化AD840x對象 */
void AD840xInitialization(AD840xObjectType *vr,AD840xType type,AD840xWriteByte write,AD840xNRType nr)
{
float nValue[4]={1000,10000,50000,100000};
if((vr==NULL)||(write==NULL))
{
return;
}
vr->type=type;
vr->Write=write;
vr->nominalValue=nValue[nr];
}
2.2、對象操作
AD8400/AD8402/AD8403分別是單通道/雙通道/四通道、256位、數(shù)字控制可變電阻(VR)器件。更改VR編程設(shè)置是通過將10位串行數(shù)據(jù)字送入SDI引腳來實現(xiàn)。此數(shù)據(jù)字由2個地址位(MSB優(yōu)先)和8個數(shù)據(jù)位(也是MSB優(yōu)先)組成。串行寄存器數(shù)據(jù)字格式如下:
AD840x的地址分配,由ADDR解碼器解碼,確定接收位B7至B0中的串行寄存器數(shù)據(jù)的VR鎖存器的位置。位置的計算公式如下:
VR#=A1*2+A0+1
單通道AD8400要求A1 = A0 = 0。雙通道AD8402要求A1 = 0。A1、A0的取值方式如下:
關(guān)于AD840x對象設(shè)置游標(biāo)的位置與電阻的關(guān)系:
根據(jù)上述兩個公式,當(dāng)我們需要某一阻值的電阻時,只需要設(shè)置響應(yīng)的D值就看可以了。具體的操作函數(shù)如下:
/*設(shè)置AD8400游標(biāo)的位置*/
void SetAD8400ResistorValue(AD840xObjectType *vr,uint16_t resistorValue,AD840xLdacType ldac)
{
float mValue=0.0;
uint16_t sendValue=0;
uint8_t txData[2];
if((resistorValue<50)||(resistorValue>vr->nominalValue))
{
return;
}
if((vr->type==AD8400)&&(ldac!=AD840x_VR1))
{
return;
}
if((vr->type==AD8402)&&(ldac>AD840x_VR2))
{
return;
}
mValue=((float)resistorValue-(float)RESISTANCEINITIAL)/(float)vr->nominalValue;
sendValue=(uint8_t)(mValue*RESISTANCEINDEX);
sendValue=sendValue||(ldac<<8);
txData[0]=(sendValue>>2);
txData[1]=(sendValue<<6);
vr->Write(txData[0]);
vr->Write(txData[1]);
}
第三個參數(shù)通道選擇,如前面所述由A1、A0決定。對于AD8400是單通道,直接指定第一通道即可。而AD8402對應(yīng)第一、第二通道。
3、驅(qū)動的使用
我們實現(xiàn)了AD840x系列數(shù)字電位器的驅(qū)動,接下來我們需要來討論一下它的應(yīng)用,及如何使用我們開發(fā)的驅(qū)動實現(xiàn)我們的應(yīng)用。
3.1、聲明并初始化對象
首先我們依然是需要聲明AD840x對象變量。我們在驅(qū)動設(shè)計時已經(jīng)定義了AD840xObjectType對象類型,所以我們就是用這個對象類型聲明AD840x對象變量。具體操作如下:
AD840xObjectType ad840x;
對于定義的這一對象變量尚不能直接使用,必須先對其初始化。我們在驅(qū)動中也設(shè)計了初始化函數(shù):void AD840xInitialization(AD840xObjectType *vr,AD840xType type,AD840xWriteByte write,AD840xNRType nr)。它的四個參數(shù)分別是:AD840x對象指針、AD840x的類型、寫AD840x對象函數(shù)指針、AD840x的標(biāo)稱電阻值。
AD840x對象指針指向的就是我們所要初始化的對象變量。AD840x的類型就是源自AD840xType枚舉。AD840x的標(biāo)稱電阻值則源自AD840xNRType枚舉。關(guān)于寫AD840x對象函數(shù)指針則是與具體硬件平臺和接口相關(guān)的數(shù)據(jù)發(fā)送函數(shù)。在這里就是指SPI對口的數(shù)據(jù)發(fā)送函數(shù)。具體類型如下:
typedef void (*AD840xWriteByte)(uint8_t rdac);
如我們可聲明為:void WriteAD8400bySPI(uint8_t rdac);
有了這些參數(shù)我們就可以使用初始化函數(shù)來初始化我們前面聲明的對象變量了。具體形式如下:
AD840xInitialization(&ad840x, AD8400, WriteAD8400bySPI, AD840x_NR10k);
我們就將對象變量ad840x初始化為AD8400類型的標(biāo)稱電阻為10K的可變電阻對象,且向?qū)ο髮憯?shù)據(jù)的函數(shù)為WriteAD8400bySPI。
3.2、基于對象進(jìn)行操作
我們聲明并初始化完成對象變量后。就可以調(diào)用操作函數(shù)來實現(xiàn)我們想要對AD840x對象進(jìn)行的操作了。使用電阻設(shè)置函數(shù)即可:
void SetAD8400ResistorValue(AD840xObjectType *vr,uint16_t resistorValue,AD840xLdacType ldac)
其3個參數(shù),第一個是我們要操作的對象的指針;第二個是我們想要設(shè)置的電阻值;第三個參數(shù)是通道選擇。
4、應(yīng)用總結(jié)
我們已經(jīng)實現(xiàn)了AD840x的驅(qū)動及應(yīng)用。AD840x的應(yīng)用并不復(fù)雜,我們只需要設(shè)定我們想要的電阻就可以了。在我們的應(yīng)用中得到的結(jié)果與我們預(yù)期的完全一致。
在使用驅(qū)動時我們應(yīng)該注意。AD8402與AD8403均為多通道的可變電阻。在使用時需要注意通道選擇。通道選擇由下發(fā)數(shù)據(jù)的A1、A0位決定。驅(qū)動中已定義為枚舉,選擇即可。
源碼公布到GitHUB:https://github.com/foxclever/ExPeriphDriver
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124534 -
數(shù)字電位器
+關(guān)注
關(guān)注
4文章
267瀏覽量
84022 -
驅(qū)動設(shè)計
+關(guān)注
關(guān)注
1文章
111瀏覽量
15555
發(fā)布評論請先 登錄
AD527x系列數(shù)字電位器的驅(qū)動設(shè)計與實現(xiàn)

數(shù)字電位器
請教關(guān)于數(shù)字電位計AD8400的問題
DAC與數(shù)字電位器
用數(shù)字電位器替代機(jī)械電位器

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

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

1/2/4通道數(shù)字電位器AD8400/AD8402/AD8403數(shù)據(jù)表

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

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

AD8400/AD8402/AD8403:1/2/4通道數(shù)字電位計數(shù)據(jù)手冊

評論