📄 srm_c7.c
字号:
#include "2407c.h"
#include <stdlib.h>
void interrupt gptime1_3(void); /*T1&T3_Period_ISR*/
void interrupt gptime2(void); /*T2_Period_ISR*/
void interrupt PHANTOM(void); /*假中断ISR*/
void Delay(unsigned int nDelay); /*delay subroutine*/
/*************************Variable Definition************************************/
unsigned int uActPhas=0; /*当前导通相,1-A,2-B,3-C*/
unsigned int uState=0; /*控制方式标志,0-CCC,1-APC*/
unsigned int uSpeed=0x7ff0; /*存储速度检测值*/
static unsigned int uSpdRef=2600; /*速度给定值,2931-80r/min,2345-100r/min*/
static unsigned int K1=0; /*比例常数*/
static unsigned int K2=0; /*积分常数*/
unsigned int uDeltaSpd=0;
unsigned int uTemp1; /*临时变量1*/
unsigned int uTemp2; /*临时变量2*/
unsigned int uTemp3; /*临时变量3*/
unsigned int i=0;
unsigned int uWork;
unsigned int uCom=100; /*电流比较值100--1000*/
unsigned int uCurA=0; /*A,B,C相电流检测值*/
unsigned int uCurB=0;
unsigned int uCurC=0;
main()
{
/*************************System Initialization**********************************/
asm(" SETC INTM"); /*屏蔽中断*/
*WDCR=0x68; /*disable watchdog timer*/
*SCSR1=0x028f; /*CLKIN=20MHz,CLKOUT=40MHz,使能EVA,EVB,ADC*/
/***********************Pins Initialization**************************************/
*MCRA|=0x0fd8; /*设置PWM1-6,QEP1-2*/
*PCDATDIR=0xffff; /*测试用的引脚配置*/
/************************ADC Initialization**************************************/
*ADCTRL1=0x0040; /*ADC预分频1,10MHZ,continuous run mode*/
*MAXCONV=0x02; /*3个通道*/
*CHSELSEQ1=0x0210; /*选择ADCIN0,1,2通道*/
(*ADCTRL2)|=0x2000; /*启动AD转换*/
/***********************Initialize Phase A Position******************************/
*COMCONA=0x200; /*能pwm引脚*/
*T1CON=0x1040; /*连续增计数方式,预分频为1,允许T1*/
*ACTRA=0x00ff; /*C相通电*/
for(i=0;i<0x20;i++)
Delay(0xff); /*延时,等待转子转到A相对极位置*/
*ACTRA=0x0ff0; /*A相通电*/
for(i=0;i<0x40;i++)
Delay(0xff); /*延时,等待转子转到A相对极位置*/
/************************EVA Initialization**************************************/
*COMCONA=0x200; /*使能pwm引脚*/
*ACTRA=0x0fff; /*引脚PWM1-6强制高*/
*T1PR=2000; /*周期寄存器值800(50kHz)*/
*T1CNT=0;
*T1CON=0x1040; /*连续增计数方式,预分频为1,允许T1*/
*T2PR=49; /*T2周期寄存器,4000个脉冲一个周期*/
*T2CNT=0; /*编码器计数器初值*/
*T2CON=0x9870; /*定向增减,允许编码接口*/
/************************EVB Initialization**************************************/
*T3PR=30000; /*周期寄存器值,用来定义最低可检测速度(约8 r/min)*/
*T3CNT=0;
*T3CON=0x1740; /*连续增计数方式,预分频为128,允许T3*/
/*************************Variable Initialization********************************/
/**********************************开中断****************************************/
*IFR=0xff; /*清所有系统中断标志*/
*IMR=0x6; /*开INT2,INT3中断*/
*EVAIFRA=0x0fff; /*清除EVA所有中断标志*/
*EVAIFRB=0x0f;
*EVAIFRC=0x0f;
*EVAIMRA=0x0080; /*开T1周期中断*/
*EVAIMRB=0x1; /*开T2周期中断*/
*EVAIMRC=0;
*EVBIFRA=0x0fff; /*清除EVB所有中断标志*/
*EVBIFRB=0x0f;
*EVBIFRC=0x0f;
*EVBIMRA=0x0080; /*开T3周期中断*/
*EVBIMRB=0;
*EVBIMRC=0;
asm(" CLRC INTM"); /*开中断*/
/*~~~~~~~~~~~~~~~~~~~~~~~~initialization over~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/**************************查询T2CNT值,根据转向确定导通相************************/
while(1)
{
}
}
void interrupt gptime1_3(void)
{
uWork=(*PIVR); /*清中断标志*/
*EVAIFRA=0x0fff;
*EVBIFRA=0x0fff;
if(uWork==0x27)
{
uCurA=(*RESULT0)>>6; /*读取转换结果*/
uCurB=(*RESULT1)>>6;
uCurC=(*RESULT2)>>6;
uTemp1=(*T2CNT);
/*计算当前导通相*/
if(uTemp1<=11)
uActPhas=2;
else if(uTemp1<=28)
uActPhas=3;
else if(uTemp1<=44)
uActPhas=1;
else
uActPhas=2;
switch(uActPhas)
{
case 1:
if(uCurA<=uCom)
*ACTRA=0x0ff0; /*A相通电*/
else
*ACTRA=0x0ff3; /*都不通电*/
break;
case 2:
if(uCurB<=uCom)
*ACTRA=0x0f0f; /*B相通电*/
else
*ACTRA=0x0f3f; /*都不通电*/
break;
case 3:
if(uCurC<=uCom)
*ACTRA=0x00ff; /*C相通电*/
else
*ACTRA=0x03ff; /*都不通电*/
break;
default:
*ACTRA=0x0fff; /*都不通电*/
}
}
else
{
uSpeed=0x7fff;
}
asm(" CLRC INTM");
}
void interrupt gptime2(void)
{
uWork=(*PIVR); /*清中断标志*/
*EVAIFRB=0x0f;
uSpeed=(*T3CNT);
*T3CNT=0;
asm(" CLRC INTM"); /*开中断*/
}
void interrupt PHANTOM(void)
{
asm(" CLRC INTM");
}
void Delay(unsigned int nDelay)
{
int i,j,k;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<16;j++ )
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -