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.

TMS320F28035: 请问如何让epwm1a和epwm1b输出相同的波形但是epwm1b的波形向右偏移半个周期

Part Number: TMS320F28035

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//************************************************************************************************
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#define SYSCLK 60E6 // 60MHz system clock
#define PWMFREQ 100E3 // 100kHz PWM frequency
#define DUTY_CYCLE 0.4// duty cycle
#define DEAD_BAND 0.2 // dead band
//#define TB_PERIOD (SYSCLK / (2 * PWMFREQ)) // Calculate period for up-down count mode
//#define TB_PERIOD (SYSCLK / PWMFREQ) // Calculate period for up-down count mode
#define TB_PERIOD (SYSCLK / (4 * PWMFREQ)) // Calculate period for up-down count mode
#define DUTY_VALUE (TB_PERIOD * DUTY_CYCLE)
#define DB_VALUE (TB_PERIOD * DEAD_BAND)
//
void SetGpio()
{
EALLOW;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

代码已经上传了。

我想让epwm1a和epwm1b生成占空比和死区时间都一样的波形,而且epwm1b的波形向右偏移半个周期。

我在代码里设置了相位偏移如下:

EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 启用相位加载
EPwm1Regs.TBPHS.half.TBPHS = EPwm1Regs.TBPRD / 2; // 设置 ePWM1B 的相位偏移

但是生成的波形没有任何偏移:

调了一周了实在没办法了,老板又一直催所以来这问一下,谢谢各位大神。

  • 是不是只有不同的epwm例如epwm1和epwm2之间能实现移相,epwm1a和epwm1b之间是不能实现移相的?

  • 是不是只有不同的epwm例如epwm1和epwm2之间能实现移相,

    是的,TB子模块的移相功能是作用于不同ePWM模块间的;

    同个ePWM模块上的两路输出之间要做到移相,比较简单的做法是在输出后面加一个FPGA,通过FPGA来做这个逻辑。当然其它的后处理方式也是可以的。只不过用FPGA相对来说比较简单灵活,如果有其它需求的话还可以对信号进行更多的处理,实现一些ePWM模块所不具备的一些逻辑。

    所以TI也推出了一些集成了CLB模块的C2000器件,比如TMS320F280049C。CLB就是一个类似于FPGA的模块。


    如果非想用单F28035实现,我可以提供一个大概思路:

    1. 以ePWM1为例。ePWM1A正常输出,比如CTR = 0处置高,CTR = CMPA处置低;ePWM1B采用软件输出;

    2. ePWM1在配置的时候,要使能波形跳变点的中断(但有一点要注意,每个ePWM模块的中断源只能选择一个,所以在每次ISR的最后要切换中断源);

    3. CTR = 0时,ePWM1A置高,同时触发中断,中断中使用NOP指令延时(这个时间就是移相值。还需要加上现场保护及恢复的时间,这个时间与代码量有一定的关系,需要经过测试得出),然后对ePWM1B采用软件置高,之后切换中断源为CTR = CMPA;

    4. CTR = CMPA时,同样的操作。

    当然还有许多细节的地方要注意,比如软件触发要选择立即模式、软件触发有一个TBCLK的延迟、波形第1个周期的配置需要特殊处理一下、用汇编实现效果也会更好(无论是波形的时序还是对于CPU的负载)、移相值最好远小于周期值、这个处理也可以放到CLA核来做、等等。

    当然我这个思路也只是理论上的,实际是否可行有待验证。

  • 上面这个做法其实相当麻烦,更简答的做法是转换思路:

    想要A路与B路之间做到移相,模块本身并没有这个功能;那干脆把一个ePWM模块看成A路、另一个ePWM模块看成B路,每一个模块只用它一路输出。

  • 感谢,根据你的回答问题已经得到解决。