当前位置:网站首页>(十六)ADC转换实验
(十六)ADC转换实验
2022-07-01 16:51:00 【我爱笔记】
本节主要是回顾有关于ADC的对应内容,我们这章通过一个AD芯片xpt2046来读取外部电压的变化,将电压的数字量显示在数码管上。
关于ADC:
我们都知道单片机内部都是数字量,就是1或者0,而我们的电流电压在传递的时候是模拟量,也就是模拟量很可能是一个动态连续的电压,如果我们直接把这个电压放到单片机上,通过我们内部电路转化,大于多少电压值的为1,小于多少电压的为0,但是这个并不能表示电压值的具体大小,所以有了ADC来把模拟电压值转化为多位数字电压值,而你转化的电压的位数越多,说明你的转化越准确。那么对于一个ADC来说就有了几个比较重要的指标。1就是分辨率:分辨率就是说我输出的电压是用多少位来表示的,ADC的分辨率一般是8位或者12位,就以8位和12位举例同时转化10v电压举例,当我们是12位的时候:

我们说它的分辨率是12位,它的每个刻度是2.4mV,而当我们是8位的时候:

这个时候我们说它的分辨率是8位,它的每个刻度就是39mV,很明显验证了前面的结论,12位的分辨率高的多。2是转换误差,我们说的转换误差就是我们最小刻度的一半,比如12位的转换误差在转换10V时的转换误差就是1.2mV。3是转换速率,即每秒转换的次数,而完成一次A/D转换所需的时间,则是转换速率的倒数。
关于ADC转换
ADC转换主要分三步,分别是采样,量化和编码。采样主要是说说明采样原理,采样原理主要是说采样频率必须是信号频率的2倍,但是采样频率也不能过于太大,太大的话会导致采样点过多,采样时间太长,比较理想的采样频率应该是信号频率的3到5倍。而关于量化,我们都知道数字上的变化不是连续的,于是任何一个数字量的大小,都是以某个最小单位的整数倍来表示的,因此在用数字量表示电压时,也必须把它化成最小单位的整数倍,这个过程就是量化。而我们把一段连续的电压的每个采样值表示为最小单位的整数倍,并将这个整数倍值用二进制编码,那么就是编码,这个二进制信号就是我们AD的输出值。
硬件:
XPT2046是一款四线制电阻式触摸屏,内含有12位分辨率AD转换器,XPT2046有很多的功能,但是本节我们主要是电压检测这个用法,我的51单片机上有一个滑动变阻器,我们可以通过调整滑动变阻器的电压值来改变电压的输入,图如下所示:

其中的AIN0即与我们的XPT2046的输入引脚相连,关于XPT2046的硬件图如下所示

X,Y,Z,VBAT,AUX通过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式,选择VBAT,AUX或者X,Z的应该配置为单端模式。而作为触摸屏应用时,应该选择为差分模式,我们通过手册可得我们需要把A2,A1,A0配置为001,整个XPT2046的时序图如下所示:

其中位7的含义如下所示:
![]()
我们选择位7为1

