This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28379D:ePWM CTRMODE 初始化问题

Guru**** 2755235 points

Other Parts Discussed in Thread: POWERSUITE, TIDM-1000

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/963052/ccs-tms320f28379d-epwm-ctrmode-initialization-problem

器件型号:TMS320F28379D
Thread 中讨论的其他器件:powerSUITETIDM-1000

工具/软件:Code Composer Studio

大家好、 我正在通过修改现有 powerSUITE 库来编写代码。

但是、尽管设置 CTRMODE 的设置 CTRMODE 的设置 IH_PWM 在如下所示的主语句中执行、但 HIGH_FREQ_PWM4_BASE_IH (EPWM5)的 CTRMODE 初始化为 EPWM_COUNTER_MODE_UP (0)、而不是  EPWM_COUNTER_MODE_UP_DOWN

为了解决这个问题、我在中断语句中插入了 ePWM_setTimeBaseCounterMode (HIGH_FREQ_PWM4_BASE_IH、ePWM_COUNTER_MODE_UP_DOWN)。

但是、我想知道为什么 HIGH_FREQ_PWM4_BASE_IH (EPWM5)的 CTRMODE 未在 main 语句中初始化。
已确认只有 HIGH_FREQ_PWM4_BASE_IH (EPWM5)初始化为向上计数模式、而其余 PWM 在初始化为向上向下计数模式时进行初始化。

此外、EPWM5在另一个正常操作代码中运行良好。 因此、我们认为这不是硬件问题。


