控制/MCU
A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。A/D转换后,输出的数字信号可以有8位、10位、12位、14位和16位等。
逐次逼近式A/D是比较常见的一种A/D转换电路,转换的时间为微秒级。采用逐次逼近法的A/D转换器是由一个比较器、D/A转换器、缓冲寄存器及控制逻辑电路组成,如图所示。基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减砝码进行试探。逐次逼近法转换过程是:初始化时将逐次逼近寄存器各位清零;转换开始时,先将逐次逼近寄存器最高位置1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为 Vo,与送入比较器的待转换的模拟量Vi进行比较,若Vo《Vi,该位1被保留,否则被清除。然后再置逐次逼近寄存器次高位为1,将寄存器中新的数字量送D/A转换器,输出的 Vo再与Vi比较,若Vo《Vi,该位1被保留,否则被清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。
采用双积分法的A/D转换器由电子开关、积分器、比较器和控制逻辑等部件组成。如下图所示。基本原理是将输入电压变换成与其平均值成正比的时间间隔,再把此时间间隔转换成数字量,属于间接转换。 双积分法A/D转换的过程是:先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始进行固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压VREF,将VREF输入到积分器,进行反向积分,直到输出为0V时停止积分。Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数 值,就是输入模拟电压Vi所对应的数字量,实现了A/D转换。
采用电压频率转换法的A/D转换器,由计数器、控制门及一个具有恒定时间的时钟门控制信号组成,如下图所示。
它的工作原理是V/F转换电路把输入的模拟电压转换成与模拟电压成正比的脉冲信号。
电压频率转换法电压频率转换法的工作过程是:当模拟电压Vi加到V/F的输入端,便产生频率F与Vi成正比的脉冲,在一定的时间内对该脉冲信号计数,时间到,统计到计数器的计数值正比于输入电压Vi,从而完成A/D转换。
#include《pic.h》
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3FB1);
void init();
void Delay();
unsigned int getad();
void Display(unsigned char a,unsigned char b,unsigned char c);
unsigned char DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
void main()
{
unsigned int led;
unsigned char a ,b,c;
init();
while(1)
{
led = getad();
a = led/100;
b=led%100/10;
c=led%10;
Display(a,b,c);
}
}
void Display(unsigned char a,unsigned char b,unsigned char c)
{
PORTB=DIG_CODE[c];
RC4=1;RC5=0;RC6=0;
Delay();
PORTB=DIG_CODE[b];
RC4=0;RC5=1;RC6=0;
Delay();
PORTB=DIG_CODE[a];
RC4=1;RC5=1;RC6=0;
Delay();
}
unsigned int getad()
{
unsigned int ad8;
ADGO =1;
while(ADGO);
ad8 = ADRES;
return(ad8);
}
void init()
{
TRISA =1;
TRISB = 0; //portB 输出
TRISC = 0;
ADCON0 = 0x41;
ADCON1 = 0x00;
Delay();
}
void Delay()
{
unsigned char a,b,c;
for(c=1;c》0;c--)
for(b=10;b》0;b--)
for(a=5;a》0;a--);
}
全部0条评论
快来发表一下你的评论吧 !