淘宝省油宝怎么样:ADS7843触摸屏控制芯片的STM32驱动程序

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 20:51:12
ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。供电电压2.7~5 V,参考电压VREF1 V~+VCC,转换电压的输入范围为0~ VREF,最高转换速率为125 kHz

ADS7843的引脚配置如图3所示:

 

 

1为引脚功能说明:

 

 

4为典型应用电路:

 

 

ADS7843支持两种参考电压输入模式:一种是参考电压固定为VREF,另一种采取差动模式,参考电压来自驱动电极。这两种模式分别如图6(a)(b)所示。采用图6(b)的差动模式可以消除开关导通压降带来的影响。

 

 

ADS7843的控制字如表4所列,其中S为数据传输起始标志位,该位必为"1"A2~A0进行通道选择(见表3)

  MODE用来选择A/D转换的精度,"1"选择8位,"0"选择12位。

  SER/选择参考电压的输入模式(见表23)PD1PD0选择省电模式:

  "00"省电模式允许,在两次A/D转换之间掉电,且中断允许;

  "01""00",只是不允许中断;

  "10"保留;

"11"禁止省电模式。

 

为了完成一次电极电压切换和A/D转换,需要先往ADS7843发送控制字,转换完成后再读出电压转换值。标准的一次转换需要24个时钟周期,如图7所示。由于串口支持双向同时进行传送,并且在一次读数与下一次发控制字之间可以重叠,所以转换速率可以提高到每次16个时钟周期,如图8所示。如果条件允许,CPU可以产生15CLK的话(比如FPGAsASICs),转换速率还可以提高到每次15个时钟周期,如图9所示。

 

 

ADS7843stm32驱动程序:

 

 

上图为引脚配置,我的开发板为BHS_STM32-III开发板,引脚连接也在上图注明了。

 

 

这是ADS7843用到的一些宏定义。

 

下面是关于ADS7843的函数,包括初始化函数,写控制字函数,读取转换值函数,求平均值函数

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;

}

 

 

主函数:

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;    //发上位机观察结果

                            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;    //发上位机观察结果

                            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);

                     }

              }           

       }

}

 

 

在此例程中,读取到的平均值我是直接发送到串口的(当然串口也是需要配置的,这里我也不多说了),另外触发中断的方式我用的查询法(相当的不准!),呵呵,我只是试验一下到底有没有数据读出,只是想看看驱动成功没有。

 

 

下面是我用串口助手收到的数据:

 

 

呵呵,比较乱。 因为图省事,用的查询法,点一下就输出好多组坐标值。