void setupIH_PWM (uint32_t base1、uint32_t BASE2、uint32_t base3、uint16_t PWM_PERIOD_TICK、uint16_t PWM_PERIOD_ticks 1)
{
ePWM_setPeriodLoadMode (base1、ePWM_PERIOD_LOAD);
ePWM_setTimeBasePeriod (base1、PWM_PERIOD_ticks1>>1);
ePWM_setTimeBaseCounter (base1、0);
ePWM_setPhaseShift (base1、0);
ePWM_setTimeBaseCounterMode (base1、ePWM_COUNTER_MODE_UP_DOWN); 
ePWM_setClockPrescaler (base1、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);

ePWM_setPeriodLoadMode (base3、ePWM_PERIOD_LOAD);
ePWM_setTimeBasePeriod (base3、PWM_PERIOD_TICKs>>1);
ePWM_setTimeBaseCounter (base3、0);
ePWM_setPhaseShift (base3、0);
ePWM_setTimeBaseCounterMode (base3、ePWM_COUNTER_MODE_UP_DOWN);
ePWM_setClockPrescaler (base3、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);

ePWM_setCounterCompareShadowImage LoadMode (base1、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
ePWM_setCounterCompareShadowImage LoadMode (base1、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO);

// CTR = CMPA@UP,设置为1
ePWM_setActionQualifierAction (base1、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (base1、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_up_CMPB);

ePWM_setActionQualifierAction (base1、ePWM_AQ_output_B、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_down_CMPB);
ePWM_setActionQualifierAction (base1、ePWM_AQ_output_B、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_CMPA);
} 



中断语句 
IF (GPIO_READPin (62)=0)
{
DISABLE_AQ_SW_FRC (HIGH_FREQ_PWM4_BASE_IH);
DISABLE_AQ_FRC (HIGH_FREQ_PWM4_BASE_IH);

AQ_SW_FORCE_PWMxA_HIGH_PWMxB_LOW (HIGH_FREQ_PWM5_BASE_IH_FORCE);
SINGLE_OUT_MODE (HIGH_FREQ_PWM4_BASE_IH);//DBCTL[OUT_MODE]=0


PWM_Duty_前端= 0.06;
PWM_Duty_Backend = 0.94;

ePWM_setTimeBaseCounterMode (HIGH_FREQ_PWM4_BASE_IH、ePWM_COUNTER_MODE_UP_DOWN);
ePWM_setTimeBasePeriod (HIGH_FREQ_PWM4_BASE_IH、IH_Switching_Period>>1);

ePWM_setCounterCompareValue (HIGH_FREQ_PWM4_BASE_IH、
ePWM_COUNTER_COMPARE_A、
(uint32_t)((float32_t) IH_Switching_Period*PWM_Duty_前端)>1);
ePWM_setCounterCompareValue (HIGH_FREQ_PWM4_BASE_IH、
ePWM_COUNTER_COMPARE_B、
(uint32_t)((float32_t) IH_Switching_Period*PWM_Duty_Backend)>>1);

} 

正常工作代码与有问题代码之间的区别在于存储器映射。 由于代码存在内存问题、因此修改了内存映射。

MEMORY
{
PAGE 0:
//* Program Memory */*
Memory (RAM/FLASH ) blocks can be moved to Page1 for data allocation */
/* begin 用于"boot to Flash"引导加载程序模式*/

begin:origin = 0x080000、length = 0x000002 //闪存开始原点:0x080000 RAM 开始原点:0x000000
RAMM0:origin = 0x000122,length = 0x0002DE

RAMLS2LS3LS4LS5:origin = 0x009000,length = 0x002000//100kHz,length 0x001000=4K*16,length 0x000800=2K*16,0X002000=8K 16

RAMD0 :origin = 0x00B000、length = 0x000800

RAMGS0GS1GS2 :origin = 0x00C000,length = 0x003000//ramfunc (10kHz 中断) 12K*16

复位:origin = 0x3FFFC0,length = 0x000002

/*闪存扇区*/
FLASHA :origin = 0x080002、length = 0x001FFE//片上闪存*/
FLASHB :origin = 0x082000、length = 0x002000//片上闪存*/
FLASHC :origin = 0x084000、length = 0x002000//片上闪存*/
FLASHD :origin = 0x086000、length = 0x002000//片上闪存*/
FLASHE :origin = 0x088000、length = 0x008000//片上闪存*/
FLASHF :origin = 0x090000、length = 0x008000//片上闪存*/
FLASHG :origin = 0x098000、length = 0x008000//片上闪存*/
FLASHH :origin = 0x0A0000、length = 0x008000//片上闪存*/
FLASHI :origin = 0x0A8000、length = 0x008000//片上闪存*/
FLASHJ :origin = 0x0B0000、length = 0x008000//片上闪存*/
FLASHK :origin = 0x0B8000、length = 0x002000//片上闪存*/
FLASHL :origin = 0x0BA000、length = 0x002000//片上闪存*/
FLASHM :origin = 0x0BC000、length = 0x002000//片上闪存*/
FLASHN :origin = 0x0BE000、length = 0x002000//片上闪存*/

page 1:
//*数据存储器*/
//*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/

BOOT_RSVD :origin = 0x000002、length = 0x000120

RAMM1 :origin = 0x000400、length = 0x000400

RAMLS0LS1 :origin = 0x008000、length = 0x001000

RAMD1 :origin = 0x00B800,length = 0x000800

// RAMGS2 :origin = 0x00E000、length = 0x001000
RAMGS3 :origin = 0x00F000、length = 0x001000
RAMGS4 :origin = 0x010000,length = 0x001000
RAMGS5GS6GS7GS8GS9 :origin = 0x011000,length = 0x005000
// RAMGS6 :origin = 0x012000,length = 0x001000
// RAMGS7 :origin = 0x013000、length = 0x001000
// RAMGS8 :origin = 0x014000、length = 0x001000
// RAMGS9 :origin = 0x015000,length = 0x001000
RAMGS10 :origin = 0x016000,length = 0x001000
RAMGS11 :origin = 0x017000、length = 0x001000
RAMGS12 :origin = 0x018000、length = 0x001000
RAMGS13 :origin = 0x019000、length = 0x001000
RAMGS14 :origin = 0x01A000、length = 0x001000
RAMGS15 :origin = 0x01B000、length = 0x001000


CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400
}


SECTIONS
{//.cinit :> FLASHB、.init_array :> FLASHB、.text :>> FLASHB|FLASH|FLASH|FLASH|FLASHE/*
分配程序区域:*/
.cinit :> FLASHB PAGE = 0、align (4)
.init_array :> FLASHB、 PAGE = 0、ALIGN (4)
.text :>> FLASHG PAGE = 0,ALIGN (4)
codestart :>开始 PAGE = 0、ALIGN (4)

/*分配未初始化的数据段:*/
.stack :> RAMM1 PAGE = 1.data
:> RAMM1 PAGE = 1.bss
:>> RAMGS5GS6GS7GS8GS9 PAGE = 1
.sysmem :> RAMGS3 PAGE = 1

/*初始化段进入闪存*/
.const :>> FLASHF | FLASHG | FLASHH PAGE = 0、ALIGN (4)
.switch :> FLASHB PAGE = 0、ALIGN (4)

复位 :>重置, PAGE = 0、TYPE = DSECT /*未使用、*/

GROUP
{
.TI.ramfunc
{
}
ramfuncs //10kHz 인터럽트

}load = FLASHD、
run = RAMGS0GS1GS2、//8K*16
load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
load_end (RamfuncsLoadEnd)、
run_start (RamfuncsRunStart)、
run_size (RamfuncsLoadSize)、RunfuncsSize
run_end (RamfuncsRunEnd)、
page = 0、align (4)




/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU1TOCPU2RAM,页= 1//双核组
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}

组:> CPU2TOCPU1RAM,页= 1//双核组
{
GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT
}

SFRA_F32_Data:> RAMGS3,ALIGN = 64,PAGE = 1

SFRA_Data:> RAMGS3,ALIGN = 64,PAGE=1

FPUmathTables:> RAMGS4,PAGE =1.scratchpad

:> RAMLS0LS1, PAGE = 1.bss_cla
:> RAMLS0LS1, PAGE =1
controlVariables:>RAMGS5GS6GS7GS8GS9, PAGE = 1.CONST_CLA

:load = FLASHH、
运行= RAMLS2LS3LS4LS5、
RUN_START (Cla1ConstRunStart)、
Load_start (Cla1ConstLoadStart)、
load_size (Cla1ConstLoadSize)、
PAGE = 0

组
{
isrcodefuncs
dclfuncs
} 负载= FLASHH、
运行= RAMLS2LS3LS4LS5、
load_start (isrcodefuncsLoadStart)、
load_size (isrcodestfuncsLoadSize)、
load_end (isrcodefuncsLoadEnd)、
run_start (isrcodefuncsRunStart)、
run_size (isrcodefuncsRunSize)、
run_end (isrcodefuncsRunEnd)、
PAGE = 0、ALIGN (4)

/* CLA 特定部分*/
Cla1Prog :load = FLASHH、
运行= RAMLS2LS3LS4LS5、
Load_start (Cla1ProgLoadStart)、
RUN_START (Cla1ProgRunStart)、
Load_size (Cla1ProgLoadSize)、
PAGE = 0、ALIGN (4)


}

/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

谢谢你。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kyung、我将邀请一位电源套件专家为您进行介绍。

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kyung、

    您能否建议您将哪个示例/参考设计用作修改后的代码的基础?

    通常、无需在每个 ISR 中修改 PWM 计数器模式。 它应该在初始化代码中进行设置。

    韩文

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的韩章:

    我修改了 TIDM-1000配置。

    但我更改了初始化 PWM 代码。

    今天、我在代码中发现了一个问题。

    在 interrupt 语句中、  

    SINGLE_OUT_MODE (HIGH_FREQ_PWM4_BASE_IH);是一个问题。

    为了设置 PWM 的 OUT_MODE、我在 SINGLE_OUT_MODE (base)中使用了 HWREGH (HIGH_FREQ_PWM4_BASE_IH + EPWM_CMPCTL_LOADMODE_S)。

    但是、ePWM_TBCTL_CTRMODE_S 也与 ePWM_CMPCTL_LOADMODE_S 地址与0U 相同

    我只是想通过使用 HWREGH ()来更改每个寄存器位。

    是否有方法将现有方法与驱动程序库相结合?

    驱动程序库:  ePWM_setTimeBaseCounterMode (base1、ePWM_COUNTER_MODE_UP_DOWN);

    现有方法: EPwm5Regs.TBCTL.bit.CTRMODE = 2;

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我仍然对您为什么需要使用自己的代码而不是使用 driverlib 感到困惑。 是否有您找不到 driverlib 函数的位?

    是的、您可以编写自己的函数来使用 HWREGH 来设置每个位。 这应该适用于 driverlib 函数。  

    此致、