#include <c8051f020.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
extern bit bypass_sg1; //偏心通道旁路指示
extern bit bypass_sg2; //轴位移1通道旁路指示
extern bit bypass_sg3; //轴位移2通道旁路指示
extern bit bypass_sg4; //胀差通道旁路指示
extern int xdata my_para[76];
extern int data array1[4];
extern xdata uint base[10];
uint data temp2_pwm;
float xdata temp4_pwm;
xdata signed char aa_pwm,bb_pwm;
/*PCA的非中断方式及PCA0CPM0,PCA0CPM1、PCA0CPM2、PCA0CPM3*/
/*初始化*/
void PCA0_Init (void)
{
// configure PCA time base to use SYSCLK; overflow interrupt disabled
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x08; // Time base uses SYSCLK/4,产生波形频率为84赫兹左右
// Configure Module 0 to PWM16 mode
PCA0CPM0 = 0xcb; // 16 bit PWM mode,DISABLE ECCF0
PCA0CPL0=0xff;
PCA0CPH0 =0x7f; // Set initial pulse wide
// Configure Module 1 to PWM16 mode
PCA0CPM1 = 0xcb; // 16 bit PWM mode,DISABLE ECCF0
PCA0CPL1=0xff;
PCA0CPH1 =0x7f; // Set initial pulse wide
// Configure Module 2 to PWM16 mode
PCA0CPM2 = 0xcb; // 16 bit PWM mode,DISABLE ECCF0
PCA0CPL2=0xff;
PCA0CPH2 =0x7f; // Set initial pulse wide
// Configure Module 1 to PWM16 mode
PCA0CPM3 = 0xcb; // 16 bit PWM mode,DISABLE ECCF0
PCA0CPL3=0xff;
PCA0CPH3 =0x7f; // Set initial pulse wide
EIE1|=0x08;
// Start PCA counter
CR = 1;
}
/*
void PWM_dispose(base)
uint xdata *data base;
//uchar xdata *data st;
{
//设置偏心变化值对应的PCA相应值
//假定偏心量程300微米
uint data temp2_pwm_pwm;
float xdata temp4_pwm;
xdata signed char aa_pwm,bb_pwm;
//设置轴向位移变化值对应的PCA相应值
//轴向位移量程+/-2mm
//轴向位移01 ch1
aa_pwm=my_para[2]>>8;
bb_pwm=my_para[2]&0xff;
aa_pwm=abs(aa_pwm)+abs(bb_pwm);
temp4_pwm=52428*(float)array1[0]/aa_pwm/10;
temp2_pwm_pwm=*(base+1);
temp4_pwm+=(float)temp2_pwm_pwm;
if(temp4_pwm>65535) temp4_pwm=65535;
else if(temp4_pwm<13107) temp4_pwm=13107;
else;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg1)
temp2_pwm=13107;
// temp2_pwm=65535; //调试
PCA0CPL0=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH0=(uchar)temp2_pwm;
//设置轴向位移变化值对应的PCA相应值
//轴向位移量程+/-2mm
//轴向位移ch2/
aa_pwm=my_para[15]>>8;
bb_pwm=my_para[15]&0xff;
aa_pwm=abs(aa_pwm)+abs(bb_pwm);
temp4_pwm=52428*(float)array1[1]/aa_pwm/10;
temp2_pwm=*(base+5);
temp4_pwm+=(float)temp2_pwm;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg2)
temp2_pwm=13107;
PCA0CPL1=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH1=(uchar)temp2_pwm;
//ch3
//轴向位移2
temp4_pwm=52428*array1[2]/my_para[28]+13107;
if(temp4_pwm>65535) temp4_pwm=65535;
else if(temp4_pwm<13107) temp4_pwm=13107;
else;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg3)
temp2_pwm=13107;
// temp2_pwm=65535; //调试
PCA0CPL2=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH2=(uchar)temp2_pwm;
//ch4
//设置胀差变化值对应的PCA相应值
//胀差量程-3--+5mm(假定)
temp4_pwm=52428*(float)array1[3]/my_para[41]+13107;
if(temp4_pwm>65535) temp4_pwm=65535;
else if(temp4_pwm<13107) temp4_pwm=13107;
else;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg4)
temp2_pwm=13107;
// temp2_pwm=65535; //调试
PCA0CPL3=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH3=(uchar)temp2_pwm;
}*/
/**********************************/
/*PCA0的CCF0中断方式设置及服务程序*/
/**********************************/
/*extern int m,bb_pwm;*/
/*void PCA0_Init (void)
{
// configure PCA time base to use SYSCLK; overflow interrupt disabled
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x08; // Time base uses SYSCLK/4,产生波形频率为84赫兹左右
// Configure Module 0 to Frequency Output mode to toggle at 2*FREQ
PCA0CPM0 = 0xc3; // 16 bit PWM mode,ENABLE ECCF
PCA0CPL0=0xff;
PCA0CPH0 =0x7f; // Set frequency
// Start PCA counter
// CR = 1;
}*/
void PCA_ISR (void) interrupt 9 using 2
{
if(CCF0)
{
CCF0=0;
//设置轴向位移变化值对应的PCA相应值
//轴向位移量程+/-2mm
//轴向位移01 ch1
aa_pwm=my_para[2]>>8;
bb_pwm=my_para[2]&0xff;
aa_pwm=abs(aa_pwm)+abs(bb_pwm);
temp4_pwm=52428*(float)array1[0]/aa_pwm/10;
temp2_pwm=*(base+1);
temp4_pwm+=(float)temp2_pwm;
if(temp4_pwm>65535) temp4_pwm=65535;
else if(temp4_pwm<13107) temp4_pwm=13107;
else;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg1)
temp2_pwm=13107;
// temp2_pwm=65535; //调试
PCA0CPL0=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH0=(uchar)temp2_pwm;
}
if(CCF1)
{
//设置轴向位移变化值对应的PCA相应值
//轴向位移量程+/-2mm
//轴向位移ch2/
CCF1=0;
aa_pwm=my_para[15]>>8;
bb_pwm=my_para[15]&0xff;
aa_pwm=abs(aa_pwm)+abs(bb_pwm);
temp4_pwm=52428*(float)array1[1]/aa_pwm/10;
temp2_pwm=*(base+5);
temp4_pwm+=(float)temp2_pwm;
if(temp4_pwm>65535) temp4_pwm=65535;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg2)
temp2_pwm=13107;
PCA0CPL1=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH1=(uchar)temp2_pwm;
}
if(CCF2)
{
//ch3
//轴向位移2
CCF2=0;
temp4_pwm=52428*array1[2]/my_para[28]+13107;
if(temp4_pwm>65535) temp4_pwm=65535;
else if(temp4_pwm<13107) temp4_pwm=13107;
else;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg3)
temp2_pwm=13107;
// temp2_pwm=65535; //调试
PCA0CPL2=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH2=(uchar)temp2_pwm;
}
if(CCF3)
{
//ch4
//设置胀差变化值对应的PCA相应值
//胀差量程-3--+5mm(假定)
CCF3=0;
temp4_pwm=52428*(float)array1[3]/my_para[41]+13107;
if(temp4_pwm>65535) temp4_pwm=65535;
else if(temp4_pwm<13107) temp4_pwm=13107;
else;
temp2_pwm=(uint)temp4_pwm;
if(bypass_sg4)
temp2_pwm=13107;
// temp2_pwm=65535; //调试
PCA0CPL3=(uchar)(temp2_pwm&0x0ff);
temp2_pwm>>=8;
PCA0CPH3=(uchar)temp2_pwm;
}
}