一些時(shí)候我們需要在系統(tǒng)使用過(guò)程中改變某些電路電阻值以達(dá)到改變?cè)O(shè)定的目的,這時(shí)候我們就會(huì)使用電位器。在我們使用數(shù)字控制電路時(shí)多選擇數(shù)字電位器。在這一篇我們就來(lái)設(shè)計(jì)AD8400系列數(shù)字電位器的驅(qū)動(dòng)。
1、功能概述
AD8400/AD8402/AD8403分別是單通道/雙通道/四通道、256位、數(shù)字控制可變電阻(VR)器件,可實(shí)現(xiàn)與機(jī)械電位計(jì)或可變電阻相同的電子調(diào)整功能。AD8400內(nèi)置一個(gè)可變電阻,采用緊湊的SOIC-8封裝。AD8402內(nèi)置兩個(gè)獨(dú)立的可變電阻,采用節(jié)省空間的SOIC-14表面貼裝封裝。AD8403內(nèi)置四個(gè)獨(dú)立的可變電阻,提供24引腳PDIP、SOIC和TSSOP三種封裝。各器件均內(nèi)置一個(gè)帶游標(biāo)觸點(diǎn)的固定電阻,該游標(biāo)觸點(diǎn)在載入控制串行輸入寄存器的數(shù)字碼所確定的數(shù)字碼分接該固定電阻值。游標(biāo)與固定電阻任一端點(diǎn)之間的電阻值,隨傳輸至VR鎖存器中的數(shù)字碼呈線性變化。在A端與游標(biāo)或B端與游標(biāo)之間,各可變電阻提供一個(gè)完全可編程電阻值。A至B固定端接電阻(1 kΩ、10 kΩ、50 kΩ或100 kΩ)的通道間匹配容差為±1%,標(biāo)稱(chēng)溫度系數(shù)為500 ppm/°C。借助獨(dú)特的開(kāi)關(guān)電路,可將傳統(tǒng)開(kāi)關(guān)電阻設(shè)計(jì)中固有的高脈沖干擾降至最低,從而避免任何先合后開(kāi)或先開(kāi)后合操作。

每個(gè)VR均有各自的VR鎖存器,用來(lái)保存其編程電阻值。這些VR鎖存器由一個(gè)SPI兼容型串行至并行移位寄存器更新,該移位寄存器從一個(gè)標(biāo)準(zhǔn)三線式串行輸入數(shù)字接口加載數(shù)據(jù)。由10個(gè)數(shù)據(jù)位構(gòu)成的數(shù)據(jù)字傳輸至串行輸入寄存器。

