|
我的程序如下
#include "F28x_Project.h" // Device Headerfile and Examples Include File
//#include "F2837xD_Examples.h" // F2837xD Examples Include File
#include "SFO_V8.h"
#include "math.h"
#define PWM_CH 9 // # of PWM chanels
#define STATUS_SUCCESS 1
#define STATUS_FAIL 0
#define AUTOCONVERT 0 // 1 = Turn auto-conversion ON, 0 = Turn auto-conversion OFF
// Declare your function prototypes here
//---------------------------------------------------------------
void HRPWM_Config(int);
void error(void);
// General System variables - useful for debug
Uint16 UpdateFine, DutyFine, status, CMPA_reg_val, CMPAHR_reg_val, CMPB_reg_val, CMPBHR_reg_val;
int MEP_ScaleFactor; // Global variable used by teh SFO library
volatile struct EPWM_REGS *ePWM[PWM_CH] =
{ &EPwm1Regs, &EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, &EPwm5Regs, &EPwm6Regs, &EPwm7Regs, &EPwm8Regs};
void main(void)
{ // Local variables
int i;
Uint32 temp, temp1;
EALLOW;
InitSysCtrl();
EDIS;
InitEPwmGpio(); // EPWM1A EPWM1B thru EPWM9
DINT; // Disable CPU interrupts *** PIE PIE PIE PIE PIE PIE PIE PIE
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
EALLOW;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
UpdateFine = 1;
DutyFine = 0;
status = SFO_INCOMPLETE;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while (status== SFO_INCOMPLETE){ // Call until complete
status = SFO();
if (status == SFO_ERROR) {
error(); // SFO function returns 2 if an error occurs & # of MEP steps/coarse step
} // exceeds maximum of 255.
}
//====================================================================
// ePWM and HRPWM register initialization
//====================================================================
HRPWM_Config(10); // ePWMx target
EALLOW;
for(;;)
{
// Sweep DutyFine as a Q15 number from 0.2 - 0.999
for(DutyFine = 0x2300; DutyFine < 0x2350; DutyFine++)
{
if(UpdateFine)
{
// All the above operations may be condensed into
// the following form:
// EPWM1 calculations
for(i=1;i<PWM_CH;i++)
{
CMPA_reg_val = ((long)DutyFine * (*ePWM[i]).TBPRD)>>15;
CMPB_reg_val = ((long)DutyFine * (*ePWM[i]).TBPRD)>>15;
temp = ((long)DutyFine * (*ePWM[i]).TBPRD) ;
temp1 = ((long)DutyFine * (*ePWM[i]).TBPRD) ;
temp = temp - ((long)CMPA_reg_val<<15);
temp1 = temp1 - ((long)CMPB_reg_val<<15);
#if (AUTOCONVERT)
CMPAHR_reg_val = temp<<1; // convert to Q16
CMPBHR_reg_val = temp<<1; // convert to Q16
#else
CMPAHR_reg_val = ((temp*MEP_ScaleFactor)+(0x0080<<7))>>15;
CMPAHR_reg_val = CMPAHR_reg_val << 8;
CMPBHR_reg_val = ((temp1*MEP_ScaleFactor)+(0x0080<<7))>>15;
CMPBHR_reg_val = CMPBHR_reg_val << 8;
#endif
// Example for a 32 bit write to CMPA:CMPAHR
(*ePWM[i]).CMPA.all = ((long)CMPA_reg_val)<<16 | CMPAHR_reg_val; // loses lower 8-bits
// Example for a 32 bit write to CMPB:CMPBHR
(*ePWM[i]).CMPB.all = ((long)CMPB_reg_val)<<16 | CMPBHR_reg_val; // loses lower 8-bits
}
}
else
{
for(i=1;i<PWM_CH;i++)
{
(*ePWM[i]).CMPA.bit.CMPA = ((long)DutyFine * (*ePWM[i]).TBPRD>>15);
(*ePWM[i]).CMPB.bit.CMPB = ((long)DutyFine * (*ePWM[i]).TBPRD>>15);
}
}
status = SFO(); // in background, MEP calibration module continuously updates MEP_ScaleFactor
if (status == SFO_ERROR) {
error(); // SFO function returns 2 if an error occurs & # of MEP steps/coarse step
} // exceeds maximum of 255.
} // end DutyFine for loop
} // end infinite for loop
} // end main
void HRPWM_Config(period)
{
Uint16 j;
for (j=1;j<PWM_CH;j++)
{
(*ePWM[j]).TBCTL.bit.PRDLD = TB_SHADOW; // set Immediate load
(*ePWM[j]).TBPRD = period-1; // PWM frequency = 1 / period
(*ePWM[j]).CMPA.bit.CMPA = 4; // set duty 50% initially
(*ePWM[j]).CMPA.bit.CMPAHR = (1 << 8); // initialize HRPWM extension
(*ePWM[j]).CMPB.bit.CMPB =8; // set duty 50% initially
(*ePWM[j]).CMPB.all |= (1 << 8); // initialize HRPWM extension
(*ePWM[j]).TBPHS.all = 0;
(*ePWM[j]).TBCTR = 0;
(*ePWM[j]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
(*ePWM[j]).TBCTL.bit.PHSEN = TB_DISABLE;
(*ePWM[j]).TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
(*ePWM[j]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.CLKDIV = TB_DIV1;
(*ePWM[j]).TBCTL.bit.FREE_SOFT = 11;
(*ePWM[j]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
(*ePWM[j]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
(*ePWM[j]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;
(*ePWM[j]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
(*ePWM[j]).AQCTLA.bit.ZRO = AQ_SET; // PWM toggle high/low
(*ePWM[j]).AQCTLA.bit.CAU = AQ_CLEAR;
(*ePWM[j]).AQCTLB.bit.ZRO = AQ_SET;
(*ePWM[j]).AQCTLB.bit.CBU = AQ_CLEAR;
EALLOW;
(*ePWM[j]).HRCNFG.all = 0x0;
(*ePWM[j]).HRCNFG.bit.EDGMODE = HR_FEP; // MEP control on falling edge
(*ePWM[j]).HRCNFG.bit.CTLMODE = HR_CMP;
(*ePWM[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
(*ePWM[j]).HRCNFG.bit.EDGMODEB = HR_FEP; // MEP control on falling edge
(*ePWM[j]).HRCNFG.bit.CTLMODEB = HR_CMP;
(*ePWM[j]).HRCNFG.bit.HRLOADB = HR_CTR_ZERO;
#if (AUTOCONVERT)
(*ePWM[j]).HRCNFG.bit.AUTOCONV = 1; // Enable auto-conversion logic
#endif
(*ePWM[j]).HRPCTL.bit.HRPE = 0; // Turn off high-resolution period control.
EDIS;
}
}
void error (void) {
ESTOP0; // Stop here and handle error
}
编译通过,但是调试会出现
Can't find a source file at "E:/git_device_support2/device_support/f2837x/F2837x_internal_testcases/EPwm/SFO_v7_fpu_lib_build/c28/SFO_v7_fpu_lib_build_c28.c"
Locate the file or edit the source lookup path to include its location.
咨询后说可以直接跳过。
但是我单步调试的时候会出现,还无法反馈SFO的值
卡在 while (status== SFO_INCOMPLETE){ // Call until complete
status = SFO();
if (status == SFO_ERROR) {
error(); // SFO function returns 2 if an error occurs & # of MEP steps/coarse step
} // exceeds maximum of 255.
}
也就是SFO();没有变化。
|
|