历史上的今天
返回首页

历史上的今天

今天是:2024年11月02日(星期六)

2021年11月02日 | AD转换之光敏电阻AIN2 ---- 学习笔记

2021-11-02 来源:eefocus

一、逐次逼近式ADC的转换原理

逐次逼近式AD转换器与计数式A/D转换类似,只是数字量由“逐次逼近寄存器SAR”产生。SAR使用“对分搜索法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,即10000000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn

二、时序图与引脚

 

三、代码

3.1、main

/*

 实验现象:下载程序后数码管前4位显示光敏传感器检测的AD值

1,单片机-->AD/DAC模块 管脚释义

    P34-->DI   DIN   串行数据输入端,当CS为低电平时,数据在 DCLK上升沿锁存进来

P35-->CS   CS   片选信号,控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电

P36-->CL   DCLK   时钟,外部时钟信号输入

P37-->DO   DOUT   串行数据输出端口。数据在DCLK的下降沿移出,当cs为高电平时为高阻态。

           BUSY   忙时信号,当cs为高电平时为高阻态

   LOVDD  数字电源输入端

   AUX     ADC辅助输入通道

     2,单片机-->动态数码管模块

    J22-->J6

P22-->J9(A)

P23-->J9(B)

P24-->J9(C)

*/

#include "reg52.h" // 此文件中定义了单片机的一些特殊功能寄存器

#include "XPT2046.h"

 

typedef unsigned int u16;

typedef unsigned char u8;   // 数据类型的定义

 

sbit LSA = P2^2;    //这三个端口共同控制数码管的位选

sbit LSB = P2^3;

sbit LSC = P2^4;

 

u8 disp[4]; //  字符型数组用来,存储点亮数码管前四位的数据

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0~9的数字显示

 

/*延时函数*/

void delay(u16 i)

{

   while(i--);

}

 

/*数据处理模块*/

void datapros()

{

u16 temp;  // 整型变量

/*static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以

static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。*/

static u8 i; 

if(i==50)

{

i=0;

/*

 AIN0电位器:如果要检测转换电位器模拟信号,控制字命令寄存器值为0X94或者0XB4.

 如果要检测转换热敏电阻模拟信号,控制字命令寄存器值为0XD4.

  AIN2光敏电阻:如果要检测转换光敏电阻模拟信号,控制字命令寄存器值为0XA4.

 如果要检测转换AIN3通道上模拟信号,控制字命令寄存器值为0XE4.

*/

temp = Read_AD_Data(0xA4); // AIN2光敏电阻

}

 i++;

 disp[0] = smgduan[temp/1000];        // 千位

 disp[1] = smgduan[temp%1000/100];   // 百位

 disp[2] = smgduan[temp%1000%100/10]; //十位

 disp[3] = smgduan[temp%1000%100%10]; // 个位

 

}

 

/*数码管显示模块*/

void DigDisplay()

{

u8 i;

for(i=0;i<4;i++)

{

switch(i)  // 位选

{

           case(0):

            LSA=1;LSB=1;LSC=1; break;//显示第0位

        case(1):

LSA=0;LSB=1;LSC=1; break;//显示第1位

case(2):

LSA=1;LSB=0;LSC=1; break;//显示第2位

case(3):

LSA=0;LSB=0;LSC=1; break;//显示第3位

}

           P0=disp[i]; // 发送数据

   delay(100);   // 延时一段时间

   P0 =0x00;     // 消影

}

}

 

/* 主函数*/

void main()

  {

  while(1)

    {

      datapros();     // 数据处理函数

      DigDisplay();   // 数码管显示函数

   }

 }

 

 

 


3.3、XPT2046芯片控制引脚定义、函数、变量声明文件

#ifndef _XPT2046_H_

#define _XPT2046_H_

 

// 包含头文件

#include

#include

 

// 重定义关键字

#ifndef uchar

#define uchar unsigned char

#endif

 

#ifndef uint

#define uint unsigned int 

#endif

 

#ifndef ulong

#define ulong unsigned long

#endif

 

// IO定义

sbit DOUT = P3^7;

sbit CLK  = P3^6;

sbit CS  = P3^5;  

sbit DIN  = P3^4;

 

// 函数定义

uint Read_AD_Data(uchar cmd);

