ePWM モジュール - タイムベース モジュール (2)

ePWM モジュール (2)

タイムベースモジュールの使用

TBPRD: 周期レジスタ (設定されたクロック周期がここに保存されます。シャドウ レジスタを介してバッファリングした後に書き込むことも、アクティブ レジスタを介してすぐに書き込むこともできます)

TBCTR:タイムベースカウント変数値レジスタ(現在タイムベースでカウントしている値を保存し、周期設定値との比較を行います)
ここに画像の説明を挿入

TBPHS: タイムベース位相レジスタ
ここに画像の説明を挿入

TBSTS: タイムベースステータスレジスタ
ここに画像の説明を挿入

TBCTL: 制御レジスタ(重要)

ここに画像の説明を挿入
CTRMOD: カウントモード
00: 加算
01: 減算
10: 加算および減算
11: カウント停止

PHSEN: フェーズを有効にする
0: ロードを無効にする
1: フェーズレジスタ値をロードする

PRDLD: 周期レジスタ シャドウ ロード モード
0: シャドウ レジスタ値をロードする
1: シャドウをロードしない

SYNCOSEL: ePWMxSYNCO 信号出力ソースの選択
00: ePWMxSYNCI
01: CTR=ZER0: タイムベース カウンタが 0
10: CTR=CMPA: タイムベース カウンタがコンペア レジスタ A と等しい
11: 出力を禁止

SWFSYNC: ソフトウェア強制同期パルス
0: 影響なし
1: 1 回強制

HSPCLKDIV: 周波数分割、CLKDIV と同じ。TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)

CLKDIV: 周波数分割、HSPCLKDIV と同じ
000: 1 周波数分割
001: 2 周波数分割
010: 4 周波数分割
...
111: 128 周波数分割

PHSDIR:増減モード時、同期信号到着時、位相値ロード後の増減状態のカウント方向
0:カウントダウン
1:カウントアップ

#include "EPWM.h"
#include "leds.h"

//时基模块 TB 单独的应用,使用中断实现呼吸灯
void EPWM1_Init(Uint16 tbprd) //输入参数为PWM的周期
{
    //使能 ePWM 外设时钟及失能时基模块时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//失能TBCLKSYNC
    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;//使能ePWM1外设时钟
    EDIS;

    //中断向量表
    EALLOW;
    PieVectTable.EPWM1_INT = &epwm1_timer_isr;
    EDIS;

    //使能时基时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//使能TBCLKSYNC
    EDIS;

    //设置同步
    EPwm1Regs.TBCTL.bit.SYNCOSEL= 0x0;//TB_SYNC_IN
    //允许每个使用被同步
    EPwm1Regs.TBCTL.bit.PHSEN = 0x1;//TB_ENABLE
    时基相位寄存器赋值0
    EPwm1Regs.TBPHS.half.TBPHS = 0;
    //设置周期数值
    EPwm1Regs.TBPRD = tbprd;
    // 递增计数模式
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;//TB_COUNT_UP
    //TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)
    EPwm1Regs.TBCTL.bit.HSPCLKDIV=0x0;//不分频TB_DIV1
    EPwm1Regs.TBCTL.bit.CLKDIV=0x0;//不分频TB_DIV1
    // 在零事件上选择INT
    EPwm1Regs.ETSEL.bit.INTSEL = 0x1;//ET_CTR_ZERO
    // 使能 INT
    EPwm1Regs.ETSEL.bit.INTEN = 1;  //ET_1ST
    // 在第一个事件上生成INT
    EPwm1Regs.ETPS.bit.INTPRD = 0x1;
    // 同步启动所有计时器
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

    // 使能连接EPWM1-6 INT的CPU INT3:
    IER |= M_INT3;

    // 使能PIE中的EPWM INTn:组3中断1-6
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

   // 启用全局中断和更高优先级的实时调试事件:
   EINT;   // 启用全局中断INTM
   ERTM;   // 启用全局实时中断DBGM
}

interrupt void epwm1_timer_isr(void)
{
    static Uint16 cnt = 0;
    cnt++;
    if(cnt==5000)
    {
        cnt=0;
        LED3_TOGGLE;
    }
    // 清除此计时器的INT标志
    EPwm1Regs.ETCLR.bit.INT = 1;
    // 确认此中断以接收来自组3的更多中断
    PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}

#ifndef APP_EPWM_EPWM_H_
#define APP_EPWM_EPWM_H_

#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件

void EPWM1_Init(Uint16 tbprd);
interrupt void epwm1_timer_isr(void);



#endif /* APP_EPWM_EPWM_H_ */

おすすめ

転載: blog.csdn.net/qq_45159887/article/details/130567911