中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
ADS7843觸摸屏控制芯片的STM32驅(qū)動(dòng)程序
ADS7843是一個(gè)內(nèi)置12位模數(shù)轉(zhuǎn)換、低導(dǎo)通電阻模擬開關(guān)的串行接口芯片。供電電壓2.7~5 V,參考電壓VREF1 V~+VCC,轉(zhuǎn)換電壓的輸入范圍為0~ VREF,最高轉(zhuǎn)換速率為125 kHz。

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/選擇參考電壓的輸入模式(見表23)。PD1PD0選擇省電模式:

  "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的話(比如FPGAsASICs),轉(zhuǎn)換速率還可以提高到每次15個(gè)時(shí)鐘周期,如圖9所示。

 

 

ADS7843stm32驅(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)值。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
若水閣-搜狐博客#tp_e6700775ad9#tp_e6700775ad9
C庫函數(shù)重定向c基礎(chǔ)知識(shí)
STM32程序添加printf函數(shù)后無法運(yùn)行的解決方法(轉(zhuǎn))
觸摸屏的工作原理與應(yīng)用
STM32的USART
CC2530 ADC實(shí)驗(yàn)1(讀取片內(nèi)溫度并通過串口顯示)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服