?? 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 + -