📄 bldc3_1.c
字号:
// ==============================================================================
// 系统命名:BLDC31
//
// 文件名:BLDC3_1.C
//
// 描述:此框架程序用于实现对直流无刷电机(BLDC)进行控制
//
// 注:此系统默认的逆变器为ICETEK-MOTOR-E背板
// ==============================================================================
// 主程序使用的头文件声明
#include "target.h" // 定义本系统使用的DSP型号
#include "DSP281x_Device.h" // 电机驱动库头文件
#include "IQmathLib.h" // 浮点运算库
#include "bldc3_1.h" // 本系统使用的数字电机算法库内容
#include "parameter.h" // 系统参数、电机参数
#include "build.h" // 编译参数
/////////////////////////////////////////////////////////////////////
#include "ICETEK-F2812-Ae.h" // ICETEK-F2812-Ae板硬件定义
/////////////////////////////////////////////////////////////////////
// 中断服务程序头定义
interrupt void MainISR(void);
// 全局变量
float32 T = 0.001/ISR_FREQUENCY; // 采样频率,参看parameter.h
Uint32 VirtualTimer = 0;
Uint16 IsrTicker = 0; // 中断计数
Uint16 BackTicker = 0; // 主程序计数
volatile Uint16 EnableFlag = FALSE; // 程序运行标志
// 中断服务程序专用工作变量定义
Uint16 uISRWork;
void main(void) // 主程序开始
{
// ******************************************
// F2812初始化
// ******************************************
// 初始化系统控制寄存器,锁相环,看门狗,时钟为默认状态
InitSysCtrl(); // 详见DSP281x_SysCtrl.c
// 设置HISPCP预分频寄存器,通常设置成默认值
EALLOW; // 关闭保护,使受保护的寄存器可写
SysCtrlRegs.HISPCP.all = 0x0000; // SYSCLKOUT/1
EDIS; // 打开保护
// 清除并禁止所有CPU中断
DINT;
IER = 0x0000;
IFR = 0x0000;
// 初始化Pie控制寄存器为默认状态
InitPieCtrl(); // DSP281x_PieCtrl.c
// 初始化PIE中断向量表 Vector Table To a Known State:
// 此函数设置中断向量表到DSP281x_DefaultIsr.c所指定位置
InitPieVectTable(); // DSP281x_PieVect.c
// 设置: 用户定义的函数,修改向量表,使能中断
////////////////////////////////////////////////////////////////
LBDS=0x00; //熄灭所有用户指示灯
////////////////////////////////////////////////////////////////
// 初始化EVA定时器1/2: 设置相关寄存器
EvaRegs.GPTCONA.all = 0;
// 设置全局定时器2的周期
EvaRegs.T2PR = SYSTEM_FREQUENCY*1000000*T; // 预分频X1 (T2), ISR周期 = T x 1
// 清除全局定时器2的计数/比较寄存器
EvaRegs.T2CNT = 0x0000;
EvaRegs.T2CMPR = 0x0000;
// 等待程序运行标志变成TRUE
while ( EnableFlag==FALSE )
{
BackTicker++; // 程序运行计数加1
}
// 使能全局定时器的周期中断
EvaRegs.EVAIMRB.bit.T2PINT = 1;
EvaRegs.EVAIFRB.bit.T2PINT = 1;
// 增计数,x1,内部时钟,禁止比较,使用自己的周期
EvaRegs.T2CON.all = 0x9040;
// 指定T2PINT到中断服务程序MainISR
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T2PINT = &MainISR;
EDIS; // This is needed to disable write to EALLOW protected registers
// 使能T2PINT
PieCtrlRegs.PIEIER3.all = M_INT1;
IER |= M_INT3;
// 使能全局中断和实时DEBUG事件
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// 空闲循环
for(;;)
{
BackTicker++;
}
}
// 定时器2中断服务程序
interrupt void MainISR(void)
{
IsrTicker++; // 中断计数
// 具体操作
// ...........
///////////////////////////////////////////////////////////////////
if ( VirtualTimer%20000==0 )
LBDS^=1;
///////////////////////////////////////////////////////////////////
// ...........
// ------------------------------------------------------------------------------
// 15 bit计数器
// ------------------------------------------------------------------------------
VirtualTimer++;
VirtualTimer &= 0x00007FFF;
// 中断出口:
// Enable more interrupts from this timer
EvaRegs.EVAIMRB.bit.T2PINT = 1;
// Note: To be safe, use a mask value to write to the entire
// EVAIFRB register. Writing to one bit will cause a read-modify-write
// operation that may have the result of writing 1's to clear
// bits other then those intended.
EvaRegs.EVAIFRB.all = BIT0;
// Acknowledge interrupt to recieve more interrupts from PIE group 3
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP3;
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -