?? bldcmcontrol.c
字號:
// ==============================================================================
// 系統命名:BLDC31
//
// 文件名:BLDCMControl.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; // 程序運行標志
long lnADCValues;
int16 nADCValue,nADCValue1;
int16 DFuncDesired = 0; // 占空比控制
int16 nNowStatus=0;
Uint16 uISRWork1=3000;
// 中斷服務程序專用工作變量定義
Uint16 uISRWork;
// Instance a PWM driver instance
PWMGEN pwm1 = PWMGEN_DEFAULTS;
// 建立ADC驅動的一個實例
ADCVALS adc1 = ADCVALS_DEFAULTS;
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;
// Initialize PWM module
pwm1.PeriodMax = (SYSTEM_FREQUENCY/PWM_FREQUENCY)*1000; // Asymmetric PWM
pwm1.DutyFunc = 0;
pwm1.init(&pwm1);
// 初始化ADC模塊
adc1.ChSelect = 0x7777; // 通道選擇:采集ADCIN7的輸入4次
adc1.init(&adc1);
// 使能全局中斷和實時DEBUG事件
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// 空閑循環
for(;;)
{
BackTicker++;
}
}
// 定時器2中斷服務程序
interrupt void MainISR(void)
{
IsrTicker++; // 中斷計數
uISRWork=(IsrTicker%uISRWork1); // 控制nNowStatus以一定頻率變動
if ( uISRWork==0 )
{
nNowStatus++; nNowStatus%=6; // 取值在[0,5]順序遞增后折返
}
pwm1.CmtnPointer = nNowStatus; // 設置當前輸出狀態
pwm1.DutyFunc = DFuncDesired; // 占空比
pwm1.update(&pwm1); // 更新PWM狀態只為它可以啟動ADC轉換
if ( VirtualTimer%4000==0 ) // 每秒回讀10次ADC結果
{
adc1.read(&adc1); // 讀一次ADC轉換值(采集ADCIN7四次)
lnADCValues=adc1.Ch1Out;
lnADCValues+=adc1.Ch2Out;
lnADCValues+=adc1.Ch3Out;
lnADCValues+=adc1.Ch4Out;
lnADCValues/=4; // 累加4次結果求平均值
nADCValue1=lnADCValues; // 將模擬輸入值轉換成0-255之間的取值存儲到變量nADCValue中
nADCValue1/=100;
if ( nADCValue1>255 ) nADCValue1=255;
else if ( nADCValue1<0 ) nADCValue1=0;
nADCValue=nADCValue1;
DFuncDesired=nADCValue*10+72;
}
if ( VirtualTimer%20000==0 ) // 指示燈DS1每秒閃爍1次
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 + -