ADS7843的引腳配置如圖3所示:
表1為引腳功能說明:
圖4為典型應(yīng)用電路:
ADS7843支持兩種參考電壓輸入模式:一種是參考電壓固定為VREF,另一種采取差動(dòng)模式,參考電壓來自驅(qū)動(dòng)電極。這兩種模式分別如圖6(a)、(b)所示。采用圖6(b)的差動(dòng)模式可以消除開關(guān)導(dǎo)通壓降帶來的影響。
ADS7843的控制字如表4所列,其中S為數(shù)據(jù)傳輸起始標(biāo)志位,該位必為"1"。A2~A0進(jìn)行通道選擇(見表3)。
MODE用來選擇A/D轉(zhuǎn)換的精度,"1"選擇8位,"0"選擇12位。
SER/選擇參考電壓的輸入模式(見表2和3)。PD1、PD0選擇省電模式:
"00"省電模式允許,在兩次A/D轉(zhuǎn)換之間掉電,且中斷允許;
"01"同"00",只是不允許中斷;
"10"保留;
"11"禁止省電模式。
為了完成一次電極電壓切換和A/D轉(zhuǎn)換,需要先往ADS7843發(fā)送控制字,轉(zhuǎn)換完成后再讀出電壓轉(zhuǎn)換值。標(biāo)準(zhǔn)的一次轉(zhuǎn)換需要24個(gè)時(shí)鐘周期,如圖7所示。由于串口支持雙向同時(shí)進(jìn)行傳送,并且在一次讀數(shù)與下一次發(fā)控制字之間可以重疊,所以轉(zhuǎn)換速率可以提高到每次16個(gè)時(shí)鐘周期,如圖8所示。如果條件允許,CPU可以產(chǎn)生15個(gè)CLK的話(比如FPGAs和ASICs),轉(zhuǎn)換速率還可以提高到每次15個(gè)時(shí)鐘周期,如圖9所示。
ADS7843的stm32驅(qū)動(dòng)程序:
上圖為引腳配置,我的開發(fā)板為BHS_STM32-III開發(fā)板,引腳連接也在上圖注明了。
這是ADS7843用到的一些宏定義。
下面是關(guān)于ADS7843的函數(shù),包括初始化函數(shù),寫控制字函數(shù),讀取轉(zhuǎn)換值函數(shù),求平均值函數(shù)
void Delayus( int k)
{
int j;
for(j=k; j > 0; j--);
}
void ADS7843_start(void)
{
TP_CS_H();
TP_DCLK_H();
TP_DIN_H();
TP_DCLK_H();
}
void WR_CMD(u8 cmd)
{
u8 i;
u8 temp;
TP_DCLK_L();
for(i = 0;i < 8; i++)
{
temp = cmd & 0x80;
if(temp)
TP_DIN_H();
else
TP_DIN_L();
cmd <<= 1;
TP_DCLK_L();
__nop();__nop();__nop();
TP_DCLK_H();
__nop();__nop();__nop();
}
}
u16 RD_AD(void)
{
u16 buf = 0;
u8 i;
for(i = 0;i < 12;i++)
{
buf <<= 1;
TP_DCLK_H();
__nop();__nop();__nop();
TP_DCLK_L();
__nop();__nop();__nop();
if(TP_DOUT)
buf++;
}
return (buf);
}
u16 average(u16 a[8])
{
u16 i,ave=0,sum=0;
for(i=0;i<8;i++)
{
sum+=a[i];
}
ave=(sum)/6;
return ave;
}
主函數(shù):
int main()
{
u16 X=0,Y=0,a[4],i, avex,avey,x[8],y[8];
SystemInit();
usart_init();
TC_init();
while(1)
{
if(!TP_IRQ_FLAG)
{
Delayus(100);
if(!TP_IRQ_FLAG)
{
GPIO_SetBits(GPIOC,GPIO_Pin_9);
ADS7843_start();
TP_CS_L();
for(i = 0;i < 8;i++)
{
WR_CMD(CHX);
TP_DCLK_H();
__nop();__nop();__nop();__nop();
TP_DCLK_L();
__nop();__nop();__nop();__nop();
X = RD_AD();
x[i] = X;
WR_CMD(CHY);
TP_DCLK_H();
__nop();__nop();__nop();__nop();
TP_DCLK_L();
__nop();__nop();__nop();__nop();
Y = RD_AD();
y[i] = Y;
}
TP_CS_H();
avex = average(x);
a[0] = avex / 1000; //發(fā)上位機(jī)觀察結(jié)果
a[1] = (avex - a[0]*1000) / 100;
a[2] = (avex - a[0]*1000 - a[1]*100) / 10;
a[3] = avex % 10;
usart_putchar(a[0]+48);
usart_putchar(a[1]+48);
usart_putchar(a[2]+48);
usart_putchar(a[3]+48);
avey = average(y);
a[0] = avey / 1000; //發(fā)上位機(jī)觀察結(jié)果
a[1] = (avey - a[0]*1000) / 100;
a[2] = (avey - a[0]*1000 - a[1]*100) / 10;
a[3] = avey % 10;
usart_putchar(a[0]+48);
usart_putchar(a[1]+48);
usart_putchar(a[2]+48);
usart_putchar(a[3]+48);
}
}
}
}
在此例程中,讀取到的平均值我是直接發(fā)送到串口的(當(dāng)然串口也是需要配置的,這里我也不多說了),另外觸發(fā)中斷的方式我用的查詢法(相當(dāng)?shù)牟粶?zhǔn)?。呛?,我只是試驗(yàn)一下到底有沒有數(shù)據(jù)讀出,只是想看看驅(qū)動(dòng)成功沒有。
下面是我用串口助手收到的數(shù)據(jù):
呵呵,比較亂。 因?yàn)閳D省事,用的查詢法,點(diǎn)一下就輸出好多組坐標(biāo)值。
聯(lián)系客服