uint SPI_Read(void);

void SPI_Write(uchar dat);

 


3.3、XPT2046.c芯片控制

 #include"XPT2046.h"

 

// 初始化触摸函数

void SPI_Start(void)

{

  CLK=0; // 时钟,外部时钟信号输入

  CS=1;     // 片选信号,控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电

 

  DIN=1;    // 串行数据输入端,当CS为低电平时,数据在 DCLK上升沿锁存进来

  CLK=1;

  CS=0;

}

 

/*写数据

CLK外部时钟 上升沿时   由DIN端口输入数据并锁存

*/ 

void SPI_Write(uchar dat)

{

 uchar i;    // 字符型变量

 CLK=0; // 外部时钟  低电平

 for(i=0;i<8;i++)

 {

 /* 逐次逼近式AD转换原理

  逐次逼近式AD转换器与计数式A/D转换类似,只是数字量由“逐次逼近寄存器SAR”产生。

SAR使用“对分搜索法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,

即10000000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn SAR又以对分搜索法确定次高位,即以低7位的一半y1000000B(y为已确定位)试探模拟量Vi的大小。

在bit6确定后,SAR以对分搜索法确定bit5位,即以低6位的一半yy100000B(y为已确定位)试探模拟量的大小。

重复这一过程,直到最低位bit0被确定,转换结束

 */

 DIN = dat >> 7;  // 右移7位 将dat的最高位赋给DIN

 dat<<=1;         //  dat=dat<<1 将保存在dat中的最高位移出 进行下次循环

 CLK = 0;

   // 上升沿放置数据,如将数据传输至数据线

 CLK = 1;

 }

}

 

  /*读数据函数

  CLK 时钟信号输入端口  下降沿时(CLK=1 变为 CLK=0) 数据移出

  */

uint SPI_Read(void)

{

uint i, dat = 0;  // 定义整型变量

CLK = 0;

for(i=0;i<12;i++)

{

 dat <<=1;       // dat = dat << 1;  左移1位

 CLK=1;

               // 下降沿数据移出

 CLK =0;

 /*  

 与&&  and   a && b    a  and  b  

 或||  or            a || b    a   or  b

 非!                 !1=0 

 按位与(&)          a & b     a  and b 

 按位或(|)           a | b     a  or  b

 

 */

 dat |= DOUT;     // dat = dat | DOUT    

}

 return dat;

}


/*cmd:读取的X或Y*/ 

uint Read_AD_Data(uchar cmd)

{

uchar i;        // 无符号的字符型变量

uint AD_Value;  // 整型变量

CLK =0; // 外部时钟信号输入

CS = 0;         //片选信号,控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电(高电平不工作,低电平工作)

SPI_Write(cmd);

for(i=6;i>0;i--); // 发送一个时钟周期,清除BUSY

CLK = 1;    // 下降沿移出数据

_nop_();    // 延时1us

_nop_();    // 延时1us

CLK = 0;

_nop_();    // 延时1us

_nop_(); // 延时1us

AD_Value = SPI_Read();

CS =1;

return AD_Value;

}

推荐阅读

史海拾趣

东软载波(EastSoft)公司的发展小趣事

东软载波公司成立于1993年,自成立之初就专注于电力载波通信技术的研发。公司在1996年开始了电力线载波通信技术的深入研究,经过数年的努力,终于在2000年推出了第一代电力线载波通信芯片。这一成果标志着东软载波在电力载波通信领域取得了重要突破,为其后续发展奠定了坚实的基础。

EF Johnson Technologies Inc公司的发展小趣事

在电子通信技术的浪潮中,EF Johnson Technologies Inc公司凭借其卓越的研发团队,成功开发出一款新型无线通信设备,该设备在信号稳定性和传输距离上均取得了重大突破。这一技术突破不仅让EF Johnson在市场上获得了显著的竞争优势,也推动了整个行业的技术进步。随着产品的广泛应用,EF Johnson逐渐确立了其在无线通信领域的领先地位。

General Transistor Corp公司的发展小趣事

