pic单片机ad转换c程序分享

控制/MCU

1882人已加入

描述

A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。A/D转换后,输出的数字信号可以有8位、10位、12位、14位和16位等。

ad转换工作原理

逐次逼近法

逐次逼近式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被保留,否则被清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。

C程序

双积分法

采用双积分法的A/D转换器由电子开关、积分器、比较器和控制逻辑等部件组成。如下图所示。基本原理是将输入电压变换成与其平均值成正比的时间间隔,再把此时间间隔转换成数字量,属于间接转换。 双积分法A/D转换的过程是:先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始进行固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压VREF,将VREF输入到积分器,进行反向积分,直到输出为0V时停止积分。Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数 值,就是输入模拟电压Vi所对应的数字量,实现了A/D转换。

C程序

电压频率转换法

采用电压频率转换法的A/D转换器,由计数器、控制门及一个具有恒定时间的时钟门控制信号组成,如下图所示。

C程序

它的工作原理是V/F转换电路把输入的模拟电压转换成与模拟电压成正比的脉冲信号。

电压频率转换法电压频率转换法的工作过程是:当模拟电压Vi加到V/F的输入端,便产生频率F与Vi成正比的脉冲,在一定的时间内对该脉冲信号计数,时间到,统计到计数器的计数值正比于输入电压Vi,从而完成A/D转换。

pic单片机ad转换c程序

#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--);

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分