betty

betty

0个粉丝

28

问答

0

专栏

8

资料

betty  发布于  2018-12-12 14:42:02
采纳率 0%
28个问答
2090

HRPWM使用问题

 

我的程序如下
#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                 {
                    CMPA_reg_val = ((long)DutyFine * (*ePWM).TBPRD)>>15;
                    CMPB_reg_val = ((long)DutyFine * (*ePWM).TBPRD)>>15;
                    temp = ((long)DutyFine * (*ePWM).TBPRD) ;
                    temp1 = ((long)DutyFine * (*ePWM).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).CMPA.all = ((long)CMPA_reg_val)<<16 | CMPAHR_reg_val; // loses lower 8-bits
                   // Example for a 32 bit write to CMPB:CMPBHR
                    (*ePWM).CMPB.all = ((long)CMPB_reg_val)<<16 | CMPBHR_reg_val; // loses lower 8-bits
                 }
            }
            else
            {
                for(i=1;i                 {
                 (*ePWM).CMPA.bit.CMPA = ((long)DutyFine * (*ePWM).TBPRD>>15);
                 (*ePWM).CMPB.bit.CMPB = ((long)DutyFine * (*ePWM).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    {
    (*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();没有变化。
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区