当前位置:网站首页>(十六)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的编程。
边栏推荐
- AI college entrance examination volunteer filling: the gods of Dachang fight, and candidates pay to watch
- 如何使用 etcd 实现分布式 /etc 目录
- Template Engine Velocity Foundation
- 中国酶制剂市场预测与投资战略研究报告(2022版)
- SQL question brushing 586 Customers with the most orders
- China benzene hydrogenation Market Research and investment forecast report (2022 Edition)
- AI高考志愿填报:大厂神仙打架,考生付费围观
- 单例模式的懒汉模式跟恶汉模式的区别
- 机器学习11-聚类,孤立点判别
- 判断一棵二叉树是否为平衡二叉树
猜你喜欢
软件工程导论——第六章——详细设计
【splishsplash】关于如何在GUI和json上接收/显示用户参数、MVC模式和GenParam
Detailed explanation of activity life cycle and startup mode
C語言輸入/輸出流和文件操作
Template Engine Velocity Foundation
Template engine velocity Foundation
Integer array merge [JS]
Introduction to software engineering - Chapter 6 - detailed design
Girls who want to do software testing look here
字节跳动数据平台技术揭秘:基于 ClickHouse 的复杂查询实现与优化
随机推荐
美国国家安全局(NSA)“酸狐狸”漏洞攻击武器平台技术分析报告
China BMS battery management system Market Research Report (2022 Edition)
Redis6.0 new features
可迭代对象与迭代器、生成器的区别与联系
Is the securities account given by the head teacher of goucai school safe? Can I open an account?
What is the effect of choosing game shield safely in the game industry?
ACM MM 2022视频理解挑战赛视频分类赛道冠军AutoX团队技术分享
【Kotlin】高阶函数介绍
剑指 Offer 20. 表示数值的字符串
Template engine velocity Foundation
SystemVerilog-结构体(二)
Dataframe gets the number of words in the string
Gaussdb (for MySQL):partial result cache, which accelerates the operator by caching intermediate results
《中国智慧环保产业发展监测与投资前景研究报告(2022版)》
(12) About time-consuming printing
Girls who want to do software testing look here
官宣!香港科技大学(广州)获批!
C語言輸入/輸出流和文件操作
libcurl下载文件的代码示例
【牛客网刷题系列 之 Verilog快速入门】~ 优先编码器电路①