📄 func.c
字号:
#include "f2407_c.h"
#include "math.h"
#include "var.h"
unsigned int period;
unsigned int duty;
unsigned int index_pwm=0;
unsigned int a,b,c,aaa=0;
unsigned int xs=1;
#define PI 3.1415926
extern float sin_table[99];
unsigned int adc_res=100;
unsigned int I_result[I_LOOP/I_DIV];
unsigned int i=0;
float fv_cn = 0;
unsigned int key_flag;
#define LED port30
volatile ioport unsigned int port30; /*LED*/
/****************************** MAIN ROUTINE ***************************/
void ini(void)
{
*SCSR1 = 0x00FD;
*SCSR2 = (*SCSR2 | 0x000B) & 0x000F;
*WDCR = 0x00E8;
WSGR = 0x0040;
*MCRA = 0x0fc0; /* group A pins */
*MCRB = 0xFE00; /* group B pins */
*MCRC = 0x0000; /* group C pins */
*PFDATDIR = *PFDATDIR | 0x2000;
*T1CON = 0x0000; /* disable timer 1 */
*T2CON = 0x0000; /* disable timer 2 */
*GPTCONA = 0x0080; /* configure GPTCONA */
*T1CNT = 0x0000; /* clear timer counter */
*T1PR = pwm_half_per; /* set timer period */
*DBTCONA = 0x0000; /* deadband units off */
*ACTRA = 0x0666; /* PWM1 pin set active high */
*COMCONA = 0x8200; /* configure COMCON register */
*T1CON = 0x0840; /* configure T1CON register */
*T2CNT = 0x0000; /* clear timer counter */
*T2PR = timer2_per; /* set timer period */
*T2CON = 0xD740; /* configure T2CON register */
fv_cn = (312500.0/(num_f_d*U_DC*F_V_radio));
*IMR = 0x0000; /* clear the IMR register */
*IFR = 0x003F; /* clear any pending core interrupts */
*IMR = 0x0004; /* enable desired core interrupts (in1,in3)*/
*EVAIFRA = 0xFFFF; /* clear all EVA group A interrupts */
*EVAIFRB = 0xFFFF; /* clear all EVA group B interrupts */
*EVAIFRC = 0xFFFF; /* clear all EVA group C interrupts */
*EVAIMRA = 0x0000; /* enable desired EVA group A interrupts */
*EVAIMRC = 0x0000; /* enable desired EVA group C interrupts */
*EVBIFRA = 0xFFFF; /* clear all EVB group A interrupts */
*EVBIFRB = 0xFFFF; /* clear all EVB group B interrupts */
*EVBIFRC = 0xFFFF; /* clear all EVB group C interrupts */
*EVBIMRA = 0x0000; /* enable desired EVB group A interrupts */
*EVBIMRB = 0x0000; /* enable desired EVB group B interrupts */
*EVBIMRC = 0x0000; /* enable desired EVB group C interrupts */
}
void init_adc(void)
{
*ADCTRL1=0x00;
*ADCTRL2=0x0504;
*MAX_CONV=0x07;
*CHSELSEQ1=0x3210;
*CHSELSEQ2=0x7654;
}
void adc_soc(void)
{
*T4CON=*T4CON|0x40;
}
void interrupt adcint(void)
{
asm(" clrc SXM");
if(!(i%I_DIV))
{
adc_res=*RESULT5>>6;
I_result[i/I_DIV]=*RESULT0>>6;
if(adc_res>0x3fe)adc_res=0x3fe;
if(adc_res<0x01)adc_res=0x01;
*ADCTRL2|=0x4200;
*T2PR=1.76*adc_res+190; /* +180为控制最高速 */
b_time=fv_cn/((float)*T2PR)-0.15;
if(b_time<0.1)b_time=0.05;
}
i++;
if(i>=I_LOOP)
i = 0;
asm(" CLRC INTM");
}
interrupt void timer2_isr(void)
{
*EVAIFRB = *EVAIFRB & 0x0001; /* clear T2PINT flag */
a=*CMPR1=xs*0.1*b_time*pwm_half_per*(0.5+0.5*sin_table[index_pwm%num_f_d]);
b=*CMPR2=xs*0.1*b_time*pwm_half_per*(0.5+0.5*sin_table[(index_pwm+((2*num_f_d)/3))%num_f_d]);
c=*CMPR3=xs*0.1*b_time*pwm_half_per*(0.5+0.5*sin_table[(index_pwm+((num_f_d)/3))%num_f_d]);
index_pwm++;
if(index_pwm>=num_f_d)index_pwm=0;
}
void key(void)
{
key_flag = *PEDATDIR & 0x007E;
switch(key_flag)
{
case 2: /******启动******/
LED=0x00FE;
*PFDATDIR = 0xFFFB;
xs=0;
*IMR |= 0x0001; /* 开中断*/
*EVAIMRB = 0x0001; /* 开 EVA group B interrupts */
for(xs=5;xs<10;xs++) /* startyan shi */
{
delay5s();delay5s();delay5s();delay5s();
}
break;
case 4: /******停止******/
LED=0x00FD;
*PFDATDIR = 0xFFFB;
a=*CMPR1=0;
b=*CMPR2=0;
c=*CMPR3=0;
*IMR &= 0xFFFE; /*关中断*/
*EVAIMRB = 0x0000; /* 关 EVA group B interrupts */
break;
case 8: /******SPWM******/
LED=0x00FB;break;
case 16: /*****SVPWM*****/
LED=0x00F7;break;
case 32: /******正转******/
LED=0x00EF;break;
case 64: /******反转******/
LED=0x00DF;break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -