⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srm_c7.c

📁 开关磁阻电机的速度控制程序
💻 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 + -