HRPWM使用问题 - TMS320F2837x - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8504|回复: 2

[已解决] HRPWM使用问题

[复制链接]

4

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
发表于 2016-11-17 10:39:41 | 显示全部楼层 |阅读模式
我的程序如下
#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();没有变化。

回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
发表于 2016-11-20 14:17:10 | 显示全部楼层
这是你自己写的还是TI官方的例程?
看看视频--高精度增强型脉冲宽度调制器 HRPWM 能否给您一些帮助。
回复 支持 反对

使用道具 举报

0

主题

10

帖子

58

积分

QQ游客

积分
58
发表于 2016-12-13 09:36:41 | 显示全部楼层
先试试用add watch选择 在变量窗口里观察你需要的值
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-28 19:05 , Processed in 0.036193 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表