电信号:电压、电流等
非电信号:压力、温度、湿度、位移、声音等
但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。
(1)比较器,所有的AD转换芯片内部都是用比较器来实现的。
(2)和10进制转2进制有点像。
逐次逼近类型
并行比较类型
sigma类型
过采样(over sampling),量化噪声整形(quantization),数字滤波(digital filtering),抽取(decimation)。Σ-Δ转换器中的模拟部分非常简单(类似于一个1bit ADC),而数字部分要复杂得多,按照功能可划分为数字滤波和抽取单元。由于更接近于一个数字器件,Σ-ΔADC的制造成本非常低廉。
过采样:首先,考虑一个传统ADC的频域传输特性。输入一个正弦信号,然后以频率fs采样–按照 Nyquist定理,采样频率至少两倍于输入信号。从FFT分析结果可以看到,一个单音和一系列频率分布于DC到fs /2间的随机噪声。这就是所谓的量化噪声,主要是由于有限的ADC分辨率而造成的。单音信号的幅度和所有频率噪声的RMS幅度之和的比值就是信号噪声比(SNR)。对于一个Nbit ADC,SNR可由公式:SNR=6.02N+1.76dB得到。为了改善SNR和更为精确地再现输入信号,对于传统ADC来讲,必须增加位数。
3.1分辨率
3.2转换速率
转换速率(Conversion Rate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率(Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。
3.3精度与误差
常用的A/D转换器主要存在:失调误差、增益误差和线性误差。
3.4基准误差
采用内部或外部基准的ADC的一个最大潜在误差源是参考电压。很多情况下,内置于芯片内部的基准通常都没有足够严格的规格。为了理解基准所带来的误差源,有必要特别关注一下三项指标:温漂,电压噪声,和负载调整。
3.5量化误差
量化误差(Quantizing Error) 由于AD的有限分辩率而引起的误差,即有限分辩率AD的阶梯状转移特性曲线与无限分辩率AD(理想AD)的转移特性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。
3.6失调误差与增益误差
失调误差与增益误差用数学公式可表达为:y=ax+b。其中,a为增益误差,b为失调误差。失调误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。
3.7线性度
线性度指标有两个:INL:翻译过来叫“积分非线性”,指的是ADC整体的非线性程度。DNL:翻译过来叫“微分非线性”,指的是ADC局部(细节)的非线性程度。
(1)INL(Interger NonLinear,Linearity error)精度。理解为单值数据误差,对应该点模拟数据由于元器件及结构造成的不能精确测量产生的误差。(2)DNL(Differential NonLinear)差分非线性值。理解为刻度间的差值,即对每个模拟数据按点量化,由于量化产生的误差。
3.8信噪比(signal-to-noise,SNR)
3.9有效位数
3.10动态范围
(1)位数,AD转换后转出来的二进制数由几位二进制来表示。位数越多,越细腻。
(2)量程,AD转换器可以接受的模拟量的范围。
(3)精度,简单理解就是转出来到底有多准。
(4)分辨率,AD转换器转出来的二进制数,每一格表示多少。
(5)转换速率(转换时间)。
举个栗子:
输入电压范围0-5V,AD转换输出位数是10,精度是0.01V,则:量程为0-5V,
分辨率为:(5-0)/2exp(10)=0.00488V
譬如一次AD转换后得到的数据是1010101010,则对应的电压值为:3.328V,考虑精度后为3.33V
实现现象:下载程序后数码管后4位显示外部输入IN3通道检测的AD值,模拟信号电压范围在0-5V
1.main.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};
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函数名 :datapros()
* 函数功能 :数据处理函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void datapros()
{
u16 temp;
static u8 i;
if(i==50)
{
i=0;
temp = Read_AD_Data(0xE4); // AIN3 外部输入
}
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];
}
/*******************************************************************************
* 函数名 :DigDisplay()
* 函数功能 :数码管显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
}
P0=disp[3-i];//发送数据
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
datapros(); //数据处理函数
DigDisplay();//数码管显示函数
}
}
2.XPT2046.C
#include"XPT2046.h"
/****************************************************************************
*函数名:TSPI_Start
*输 入:无
*输 出:无
*功 能:初始化触摸SPI
****************************************************************************/
void SPI_Start(void)
{
CLK = 0;
CS = 1;
DIN = 1;
CLK = 1;
CS = 0;
}
/****************************************************************************
*函数名:SPI_Write
*输 入:dat:写入数据
*输 出:无
*功 能:使用SPI写入数据
****************************************************************************/
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7; //放置最高位
dat <<= 1;
CLK = 0; //上升沿放置数据
CLK = 1;
}
}
/****************************************************************************
*函数名:SPI_Read
*输 入:无
*输 出:dat:读取 到的数据
*功 能:使用SPI读取数据
****************************************************************************/
uint SPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++) //接收12位数据
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
/****************************************************************************
*函数名:Read_AD_Data
*输 入:cmd:读取的X或者Y
*输 出:endValue:最终信号处理后返回的值
*功 能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6; i>0; i--); //延时等待转换结果
CLK = 1; //发送一个时钟周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
3.XPT2046.h
#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 DIN = P3^4; //输入
sbit CS = P3^5; //片选
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);
#endif
天线,外部电源,信标接收机,核心计算版(atmega 32),传感器,摄像头
[外链图片转存失败(img-IUNOXkHZ-1562462801513)(1543672357912.png)]
对我的启发:一期模型未做电池组和蓄电池组,我们部门也可开始着手建立这样的一个简易模型,先不做蓄电池组,和电源管理,大大降低了难度,让模型能够拍照,并发送图片即可,且成本低廉,又可以让大家上手开发。
疑惑:整篇论文介绍里说用了主动姿控,却并未提到。。。
对我的启发:卫星的模式分为了姿态控制模式和拍照模式,当到达指定区域上空时才开始拍照,卫星稳定时才能读取传感器数据,卫星的倾斜角好像不能变,但是所有仿真内容的形式可以借鉴
疑惑:依然没有提到姿态调整效应器,只说了actuators,
,又可以让大家上手开发。
疑惑:整篇论文介绍里说用了主动姿控,却并未提到。。。
对我的启发:卫星的模式分为了姿态控制模式和拍照模式,当到达指定区域上空时才开始拍照,卫星稳定时才能读取传感器数据,卫星的倾斜角好像不能变,但是所有仿真内容的形式可以借鉴
疑惑:依然没有提到姿态调整效应器,只说了actuators,
[外链图片转存失败(img-GDrPZovx-1562462801515)(1543672901719.png)]