由以上的列表可以知道我们要发的配置信号为0x94。
软件:
其中关于XPT2046程序如下,我们的电压值虽然是5V,但是我们并不需要算出电压值的实际大小,我们只需要得到实际的份数,至于后续的处理就暂时不处理了。其中关于XPT2046读写程序如下:
#include "xpt2046.h"
#include <intrins.h>
void delay_us(unsigned int xus){
while(xus--);
}
unsigned int spi_read(){
int i;
unsigned int dat = 0;
DCLK = 0;
for(i = 0;i < 12;i++){
dat <<= 1;
DCLK = 1;
DCLK = 0;
dat |= DOUT;
}
return dat;
}
void spi_write(unsigned char dat){
int i;
DCLK = 0;
for(i = 0;i < 8;i++){
DIN= (dat >> 7) & 0x01;
dat <<= 1;
DCLK = 0;
DCLK = 1;
}
}
unsigned int read_data(unsigned char cmd){
unsigned int val;
int i;
DCLK = 0;
CS= 0;
spi_write(cmd);
for(i = 0;i < 6;i++);
DCLK = 1;
_nop_();
_nop_();
DCLK = 0;
_nop_();
_nop_();
val = spi_read();
CS = 1;
return val;
}关于数码管的程序如下:
#include "key.h"
unsigned char smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void key_scan(unsigned int val){
int i;
unsigned char table[4];
for(i = 0;i < 4;i++){
table[i] = val % 10;
val /= 10;
}
for(i = 0;i < 4;i++){
switch(i){
case 0:
LSC = 0; LSB = 0; LSA = 0;
break;
case 1:
LSC = 0; LSB = 0; LSA = 1;
break;
case 2:
LSC = 0; LSB = 1; LSA = 0;
break;
case 3:
LSC = 0; LSB = 1; LSA = 1;
break;
}
P0 = smgduan[table[i]];
delay_us(100);
}
}关于主函数的程序如下:
#include "reg52.h"
#include "xpt2046.h"
#include "key.h"
void main(){
unsigned char cmd =0x94;
unsigned int val;
int i = 0;
while(1){
if(i==50){
val = read_data(cmd);
i = 0;
}
key_scan(val);
i++;
}
}关于两个头函数的代码如下:
#ifndef _XPT_2046_H_
#define _XPT_2046_H_
#include "reg52.h"
sbit DIN = P3^4;
sbit DOUT = P3^7;
sbit CS = P3^5;
sbit DCLK = P3^6;
unsigned int spi_read();
void delay_us(unsigned int xus);
unsigned int read_data(unsigned char cmd);
#endif
#ifndef _KEY_H_
#define _KEY_H_
#include "reg52.h"
#include "xpt2046.h"
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
void key_scan(unsigned int val);
#endif由此完成了XPT2046的编程。
边栏推荐
- Exclusive news: Alibaba cloud quietly launched RPA cloud computer and has opened cooperation with many RPA manufacturers
- 剑指 Offer II 105. 岛屿的最大面积
- 可迭代对象与迭代器、生成器的区别与联系
- Gaussdb (for MySQL):partial result cache, which accelerates the operator by caching intermediate results
- 【Kotlin】高阶函数介绍
- C language input / output stream and file operation
- SystemVerilog-结构体(二)
- [wrung Ba wrung Ba is 20] [essay] why should I learn this in college?
- libcurl下载文件的代码示例
- MySQL learning summary
猜你喜欢

重磅披露!上百个重要信息系统被入侵,主机成为重点攻击目标

Hi Fun Summer, play SQL planner with starrocks!

存在安全隐患 起亚召回部分K3新能源
![[flask introduction series] cookies and session](/img/2e/d50e0a032c4ec48935cb5df206a29b.png)
[flask introduction series] cookies and session

Shenyu gateway development: enable and run locally

vulnhub靶场-Hacker_Kid-v1.0.1

剑指 Offer 20. 表示数值的字符串

Yyds dry inventory MySQL RC transaction isolation level implementation

In aks, use secret in CSI driver mount key vault

Dataframe gets the number of words in the string
随机推荐
[wrung Ba wrung Ba is 20] [essay] why should I learn this in college?
Flux d'entrées / sorties et opérations de fichiers en langage C
GameFramework食用指南
sql刷题627. 变更性别
MySQL learning summary
China carbon disulfide industry research and investment strategy report (2022 Edition)
Gaussdb (for MySQL):partial result cache, which accelerates the operator by caching intermediate results
(12) About time-consuming printing
[C language supplement] judge which day tomorrow is (tomorrow's date)
在MeterSphere接口测试中如何使用JMeter函数和MockJS函数
Dataframe gets the number of words in the string
Encryption and decryption of tinyurl in leetcode
String的trim()和substring()详解
The amazing open source animation library is not only awesome, but also small
剑指 Offer II 015. 字符串中的所有变位词
Redis6.0 新功能
Borui data integrated intelligent observable platform was selected into the "Yunyuan production catalogue" of China Academy of communications in 2022
字节跳动数据平台技术揭秘:基于 ClickHouse 的复杂查询实现与优化
Leetcode 216 combined summation III -- backtracking method
(1) CNN network structure