/**********************************************************************
文件名:ADC.C
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
功能说明:* ADDITIONAL NOTES:
* This file contains two functions - ADC_Init() and _ADCInterrupt().
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
程序调试记录:
2009-11-25:文件建立
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
程序修改说明:
**********************************************************************/
#define ADC_C
#include <p30F6014a.h>
#include "Define.h"
#include "math.h"
void ADC_Average(void)
{
if(ADCCount==40)
{
ADCCount=0;
Ia=(unsigned int)(sqrt(IaSum*2)/20);
if(Ia<600){Ia=Ia-10;}
Ib=(unsigned int)(sqrt(IbSum*2)/20);
Ic=(unsigned int)(sqrt(IcSum*2)/20);
Io=(unsigned int)(sqrt(IoSum)/20);
Va=(unsigned int)(sqrt(VaSum)/20);
Vb=(unsigned int)(sqrt(VbSum)/20);
Vc=(unsigned int)(sqrt(VcSum)/20);
Vpt=(unsigned int)(sqrt(VptSum)/20);
Iz= (unsigned int)(sqrt(IzSum)/20);
Tem= (unsigned int)(sqrt(ItemSum)/20);
Adbuf0=(unsigned int)(sqrt(Buf0Sum)/20);
Adbuf1=(unsigned int)(sqrt(Buf1Sum)/20);
IaSum=0;
IbSum=0;
IcSum=0;
VaSum=0;
VbSum=0;
VcSum=0;
VptSum=0;
IoSum=0;
IzSum=0;
ItemSum=0;
Buf0Sum=0;
Buf1Sum=0;
}
{
ADCCount +=1;
IaSum=IaSum+(IaBuf*IaBuf);
IbSum=IbSum+(IbBuf*IbBuf);
IcSum=IcSum+(IcBuf*IcBuf);
IoSum=IoSum+(IoBuf*IoBuf);
VaSum=VaSum+(VaBuf*VaBuf);
VbSum=VbSum+(VbBuf*VbBuf);
VcSum=VcSum+(VcBuf*VcBuf);
VptSum=VptSum+(VptBuf*VptBuf);
IzSum = IzSum+(IzBuf*IzBuf);
ItemSum = ItemSum+(TemBuf*TemBuf);
keySum = keySum+(KeyBuf*KeyBuf);
VbtSum = VbtSum+(VbtBuf*VbtBuf);
Buf0Sum = Buf0Sum+(ADBuf0*ADBuf0);
Buf1Sum = Buf1Sum+(ADBuf1*ADBuf1);
}
}
/*******************************
ADCS<5:0>bit 5-0 :A/D 转换时钟选择位
111111 = TCY/2 *(ADCS<5:0> + 1) = 32*TCY
000001 = TCY/2 *(ADCS<5:0> + 1) = TCY
000000 = TCY/2 *(ADCS<5:0> + 1) = TCY/2
*********************************/
void ADC_Init(void)
{
ADCON1bits.FORM = 0;//整数
ADCON1bits.ADSIDL = 0;//器件进入空闲模式时,模块停止工作
ADCON1bits.SSRC = 7; //通过内部计数器结束采样并开始转换
ADCON1bits.ASAM = 1; //
ADCON2bits.SMPI= 14;
ADCON2bits.VCFG = 3;
ADCON2bits.CSCNA= 1;
ADCON3bits.SAMC = 1;
ADCON3bits.ADCS = 4;
ADCHS = 0x0002;
ADCSSL = 0xFFFC;
ADPCFG = 0xFFFF;
ADPCFGbits.PCFG2 = 0; // AN2 analog
ADPCFGbits.PCFG3 = 0; // AN3 analog
ADPCFGbits.PCFG4 = 0; // AN4 analog
ADPCFGbits.PCFG5 = 0; // AN5 analog
ADPCFGbits.PCFG6 = 0; // AN6 analog
ADPCFGbits.PCFG7 = 0; // AN7 analog
ADPCFGbits.PCFG8 = 0; // AN8 analog
ADPCFGbits.PCFG9 = 0; // AN9 analog
ADPCFGbits.PCFG10 = 0; // AN10 analog
ADPCFGbits.PCFG11 = 0; // AN10 analog
ADPCFGbits.PCFG12 = 0; // AN10 analog
ADPCFGbits.PCFG13 = 0; // AN10 analog
ADPCFGbits.PCFG14 = 0; // AN10 analog
ADPCFGbits.PCFG15 = 0; // AN10 analog add4
IPC2bits.ADIP = 4; //设置AD转换中断优先级为7
IFS0bits.ADIF = 0;
IEC0bits.ADIE = 1;
ADCON1bits.ADON = 1;
}
void __attribute__ ((__interrupt__)) _ADCInterrupt(void)
{
dataout1^=1;
IFS0bits.ADIF = 0;
IEC0bits.ADIE = 0;
IcBuf=ADCBUF0;//C相电流
VaBuf=ADCBUF1;//A相电压
VbBuf=ADCBUF2;//B相电压
VcBuf=ADCBUF3;//C相电压
VptBuf=ADCBUF4;//PT电压
IoBuf=ADCBUF5;//合成零系电流
IzBuf=ADCBUF6;//独立零系电流
TemBuf=ADCBUF7;//温度采样口
VbtBuf=ADCBUF8;//电池电压
KeyBuf=ADCBUF9;//这个地方要跟Meas[I]对应
IaBuf=ADCBUFA;//A相电流
IbBuf=ADCBUFB;//B相电流
ADBuf0=ADCBUFC;//备用
ADBuf1=ADCBUFD;//备用
ADBuf2=IcBuf;
}