随着技术的不断进步,GTC意识到仅仅作为分销商已无法满足市场需求。于是,公司开始逐步涉足电子元器件的生产领域,专注于研发和生产具有自主知识产权的产品。通过持续的技术创新和研发投入,GTC成功推出了一系列高性能的晶体管、集成电路等新产品,进一步丰富了其产品线。这些产品不仅在国内市场受到好评,还逐渐走向国际市场。

Aten International公司的发展小趣事

在电子设备的日益增多的背景下,用户对于高效、便捷的设备管理需求愈发强烈。Aten International凭借其对连接技术的深入理解,成功研发出KVM切换器,该产品能够实现对多台计算机的控制,大大提高了工作效率。随着技术的不断进步,Aten International的KVM切换器不断更新迭代,从最初的简单切换功能,发展到现在的智能管理、远程操控等高级功能,成为了电子行业的一大亮点。

Arco Electronics公司的发展小趣事

随着公司规模的扩大,Arco Electronics开始实施全球化战略。公司先后在多个国家和地区设立了研发中心和生产基地,以便更好地服务当地市场。通过全球化的布局,Arco不仅降低了生产成本,还提高了产品的竞争力。同时,公司还积极与当地的合作伙伴建立战略合作关系,共同开拓市场,实现了互利共赢。

BENCENT公司的发展小趣事

随着国内市场的饱和,BENCENT公司开始将目光投向海外市场。公司制定了详细的国际化战略,包括在海外市场设立分支机构、拓展销售渠道、加强与当地企业的合作等。通过一系列的努力,公司成功打入多个海外市场,实现了业务的多元化和国际化。

问答坊 | AI 解惑

arm中文培训教材

该培训资料包括: 1.ADS介绍 2.amba总线 3。arm_thumb指令4。arm编程技巧5。arm处理器内核6。arm调试方案 7。arm集成开发环境 8。arm构架 9。arm嵌入式软件开发 10。nucleus介绍 11。OSE介绍 12。带cache内核介绍 13。基于arm的嵌入式开发技术14。性 ...…

查看全部问答>

FPGA入门好书知多少?

各位高手,最近想学一些FPGA方面的相关知识,此前没啥基础,能否推荐一些入门的书籍给我?…

查看全部问答>

带中断的流驱动的重复动态加载卸载后,引起InterruptInitialize失败问题。。

有个驱动, 在DRV_Init 函数中,通过 KernelIoControl 来动态获取系统中断, 同时用 InterruptInitialize绑定系统中断和Event事件。 在 DRV_Deinit 函数中 用 KernelIoControl 释放系统中断。 但是 再次动态加载该驱动时候,提示InterruptIniti ...…

查看全部问答>

求CCD中文资料,我用的使ILX553A

第一次使用CCD啊。搞不懂方向啊。英文看起太恼火了。 求一个中文的这个器件的资料。或者中文的CCD使用教程。谢谢了。。 我的邮箱:272257780@qq.com…

查看全部问答>

请教:调用KernelIoControl重启WINCE后造成死机

#include #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) extern \"C\" __declspec(dllimport) BOOL KernelIoControl( DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOut ...…

查看全部问答>

求一个arm-linux驱动开发的师傅带带!~~~

我在西安,有没有人在无聊的时候带带我??? msn:tangzichao1984@hotmail.com qq:11826964 不胜感激…

查看全部问答>

请问能不能给滚动条改外观呢?改成自己设计的图片。

RT。 我需要吧滚动条的样式改成商家提供的图片的样式,就是要加入图片到滚动条中。这个要自己写吗? 能否提供一些源码参考呢?…

查看全部问答>

iar下奇怪的断点

                                 iar for arm5.3 ,jlink v8,调试stm32,出现了一个奇怪的现象,某处代码,并没有设置断点,但是运行到那就中断,好 ...…

查看全部问答>

winceUSB摄像头驱动问题

大家好,      在用微软官方提供的CE6.0USB摄像头驱动的时候需要对他进行修改么?我用的摄像头(蓝色妖姬s9红警)是遵从USB视频规范的。 如果需要修改,应该改哪些函数呢?      求高手指导! [ 本帖最 ...…

查看全部问答>

ccs5.3程序编译通过,但是debug不行

debug运行后显示程序已经在运行中,但是并没有在main的开始处暂停 而且在main中加入断点也不经过,不知道这样问题应该怎么解决啊。…

查看全部问答>