📄 main.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 + -