www.pudn.com > DSP2812formotorcontrol.rar > DSP281x_BLDCPWM.c


/* ================================================================================== 
File name:       DSP281x_BLDCPWM.C 
                     
Originator:	Digital Control Systems Group 
			Texas Instruments 
 
Description:   This file contains source for the Full Compare BLDC PWM drivers for the F281x 
 
Target: TMS320F281x family 
               
===================================================================================== 
History: 
------------------------------------------------------------------------------------- 
 04-15-2005	Version 3.20: Using DSP281x v. 1.00 or higher  
----------------------------------------------------------------------------------*/ 
 
#include "DSP281x_Device.h" 
#include "DSP281x_BLDCPWM.h" 
 
void F281X_EV1_BLDC_PWM_Init(PWMGEN *p)  
{        
        EvaRegs.T1PR = p->PeriodMax;             // Init Timer 1 Period Register 
        EvaRegs.T1CON.all = BLDCPWM_INIT_STATE;   // Init PWM Operation 
        EvaRegs.ACTRA.all = 0x0000;                 
        EvaRegs.GPTCONA.all = 0x0000; 
        EvaRegs.COMCONA.all = 0xA200; 
 
        EALLOW;                       // Enable EALLOW 
        GpioMuxRegs.GPAMUX.all |= 0x003F;    // Setting PWM1-6 as primary output pins 
        EDIS;                         // Disable EALLOW 
} 
 
 
void F281X_EV1_BLDC_PWM_Update(PWMGEN *p)  
{        
 
	int32 Tmp; 
	int16 Period, GPR0_BLDC_PWM; 
	 
// State s1: current flows to motor windings from phase A->B, de-energized phase = C 
	if (p->CmtnPointer==0) 
         EvaRegs.ACTRA.all = 0x00C2; 
 
// State s2: current flows to motor windings from phase A->C, de-energized phase = B 
    else if (p->CmtnPointer==1)   
         EvaRegs.ACTRA.all = 0x0C02; 
 
// State s3: current flows to motor windings from phase B->C, de-energized phase = A 
    else if (p->CmtnPointer==2)   
         EvaRegs.ACTRA.all = 0x0C20; 
    
// State s4: current flows to motor windings from phase B->A, de-energized phase = C 
    else if (p->CmtnPointer==3)   
         EvaRegs.ACTRA.all = 0x002C; 
 
// State s5: current flows to motor windings from phase C->A, de-energized phase = B 
    else if (p->CmtnPointer==4)   
         EvaRegs.ACTRA.all = 0x020C; 
 
// State s6: current flows to motor windings from phase C->B, de-energized phase = A 
    else if (p->CmtnPointer==5)   
         EvaRegs.ACTRA.all = 0x02C0; 
 
// Convert "Period" (Q15) modulation function to Q0 
    Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod;   // Q15 = Q0*Q15 
    Period = (int16)(Tmp>>15);                         // Q15 -> Q0 (Period) 
  
// Check PwmActive setting 
	if (p->PwmActive==1)                   // PWM active high 
      GPR0_BLDC_PWM = 0x7FFF - p->DutyFunc;    
     
    else if (p->PwmActive==0)              // PWM active low 
      GPR0_BLDC_PWM = p->DutyFunc; 
 
// Convert "DutyFunc" or "GPR0_BLDC_PWM" (Q15) duty modulation function to Q0 
    Tmp = (int32)Period*(int32)GPR0_BLDC_PWM;     // Q15 = Q0*Q15 
    EvaRegs.CMPR1 = (int16)(Tmp>>15);             // Q15 -> Q0 
    EvaRegs.CMPR2 = (int16)(Tmp>>15);             // Q15 -> Q0 
    EvaRegs.CMPR3 = (int16)(Tmp>>15);             // Q15 -> Q0 
 
}