📄 1phase.c
字号:
#include "C240.h"
/* define constant value */
#define FALSE 0
#define TRUE 1
#define VELOCITY_CONST 1562500 /* Velocity contant */
/* define variable */
unsigned int IA_max,IB_max,IC_max; /* MAX limit for current */
unsigned int IA_min,IB_min,IC_min; /* MIN limit for current */
unsigned int I_MIN,I_MAX;
unsigned int ADC_channel; /* Channel for A/D convert */
static unsigned int PBvalue[2][3]=
{{0x0701,0x0701,0x0701},{0x0701,0x0701,0x0701} };
int display_times; /* accumulation for display */
int capture1,capture2,capture3 ;
int A_capflag;
int input_state;
int sign_state ; /* 1 is clockwise,0 is anticlockwise */
int dot_state;
int inputdata_num; /* number of input data */
int start_mode;
int run_state;
int T3overflow_counter; /* T3 overflow times */
unsigned int angle_on; /* fire angle */
unsigned int angle_off; /* cut off angle */
unsigned int angle;
unsigned int input_value; /* input data value */
unsigned int input_dotbit; /* the radix bit of input data value */
unsigned int position_value; /* the display value of position */
unsigned int position_dotbit; /* the radix bit of position's display value */
unsigned int position; /* the value of position */
unsigned int velocity_value; /* the display value of velocity */
unsigned int velocity_dotbit; /* the radix bit of velocity's display value */
int display_order=1,int_count=0; /* 1 while display velocity ,2 while display current ,3 while display input data */
/* define Input/Output variable value */
ioport unsigned int port0,port1,port2,port3,port4,port5;
/* define structure type and variable value */
/*********************************************/
/*********************************************/
void dsp_setup()
{
unsigned int temp;
/*********************************************/
/* Disable watchdog timer */
/*********************************************/
temp = WDCR;
temp = temp|0x68;
WDCR = temp;
/*********************************************/
/* initialize PLL module (20 MHz XTAL1) */
/*********************************************/
CKCR1 = 0x60; /* crystal=20MHz CPUCLK = 20MHz */
/* and 1x PLL mult ratio */
CKCR0 = 0xc3; /* low–power mode 0, */
/* ACLK enabled, */
/* PLL enabled, */
/* SYSCLK=CPUCLK/2 */
SYSCR = 0x40c0;
XINT1CR=0x0006;
}
/* Initiate the event management register */
void eventmgr_init()
{
GPTCON=0x0042;
/* Initialize PWM */
/* Period is 200us */
ACTR=0x09aa;
CMPR1=0x01f4;
CMPR2=0x01f4;
CMPR3=0x01f4;
DBTCON=0x0000;
COMCON=0x4a57;
COMCON=0xca57; /*pwm enable*/
T1PER=0xfa0;
T1CON=0x0000;
T1CON=0x910e;
/* Initial timer 2 */
/*T2CNT=0x00;
T2PER=0x0190; T2PER=200 ,ADC period is 40us
T2CON=0x9100;
T2CON=0x9140;*/
/* Setup shared pins */
OCRA = 0xf800; /* pins IOPB0–IOPB3 & IOPA0–IOPA2 to I/O pins */
OCRB = 0x00f1; /* pins are: ADSOC, XF, /BIO, CAP1–CAP4 */
PADATDIR = 0x0707; /* outputs IOPA0–IOPA2, set high */
PBDATDIR = 0x0700; /* outputs IOPB0–IOPB2, set low */
/* Initialize T3 */
T3CNT=0x0;
T3PER=0xffff;
T3CON=0x9440; /* Prescaler=/16 */
/* Setup capture units */
CAPCON = 0x0; /* reset capture control register */
CAPFIFO= 0x0ff; /* Clear FIFO’s */
CAPCON = 0xb6fc; /* enable #123, use Timer3, both edges */
/*CAPCON = 0xb654;*/ /* cap high edge */
/* Setup ADC units */
ADCTRL1=0xc904; /* enable ADC1,use channel 2,and enable ADCINT */
ADCTRL2=0x0005;
ADCTRL1=0xca05;
T1CON=0x914e; /* enable PWM output */
}
/*******************************************************************/
void disable_interrupts()
{
asm(" SETC INTM");
}
/************************************************************************/
void enable_interrupts()
{
IFR = 0xffff; /* Clear pending interrupts */
IFRA = 0xffff;
IFRB = 0xffff;
IFRC = 0xffff;
IMR = 0x000a; /* Enable CPU Interrupts:INT 2,3,4 */
IMRA = 0x0080; /* Enable timer 1 period interrupts */
IMRB = 0x0010; /* Enable timer 3 period and compare interrupts */
IMRC = 0x0007; /* Enable CAP123 interrupts*/
asm(" CLRC INTM"); /* Global interrupt enable */
}
/* initiating parameter and register */
void init_SRM()
{
velocity_value=0;
velocity_dotbit=4;
position_value=position=0;
T3overflow_counter=0;
position_dotbit=4;
input_value=0;
input_dotbit=4;
display_times=0;
input_state=FALSE;
dot_state=FALSE;
display_order=3;
inputdata_num=0;
start_mode=TRUE;
ADC_channel=2;
/* 0x8000 is 2.5v,0A ;1A is corresponding to the delta of 0x3d6 or 982*/
I_MAX=0x8f58; /* 4A, Voltage from LEM is 2.78v */
I_MIN=0x8d6d; /* 3.5A, Voltage from LEM is 2.659V */
}
/********************************************************** */
/* READ CAPTURE FIFO REGISTERS
/* This routine is used to read the data from the capture FIFO
/* registers.
/*
/* inputs: capture = which FIFO to read?
/* range = 1–3
/* outputs fifo_data =
/* range = 0–65535
/********************************************************* */
/* ISR for GPT1 interrupt */
void c_int2()
{int watch_IRR;
watch_IRR=IFR;
IFR=0x0002;
watch_IRR=IFR; /* clear CPU interrupt flag */
if (watch_IRR=36)
IFR=0x0004;
watch_IRR=IFR;
IFRA=0x7ff;
watch_IRR=IFRA;
display_times++;
}
/* ISR for CAP unit interrupt */
void c_int4()
{
int groupc_flags;
int capture;
struct CAP_INT * p,* p1;
IFR=0x0008; /* clear CPU interrupt flag */
groupc_flags = IFRC;
int_count++;
if (1)
{ if (groupc_flags & 0x1) /* read event manger interrupt */
{
/* capture #1 */
IFRC = 0xf9; /* clear flag register */
capture = 1;
if (A_capflag)
PBDATDIR=0x0701 ;
}
else if (groupc_flags & 0x2) /* read event manger interrupt */
{
/* capture #1 */
IFRC = 0xfa; /* clear flag register */
capture = 2;
A_capflag=1;
PBDATDIR= 0x0702 ;
}
else if (groupc_flags & 0x4) /* read event manger interrupt */
{
/* capture #1 */
IFRC = 0xfc; /* clear flag register */
capture = 3;
A_capflag=1;
PBDATDIR= 0x0704 ;
}
else
{
/* not a valid capture */
IFRC = 0xff;
capture = 0;
}
T3overflow_counter=0;
}
else
IFRC = 0xff;
}
/*************************************/
void keyboard_ISR()
{int i;
unsigned int scan_in,scan_out,x2;
int row,column=0,key_NO; /* row=0,1,2; column=1,2,3,4 */
row=4;
for(i=0;i<7500;i++);
scan_in=port5;
x2=scan_in & 0x0f;
if (x2!=0x0f)
{
switch(x2)
{
case 0x0e: column=4;
break;
case 0x0d: column=3;
break;
case 0x0b: column=2;
break;
case 0x07: column=1;
break;
default : column=17;
}
scan_out=0x0f7;
port0=scan_out; /* scan keyboard */
for(i=0;i<1000;i++);
scan_in=port5;
while ((scan_in & 0x0f)==0x0f)
{
scan_out=scan_out>>1;
port0=scan_out;
for(i=0;i<1000;i++);
scan_in=port5;
row--;
if (row==0)
{
row=17;
break;
}
}
key_NO=4*(row-1)+column;
port0=0x00;
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
for(i=0;i<7500;i++);
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
switch(key_NO)
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 : if (input_state==FALSE) /* deal with data keyboard */
break;
if (dot_state)
input_dotbit--;
input_value=input_value*10+key_NO-1;
inputdata_num++;
break;
case 11 : if (input_state==FALSE) /* deal with radix point keyboard */
break;
if (dot_state)
break;
if (inputdata_num!=0)
{
input_dotbit=3;
dot_state=TRUE;
break;
}
case 12 : if (input_state==FALSE) /* deal with data keyboard */
break;
sign_state++;
if (sign_state==2)
{ sign_state=0;
/*PBDATDIR = 0x0704; */
A_capflag=0;
CAPCON = 0xb6a8; /* cap rising edage */
}
else
{
/*PBDATDIR = 0x0702;*/
A_capflag=0;
CAPCON = 0xb654; /* cap falling edage */
}
break;
case 13 : disable_interrupts();
run_state=0;
A_capflag=0;
sign_state=1;
CAPCON = 0xb654; /* cap falling edge */
input_state=TRUE;
capture1=capture2=capture3=1;
PBDATDIR = 0x0701; /* outputs IOPB0–IOPB2, IOPB0 set high */
enable_interrupts();
break;
case 14 : display_order++;
if (display_order==4)
display_order=1;
break;
case 15 :
run_state=1;
if (sign_state)
PBDATDIR = 0x0702;
else
PBDATDIR = 0x0704;
break;
case 16 : run_state=0;
PBDATDIR = 0x0703; /* outputs IOPA0–IOPA2, IOPA0 set high */
break;
default : break;
}
}
}
/***************************/
void c_int6()
{
IFR=0x0020;}
/* ***************************************************************** */
/* The main program
/* ***************************************************************** */
main()
{
unsigned int x1;
disable_interrupts();
dsp_setup();
eventmgr_init();
init_SRM();
enable_interrupts();
PADATDIR = 0x0701;
/*PBDATDIR = 0x0702;
PBDATDIR = 0x0704;
PBDATDIR = 0x0701;
PBDATDIR = 0x0702;
PBDATDIR = 0x0704; */
for(;;)
{/*PADATDIR = 0x0701;
PBDATDIR = 0x0701;
PADATDIR = 0x0702;
PBDATDIR = 0x0702;
PADATDIR = 0x0704;
PBDATDIR = 0x0700;
port0=0x00;*/}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -