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

📄 main.c

📁 正弦波驱动电机伺服控制汇编语言源程序!可应用于永磁同步电机
💻 C
字号:
//======================================================
//  The information contained herein is the exclusive property of
//  Sunnnorth Technology Co. And shall not be distributed, reproduced,
//  or disclosed in whole in part without prior written permission.
//             (C) COPYRIGHT 2006  SUNNORTH TECHNOLOGY CO.
//                          ALL RIGHTS RESERVED
//  The entire notice above must be reproduced on all authorized copies.
//========================================================

//============================================================
//	工程名称:	Exa03_IODOut_C
//  编者:		张培星
//	功能描述:	与IOD低八位相连接的LED闪烁,闪烁频率2Hz
//				延时采用软件延时
//	组成文件:	main.c
//				spmc75f2413a.h, unspmacro.h
//	硬件连接:	SPMC75F2413A的新版EVM板
//	完成日期:	2006-3-15
//============================================================
#include "Spmc75_regs.h"
#include "unspmacro.h"
//============================================================
//============================================================
extern int iSin_TAB[];
	
		//占空比计算函数,汇编语言
		//*p_Data为占空比暂存空间首地址,uiK为电压调整系数													
void SPWM_AM_MUL(int *p_Data,unsigned int uiK);	
		//查表步进值计算函数,汇编语言	
		//a为平率设定值,b为频率调整常数	
unsigned int ASM_MUL(unsigned int a,unsigned int b);

void MCP4_T_PWM_init();		//MCP4初始化函数
void SPWM_SET_F(int F);		//频率设定函数
void SPWM_SET_V(int V);		//电压设定函数
void SPWM_ISR(void);		//中断服务函数
//============================================================
//============================================================
static unsigned int uiSPWM_phases_Add ;		//相位累加和
static unsigned int uiPhases_Temp;	   		//查表的步进值
static unsigned int SET_F;					//电机给定频率,扩大100倍
static unsigned int SET_V;					//电机给定电压,0~65535
//============================================================
//============================================================
int	main(void)
	{
		Disable_FIQ_IRQ();		//禁止中断
		
		SPWM_SET_F(5000);		//频率设定50Hz
		SPWM_SET_V(65535);		//电压调整,0~65535
		
		uiPhases_Temp = ASM_MUL(SET_F,3221);  //确定查表步进值uiPhases_Temp
	
		MCP4_T_PWM_init();		//MCP4初始化
				
    	INT_IRQ();				//开IRQ中断

		while(1);
	}
//===================================================================
//频率设定函数
//===================================================================
	void SPWM_SET_F(int F)
	{  	
		SET_F = F;
	}	
//===================================================================
//电压设定函数
//===================================================================
	void SPWM_SET_V(int V)
	{  	
		SET_V = V;
	}	
//===================================================================
//该函数为MCP4中断服务函数,负责更新各参数值
//===================================================================
	void SPWM_ISR(void)
	{
        unsigned int uiSPWM_phases_Add_U;
        unsigned int uiSPWM_phases_Add_V;
        unsigned int uiSPWM_phases_Add_W;
        unsigned int iNEW_Data[3];		
        										
		uiSPWM_phases_Add += uiPhases_Temp;   	//相位值累加
		if(uiSPWM_phases_Add >= 57600)			//57600 = 900 X 64,乘64是为了减小误差
		   uiSPWM_phases_Add -= 57600; 			//防止溢出 
		     		   
		uiSPWM_phases_Add_U = uiSPWM_phases_Add >> 6 ;   		//除以64,得到U相查表位置
		uiSPWM_phases_Add_V = uiSPWM_phases_Add_U + 300;    	//得到V相查表位置
		  if(uiSPWM_phases_Add_V >= 900) uiSPWM_phases_Add_V -= 900;
		uiSPWM_phases_Add_W = uiSPWM_phases_Add_U + 600;    	//得到W相查表位置
		  if(uiSPWM_phases_Add_W >= 900) uiSPWM_phases_Add_W -= 900;

    	iNEW_Data[0] = iSin_TAB[uiSPWM_phases_Add_U];		//取三相正弦表的值							
    	iNEW_Data[1] = iSin_TAB[uiSPWM_phases_Add_V];
    	iNEW_Data[2] = iSin_TAB[uiSPWM_phases_Add_W];
    
    	SPWM_AM_MUL(iNEW_Data,SET_V);		//进行占空比(电压)调整
    	
    			//更新TGRA~TGRC的值,右移6位是防止其值大于TPR	
		P_TMR4_TGRA->W = (unsigned int)iNEW_Data[0] >> 6;		
		P_TMR4_TGRB->W = (unsigned int)iNEW_Data[1] >> 6;
		P_TMR4_TGRC->W = (unsigned int)iNEW_Data[2] >> 6;
		
		P_TMR_LDOK->W |= 0x00AA;	//同步载入占空比
	}

//========================================================================
//========================================================================
	void IRQ3(void) __attribute__ ((ISR));
	void IRQ3(void)
	{
		 if(P_TMR4_Status->B.TPRIF)          
           {    
           		SPWM_ISR();                                      
		    	P_TMR4_Status->B.TPRIF = 1;                    	 
           }
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -