📄 aaa.c.bak
字号:
CAPCOML2 = (W_Ton & 0x00FF);
CAPCOMH2 = (W_Ton >> 8);
} //66
////////////////////////////////////////////
//下一个采样点
P_flag = ~P_flag; //奇偶点变换
K++; //下一个采样点值
Tm++;
U_angle = K*180/N;
V_angle = U_angle + 120;
W_angle = U_angle + 240;
if (P_flag == 0)
{
// U_Toff =k1* ((Half_Ts * (0xffff - M*(sin_angle(U_angle))))>>16);
// V_Toff =k1* ((Half_Ts * (0xffff - M*(sin_angle(V_angle))))>>16);
// W_Toff =k1* ((Half_Ts * (0xffff - M*(sin_angle(W_angle))))>>16);
U_Toff =((Half_Ts * (0xffff - M*(sin_angle(U_angle))))>>16);
V_Toff =((Half_Ts * (0xffff - M*(sin_angle(V_angle))))>>16);
W_Toff =((Half_Ts * (0xffff - M*(sin_angle(W_angle))))>>16);
}
else
{
U_Ton =((Half_Ts * (0xffff + M*(sin_angle(U_angle))))>>16);
V_Ton =((Half_Ts * (0xffff + M*(sin_angle(V_angle))))>>16);
W_Ton =((Half_Ts * (0xffff + M*(sin_angle(W_angle))))>>16);
}
// if (P_flag == 0)
// {
// U_Toff = (417 * (0x400000 - M*(sin_angle(U_angle))))>>22;
// V_Toff = (417 * (0x400000 - M*(sin_angle(V_angle))))>>22;
// W_Toff = (417 * (0x400000 - M*(sin_angle(W_angle))))>>22;
// }
// else
// {
// U_Ton = (417 * (0x400000 + M*(sin_angle(U_angle))))>>22;
// V_Ton = (417 * (0x400000 + M*(sin_angle(V_angle))))>>22;
// W_Ton = (417 * (0x400000 + M*(sin_angle(W_angle))))>>22;
//
//
// }
// aa=0;
if ( K==2*N )
{ K=0;
// P_flag = 0;
}
}
/****************************************************************************
*死区指令延时,应实测,要考虑中断影响
* 10个temp 延时约6us
****************************************************************************/
void delay1()
{
char temp;
EA=0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
temp = 0;
EA=1;
}
/***************************************************************************
*定时器0初始化
***************************************************************************/
void timer0_init (void)
{
EA = 0; /* disable interrupts */
TR0 = 0; /* stop timer 0 */
TMOD &= 0xF0; /* clear timer 0 mode bits - bottom 4 bits */
TMOD |= 0x01; /* put timer 0 into 16-bit no prescale */
timer0_value = 0x10000-Ts; //采样周期=1/2载波周期
TL0 = (timer0_value & 0x00FF);
TH0 = (timer0_value >> 8);
// PT0 = 1; /* set high priority interrupt for timer 0 */
PT0 = 0;
ET0 = 1; /* enable timer 0 interrupt */
TR0 = 1; /* start timer 0 */
EA = 1; /* enable interrupts */
}
/***************************************************************************
*PCA中断服务程序
***************************************************************************/
static void PCA_isr (void) interrupt PCA_VECTOR using 1
{
unsigned char PCA_status;
PCA_status = PCASTA; //读PCA中断状态
if ( PCA_status & 0x01) //TCM0中断,U相
{
if (P_flag==0)
{
P4_3 = 1; //偶数采样中断到,关V4 延时 开V1
delay1();
P4_0 = 0;
}
else
{
P4_0 = 1; //奇数采样中断到,关V1 延时 开V4
delay1();
P4_3 = 0;
}
PCASTA &= 0xFE;
}
if ( PCA_status & 0x02) //TCM1中断,V相
{
if (P_flag==0)
{
P4_5 = 1; //偶数采样中断到,关V6 延时 开V3
delay1();
P4_2 = 0;
}
else
{
P4_2 = 1; //奇数采样中断到,关V3 延时 开V6
delay1();
P4_5 = 0;
}
PCASTA &= 0xFD;
}
if ( PCA_status & 0x04) //TCM2中断,W相
{
if (P_flag==0)
{
P4_4 = 1; //偶数采样中断到,关V5 延时 开V2
delay1();
P4_1 = 0;
}
else
{
P4_1 = 1; //奇数采样中断到,关V2 延时 开V5
delay1();
P4_4 = 0;
}
PCASTA &= 0xFB;
}
// PCASTA &= 0x00; //清PCA中断状态
}
//PCA0初始化
void PCA_init()
{
unsigned int PCA0;
//0.1 Configure pins as PCA function
// P4SFS0=0xff;
// P4SFS1=0;
//0.2 initialize PCA0 counter
PCACL0=PCACH0=0;
PCACL1=PCACH1=0;
//1.2 select PCA0CLK as PCA0 clock source
//PCA0时钟为fosc,timer0_isr中Toff,Ton计数值*12 再写入比较寄存器
// CCON2=0x10;
CCON2=0x12; //fosc/4
//Stop PCA0 counter
PCACON0=0x00;
//3. Set TCM0 operationg mode,16bit soft timer , enable softimer interrupt
// TCMMODE0=0x48;
TCMMODE0=0xC8;
TCMMODE1=0xC8;
TCMMODE2=0xC8;
CAPCOML0 = (PCA0 & 0x00FF);
CAPCOMH0 = (PCA0 >> 8);
// 开PCA中断
IEA |= 0x20;
IPA |= 0X20; // set high priority interrupt for PCA0
//5. Start PCA0 counter
PCACON0|=0x40;
}
/******************************************************************************
* uint getVA(channel)
*功能描述:读取输出电压,电流值
*参 数:channel,选择读取通道
*****************************************************/
void getVA (uchar channel)
{
code uchar str_v[] = {"The V and A is:"};
//uchar temp1;
uint temp;
unsigned long int value;
uchar vv[3];
// ADC_EnableAll();
ADC_Init(channel);
clrlcd();
printchar(1,1,'v');
printstr(0,0,str_v);
printchar(2,1,0x3a);
printchar(4,1,0x2e) ; //"."
printchar(7,1,'V') ;
value = ADC_Read(channel);
temp = value*150; //或者88.temp = (value*2.5/1023)*1000*k
// temp1 = value % 51;
// if(temp1 >= 26)temp++;
vv[3] = temp%10; //小数点后第3位
vv[2] = (temp/10)%10; //小数点后第2位
vv[1] = temp/100; //小数点后第1位
// clrlcd();
// printchar(1,1,'v');
// printchar(2,1,0x3a);
printchar(3,1,vv[0]+48);
printchar(4,1,vv[1]+48);
printchar(5,1,0x2e) ; //"."
;
printchar(6,1,vv[2]+48);
//printchar(7,1,vv[3]+48);
//printchar(8,1,'V') ;
printchar(10,1,'I') ;
printchar(11,1,0x3a) ; //":"
printchar(15,1,'A') ; //"."
//keyv=getkey();}while(keyv == 0x0e);
}
/**************************************************************
* getPf()
*进入算功率,读频率程序
***************************************************************/
void getPf (void)
{ code uchar str_pf[] = {"The f and P is:"};
clrlcd();
printstr(0,0,str_pf);
printchar(1,1,'f');
printchar(2,1,0x3a); //":"
printchar(3,1,pinlv[0]+48);
printchar(4,1,pinlv[1]+48);
printchar(5,1,pinlv[2]+48);
printchar(6,1,'H');
printchar(7,1,'z');
printchar(9,1,'P');
printchar(10,1,0x3a); //":"
printchar(14,1,'W');
}
/***********************************************************
* void dat_get (void)
*进入输入频率程序
***********************************************************/
void dat_get (void)
{
void pwmwork(void );
code uchar hz[]={"Hz"};
code uchar putf[] = {"Please Input f:"};
uchar i;
clrlcd();
printstr(0,0,putf);
printchar(4,1,102); // "f"
printchar(5,1,58); // ":"
do{keyv=getkey();}while(keyv==0x0e); //有数字键按下则开始输入频率
for(i=0;i<3;i++)
{
do{
pinlv[i] = keyv;
printchar(6+i,1,keyv+48);
keyv=getkey();
}while(keyv!=0x0e);
if(i<=1)
{
do{keyv=getkey();}while((keyv == 0x0e)); // && (i != 0x02)
}
}
printstr(9,1,hz);
delay1ms(500);
pwmwork(); //开始PWM
}
/*********************************************************************
* m_get()
*输入调制度
*********************************************************************/
/* void m_get(void )
{
xdata uchar i,j=2;
// code uchar ok[]={"OK"};
code uchar putm[] = {"Please Input M:"};
clrlcd();
printstr(0,0,putm);
printchar(4,1,77); // "M"
printchar(5,1,58); // ":"
do{keyv=getkey();}while(keyv==0x0e); //有数字键按下则开始输入频率
for(i=0;i<3;i++)
{
do{
mm[i] = keyv;
printchar(6+i,1,keyv+48);
keyv=getkey();
}while(keyv!=0x0e);
if(i<=1)
{
do{keyv=getkey();}while((keyv == 0x0e)); // && (i != 0x02)
}
}
printstr(14,1,OK);
delay1ms(300);
pwmwork(); //开始PWM
} */
/**********************************************************
*key_deal
键盘处理
***********************************************************/
void key_deal(void)
{
code uchar str_d0 [] ={"A:Input Fre:"};
code uchar str_d1 [] ={"B:Get V and A:"};
code uchar str_d2 [] ={"C:Get f and P:"};
code uchar str1[] = {"Please Choose:"};
// code uchar str_m[] = {"D:Input the M:"};
// do{ keyv=getkey(); }while(keyv != 0x0e);// 开始
clrlcd();
printstr(0,0,str1); //Please input
do{keyv=getkey();} while(keyv==0x0e);
switch (keyv=getkey())
{
case 0x0a:{
clrlcd();
printstr(0,0,str1);
printstr(0,1,str_d0); //输入频率
do{keyv=getkey();}while(keyv==0x0a);
if(keyv==0x0e)
{
printstr(14,1,OK);
delay1ms(500);
dat_get() ;
} break; //输入频率值
}
case 0x0b:{
clrlcd();
printstr(0,0,str1);
//得到电压和电流
printstr(0,1,str_d1);
delay1ms(15);
do{keyv=getkey();}while(keyv==0x0b);
if(keyv==0x0e) //确认键
{
printstr(14,1,OK);
delay1ms(700);
getVA (0);
}
break;
}
case 0x0c:{
clrlcd();
printstr(0,0,str1); //算得功率,再次输入频率
printstr(0,1,str_d2);
delay1ms(15);
do{keyv=getkey();}while(keyv==0x0c);
if(keyv==0x0e)
{
printstr(14,1,OK);
delay1ms(500);
getPf();
}
break;
}
/* case 0x0d: {
clrlcd();
printstr(0,0,str1);
printstr(0,1,str_m); //"Input the M:"
do{keyv=getkey();}while(keyv==0x0d);
if(keyv==0x0e)
{
printstr(14,1,OK);
delay1ms(500);
m_get() ; //输入调制度
} break;
} */
default: break;
}
}
/****************************************************
**********主程序*************
*****************************************************/
void main (void)
{
code uchar str0[] = {"Welcome!"};
code uchar str1[] = {"Please opt step:"};
POWK = 1; //电源关
POWZ = 1;
PSD33_reg.CONTROL_A = 0; //MCU I/O模式
PSD33_reg.DIRECTION_A =0xff; //输出模式
init_lcd();
ADC_EnableAll();
printstr(4,0,str0); //"Welcom!"
printstr(0,1,str1); //"Please opt step:"
delay1ms(10);
do{ keyv=getkey(); }while(keyv != 0x0e);
key_deal();
}
void pwmwork(void)
{
unsigned char ADC_channel;
unsigned long ADC_result;
uchar f;
int du,err1,err2,uad;
// POWK = 0; //电源关
// POWZ = 0;
CCON0=0x10;
ADC_Init (0) ;
Ts = 1667; //采样周期,晶振40M,则载波为1/(Ts*T)
Half_Ts = 833*3; //半采样周期
// k1=120;
K_M = 256; //调制系数放大倍数
K_F = 256; //输入频率放大倍数
// K_sin = 256; //sin表放大倍数
// K_coe = K_M * K_sin; //总放大倍数,K_M * K_sin;
F_min = 100; //最小频率
f = pinlv[0]*100 + pinlv[1]*10 + pinlv[0] ;
F = K_F * f;
// M = mm[0]*100 + mm[1]*10 + mm[2];
M = 160;
N = (K_F*1000)/F ; // N = 1000/f;载波为1K
POWK = 0;
delay1ms(1000);
POWZ = 0;
ST = 0; //脉冲芯片使能
if ( F > F_min)
{
first();
timer0_init();
PCA_init();
}
//主循环,一个采样周期后,读取AD的给定频率值重新计算调制度M和载波比N
//如果计算时间不够的话,可以另设M2,N2变量,在定时器中断程序中判断K=2*N时,
//将主循环中的计算值M2,N2赋给M,N进行计算
while(1)
{
if(Tm==240)
{
Tm = 0;
uad = ADC_Read(0 );
err1 = u36 - uad;
du =(err1 - err2)/4;
M = M + du;
err2 = err1;
}
keyv = getkey();
while(keyv!=0x0e)key_deal();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -