基于PIC16F72的两路交流信号A/D转换

来源:本站
导读:目前正在解读《基于PIC16F72的两路交流信号A/D转换》的相关信息,《基于PIC16F72的两路交流信号A/D转换》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《基于PIC16F72的两路交流信号A/D转换》的详细说明。
简介:本文介绍了基于PIC16F72的两路交流信号A/D转换。

//这是一个两路交流信号的AD转换,然后和标准比较决定输出大于标准的那一路,默认输出A路

#include <pic.h>

#include <math.h>

#include <stdio.h>

bank1 int re0[40]; //定义存放A/D转换结果的数组,在bank0中

bank1 int re1[40]; //定义存放A/D转换结果的数组,在bank1中

unsigned int i,j, k; //定义几个整型变量

double squ ,squad; //平方寄存器和平方和寄存器,squ又通用为存储其它数值

double standard; //定义双精度浮点型

int uo;

//系统各I/O口初始化

void ioinitial()

{

TRISA=0X03; //RA0~RA1为输入 RA2~RA4为输出

TRISB=0XC0; // RB0~RB5为输出 RB6~RB7为输入

RB1=1; //B路关断

RB2=0; // 选A导通

RB3=0; // A路导通

RB4=0; // LEDB不亮

RB5=1; // LEDA亮

}

//RA0 A/D转换初始化子程序

void ad0initial()

{

ADCON0= 0XC1; //选择A/D通道为RA0,RC时钟,且打开A/D转换器

//在工作状态,使A/D转换时钟为

ADCON1=0X02; // RA0 RA1为模拟通道 VDD为参考电压5V

ADIF=0; // 清ad中断标志位

ADIE=1; //A/D转换中断允许

GIE=1; //全局中断使能(允许CPU响应所有中断源产生的中断请求

RP0 =0; //设置RA0为输入方式

}

//RA1 A/D转换初始化子程序

void ad1initial()

{

ADCON0= 0XC9; //选择A/D通道为RA1,RC时钟,且打开A/D转换器

//在工作状态,使A/D转换时钟为

ADCON1=0X02; // RA0 RA1为模拟通道 VDD为参考电压5V

ADIF=0; // 清ad中断标志位

ADIE=1; //A/D转换中断允许

GIE=1; //全局中断使能(允许CPU响应所有中断源产生的中断请求

}

//数据采集延时子程序

void delay0()

{

for(i=0;i<10;i++) continue;

}

//AD转换间隔

void delay1()

{

for(i=0;i<10;i++) continue;

}

// 存AD0结果

void ad0store()

{

ADIF=0; //清除中断标志

re0[i]=ADRES; //1次A/D转换的结果存入数组

}

// 存AD1结果

void ad1store()

{

ADIF=0; //清除中断标志

re1[j]=ADRES; //1次A/D转换的结果存入数组

}

// 处理AD040次AD转换结果得到交流信号有效值

void ad0process()

{for(i=0,squad=0;i<40;i++)

{

uo=re0[i];

squ=(double)uo; //强制把采得的数据量转换成双精度数,以便运算

squ=squ*5/256; //把每点的数据转换成实际数据

squ=squ*squ; //求一点电压的平方

squad=squad+squ;

} //以上求得40点电压的平方和,存于寄存器squad中

squ=squad/40; //求得平均值

squ=sqrt(squ); //开平方,求得最后的电压值

}

// 处理AD140次AD转换结果得到交流信号有效值

void ad1process()

{for(j=0,squad=0;j<40;j++)

{

uo=re1[j];

squ=(double)uo; //强制把采得的数据量转换成双精度数,以便运算

squ=squ*5/256; //把每点的数据转换成实际数据

squ=squ*squ; //求一点电压的平方

squad=squad+squ;

} //以上求得40点电压的平方和,存于寄存器squad中

squ=squad/40; //求得平均值

squ=sqrt(squ); //开平方,求得最后的电压值

}

// A路通

void aon()

{ RB1=1; //B路关断

RB2=0; // 选A导通

RB3=0; // A路导通

RB4=0; // LEDB不亮

RB5=1; // LEDA亮

}

// B路通

void bon()

{ RB1=0; //A路关断

RB2=1; // 选B导通

RB3=1; // B路导通

RB4=1; // LEDB亮

RB5=0; // LEDA不亮

}

//主程序

main()

{

ioinitial(); //系统各I/O口初始化

standard=0.273861 ; //75dbuv转换为电压为0.273861

for (i=0;i<40;i++)

{ ad0initial(); //A/D转换初始化

delay0(); //AD采集延时

ADGO=1 ; //启动A/D转换

for(i=1;ADGO=1;i=1)

{continue;} //go为1循环等待,go不为1结束循环

ad0store() ; // 存AD0结果

delay1() ; //AD转换间隔

}

ad0process() ; // 处理AD040次AD转换结果得到交流信号有效值

if(squ>=standard)

{

aon() ; // A路通

}

else

{

for(k=0;k<10;k++)

{

for (i=0 ;i<40;i++)

{ ad1initial(); //A/D转换初始化

delay0(); //AD采集延时

ADGO=1 ; //启动A/D转换

for(i=1;ADGO=1;i=1)

{continue;} //go为1循环等待,go不为1结束循环

ad1store(); // 存AD1结果

delay1(); //AD转换间隔

}

ad1process(); // 处理AD040次AD转换结果得到交流信号有效值

if(squ<standard) break;

}

if (k=10)

{ bon(); // b路通

}

else { aon() ; // A路通

}

}

}

提醒:《基于PIC16F72的两路交流信号A/D转换》最后刷新时间 2024-03-14 01:03:03,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《基于PIC16F72的两路交流信号A/D转换》该内容的真实性请自行鉴别。