該數(shù)據(jù)字經(jīng)過(guò)解碼,前2位確定需要載入的VR鎖存器地址,后8位是數(shù)據(jù)。利用串行寄存器相對(duì)端的串行數(shù)據(jù)輸出引腳,就可以簡(jiǎn)單的菊花鏈形式將多個(gè)VR連接,而無(wú)需額外的外部解碼邏輯。
復(fù)位(RS)引腳通過(guò)將80H載入VR鎖存器來(lái)迫使游標(biāo)移到中間電平。SHDN引腳則迫使A端的電阻變?yōu)槎说蕉碎_(kāi)路狀態(tài),并使游標(biāo)與B端短路,從而實(shí)現(xiàn)毫瓦級(jí)功耗的關(guān)斷狀態(tài)。當(dāng)SHDN回到邏輯高電平時(shí),先前的鎖存器設(shè)置將使游標(biāo)處于關(guān)斷前的電阻值設(shè)置。數(shù)字接口在關(guān)斷期間仍有效,以便更改代碼,當(dāng)器件脫離關(guān)斷狀態(tài)時(shí),游標(biāo)將處于新的位置。
2、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
我們已經(jīng)了解了AD840x系列數(shù)字電位器的基本情況,接下來(lái)我們將基于此實(shí)現(xiàn)AD840x系列數(shù)字電位器的驅(qū)動(dòng)。
2.1、對(duì)象定義
我們的的驅(qū)動(dòng)設(shè)計(jì)都是基于對(duì)象的操作,所以我們先要抽象出AD840x系列數(shù)字電位器的對(duì)象類(lèi)型。這是一個(gè)系列對(duì)象所以有不同的類(lèi)型,每種類(lèi)型又有不同的標(biāo)稱(chēng)電阻值。這些都可以區(qū)別不同的對(duì)象,我們將其抽象為AD840x對(duì)象的屬性。而對(duì)于操作則相對(duì)簡(jiǎn)單,我們只需要向AD840x對(duì)象寫(xiě)數(shù)據(jù),所以將寫(xiě)數(shù)據(jù)作為它的操作。具體定義如下:
/* 定義AD840x類(lèi)型枚舉 */
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)稱(chēng)電阻枚舉 */
typedef enum AD840xNR{
AD840x_NR1k,//標(biāo)稱(chēng)電阻為1K
AD840x_NR10k,//標(biāo)稱(chēng)電阻為10K
AD840x_NR50k,//標(biāo)稱(chēng)電阻為50K
AD840x_NR100k//標(biāo)稱(chēng)電阻為100K
}AD840xNRType;
/* 定義AD840x對(duì)象類(lèi)型 */
typedef struct AD840xObject{
AD840xType type;//AD840x對(duì)象類(lèi)型
float nominalValue;//標(biāo)稱(chēng)電阻值
void (*Write)(uint8_t rdac);//寫(xiě)數(shù)據(jù)操作函數(shù)指針
}AD840xObjectType;
有操作對(duì)象后,還需要對(duì)該對(duì)象變量作初始化才可使用,所以我們還需要定義一個(gè)初始化函數(shù)用于對(duì)象的初始化。AD840x對(duì)象的初始化函數(shù)如下:
/* 初始化AD840x對(duì)象 */
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、對(duì)象操作
AD8400/AD8402/AD8403分別是單通道/雙通道/四通道、256位、數(shù)字控制可變電阻(VR)器件。更改VR編程設(shè)置是通過(guò)將10位串行數(shù)據(jù)字送入SDI引腳來(lái)實(shí)現(xiàn)。此數(shù)據(jù)字由2個(gè)地址位(MSB優(yōu)先)和8個(gè)數(shù)據(jù)位(也是MSB優(yōu)先)組成。串行寄存器數(shù)據(jù)字格式如下:

AD840x的地址分配,由ADDR解碼器解碼,確定接收位B7至B0中的串行寄存器數(shù)據(jù)的VR鎖存器的位置。位置的計(jì)算公式如下:
VR#=A1*2+A0+1
單通道AD8400要求A1 = A0 = 0。雙通道AD8402要求A1 = 0。A1、A0的取值方式如下:

關(guān)于AD840x對(duì)象設(shè)置游標(biāo)的位置與電阻的關(guān)系:


根據(jù)上述兩個(gè)公式,當(dāng)我們需要某一阻值的電阻時(shí),只需要設(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]);
}
第三個(gè)參數(shù)通道選擇,如前面所述由A1、A0決定。對(duì)于AD8400是單通道,直接指定第一通道即可。而AD8402對(duì)應(yīng)第一、第二通道。
3、驅(qū)動(dòng)的使用
我們實(shí)現(xiàn)了AD840x系列數(shù)字電位器的驅(qū)動(dòng),接下來(lái)我們需要來(lái)討論一下它的應(yīng)用,及如何使用我們開(kāi)發(fā)的驅(qū)動(dòng)實(shí)現(xiàn)我們的應(yīng)用。
3.1、聲明并初始化對(duì)象
首先我們依然是需要聲明AD840x對(duì)象變量。我們?cè)隍?qū)動(dòng)設(shè)計(jì)時(shí)已經(jīng)定義了AD840xObjectType對(duì)象類(lèi)型,所以我們就是用這個(gè)對(duì)象類(lèi)型聲明AD840x對(duì)象變量。具體操作如下:
AD840xObjectType ad840x;
對(duì)于定義的這一對(duì)象變量尚不能直接使用,必須先對(duì)其初始化。我們?cè)隍?qū)動(dòng)中也設(shè)計(jì)了初始化函數(shù):void AD840xInitialization(AD840xObjectType *vr,AD840xType type,AD840xWriteByte write,AD840xNRType nr)。它的四個(gè)參數(shù)分別是:AD840x對(duì)象指針、AD840x的類(lèi)型、寫(xiě)AD840x對(duì)象函數(shù)指針、AD840x的標(biāo)稱(chēng)電阻值。
AD840x對(duì)象指針指向的就是我們所要初始化的對(duì)象變量。AD840x的類(lèi)型就是源自AD840xType枚舉。AD840x的標(biāo)稱(chēng)電阻值則源自AD840xNRType枚舉。關(guān)于寫(xiě)AD840x對(duì)象函數(shù)指針則是與具體硬件平臺(tái)和接口相關(guān)的數(shù)據(jù)發(fā)送函數(shù)。在這里就是指SPI對(duì)口的數(shù)據(jù)發(fā)送函數(shù)。具體類(lèi)型如下:
typedef void (*AD840xWriteByte)(uint8_t rdac);
如我們可聲明為:void WriteAD8400bySPI(uint8_t rdac);
有了這些參數(shù)我們就可以使用初始化函數(shù)來(lái)初始化我們前面聲明的對(duì)象變量了。具體形式如下:
AD840xInitialization(&ad840x, AD8400, WriteAD8400bySPI, AD840x_NR10k);
我們就將對(duì)象變量ad840x初始化為AD8400類(lèi)型的標(biāo)稱(chēng)電阻為10K的可變電阻對(duì)象,且向?qū)ο髮?xiě)數(shù)據(jù)的函數(shù)為WriteAD8400bySPI。
3.2、基于對(duì)象進(jìn)行操作
我們聲明并初始化完成對(duì)象變量后。就可以調(diào)用操作函數(shù)來(lái)實(shí)現(xiàn)我們想要對(duì)AD840x對(duì)象進(jìn)行的操作了。使用電阻設(shè)置函數(shù)即可:
void SetAD8400ResistorValue(AD840xObjectType *vr,uint16_t resistorValue,AD840xLdacType ldac)
其3個(gè)參數(shù),第一個(gè)是我們要操作的對(duì)象的指針;第二個(gè)是我們想要設(shè)置的電阻值;第三個(gè)參數(shù)是通道選擇。
4、應(yīng)用總結(jié)
我們已經(jīng)實(shí)現(xiàn)了AD840x的驅(qū)動(dòng)及應(yīng)用。AD840x的應(yīng)用并不復(fù)雜,我們只需要設(shè)定我們想要的電阻就可以了。在我們的應(yīng)用中得到的結(jié)果與我們預(yù)期的完全一致。
在使用驅(qū)動(dòng)時(shí)我們應(yīng)該注意。AD8402與AD8403均為多通道的可變電阻。在使用時(shí)需要注意通道選擇。通道選擇由下發(fā)數(shù)據(jù)的A1、A0位決定。驅(qū)動(dòng)中已定義為枚舉,選擇即可。
源碼公布到GitHUB:https://github.com/foxclever/ExPeriphDriver
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129998 -
數(shù)字電位器
+關(guān)注
關(guān)注
4文章
277瀏覽量
84904 -
驅(qū)動(dòng)設(shè)計(jì)
+關(guān)注
關(guān)注
1文章
113瀏覽量
15745
發(fā)布評(píng)論請(qǐng)先 登錄
AD527x系列數(shù)字電位器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
數(shù)字電位器
請(qǐng)教關(guān)于數(shù)字電位計(jì)AD8400的問(wèn)題
請(qǐng)問(wèn)有誰(shuí)用過(guò)AD8400A10數(shù)字電位器嗎?
DAC與數(shù)字電位器
用數(shù)字電位器替代機(jī)械電位器
用數(shù)字電位器替代機(jī)械電位器
理解和應(yīng)用數(shù)字電位器
1/2/4通道數(shù)字電位器AD8400/AD8402/AD8403數(shù)據(jù)表
數(shù)字電位器應(yīng)用實(shí)例_數(shù)字電位器四大應(yīng)用電路
數(shù)字電位器工作原理詳解_數(shù)字電位器應(yīng)用_數(shù)字電位器選型指南
AD8400/AD8402/AD8403:1/2/4通道數(shù)字電位計(jì)數(shù)據(jù)手冊(cè)
AD8400系列數(shù)字電位器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
評(píng)論