这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【CH582M】CH582M的定时器(4)PWM模式

共1条 1/1 1 跳转至

【CH582M】CH582M的定时器(4)PWM模式

专家
2026-09-04 19:09:07     打赏

CH582M片的每个定时器都有 PWM 功能。其中 TMR1 和 TMR2 的 PWM 功能支持 DMA 数据加载。PWM 可设置默认输出极性为高电平或低电平,同一数据重复输出次数可选为 1,4,8 或 16 次,该重复功能结合 DMA 可以用于模仿 DAC 的效果。PWM 输出有效电平的最短时间单位为 1 个系统时钟,可动态修改 PWM的占空比,模仿出特殊波形。

设置PWM功能时,操作步骤如下: 

(1)、置位模式设置寄存器(R8_TMRx_CTRL_MOD)的RB_TMR_ALL_CLEAR位,清空和清零 R32_TMRx_FIFO 和中断标志等

(2)、设置 PWM 总周期寄存器 R32_TMRx_CNT_END,该值应该 ≥ R32_TMRx_FIFO 寄存器中的值

(3)、配置模式设置寄存器(R8_TMRx_CTRL_MOD),

清零 RB_TMR_ALL_CLEAR位,

清零 RB_TMR_MODE_IN 对应 PWM 模式,

设置RB_TMR_OUT_POLAR 位,选择输出极性,

根据需要通过 RB_TMR_PWM_REPEAT 选择同一数据重复次数;

(4) 、设置数据寄存器 R32_TMRx_FIFO,最小值为 0,对应占空比 0%,

最大值同 R32_TMR_CNT_END,对应占空比 100%,

占空比计算:R32_TMRx_FIFO/R32_TMRx_CNT_END。

TMR1 和 TMR2 可通过 DMA 加载连续动态数据,结合同一数据重复输出次数,可以模仿出特殊波形;

(5) 、配置模式设置寄存器(R8_TMRx_CTRL_MOD) ,置位 RB_TMR_COUNT_EN 启动计数和 RB_TMR_OUT_EN 允许 PWM 输出;

(6)、将 PWM 对应的 I/O 引脚设置为输出;

(7)、可选步骤,如果需要启用中断则设置相应的中断使能寄存器位;

(8)、PWM 一个周期完成后,如果开启中断则当 RB_TMR_IF_DATA_ACT 或 RB_TMR_IF_CYC_END 置位后会触发硬件中断;

(9)、更新 R32_TMRx_FIFO 中数据可以动态改变 PWM 的占空比,建议通过 DMA 加载。

例如:设置 RB_TMR_OUT_POLAR 位为 0,

R32_TMRx_FIFO 为 6,

R32_TMRx_CNT_END 为 18,

则产生 PWM的基本时序图如下所示,其占空比为:R32_TMRx_FIFO/R32_TMRx_CNT_END = 1/3 

image.png


本次测试准备使用TMR0产生PWM,根据系统的功能复用说明,默认状态下PWM输出到PA9

image.png

代码如下:

int main()
{
    uint8_t i;
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    /* 配置串口调试 */
    DebugInit();
    PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);
    
    // 设置PWM输出用GPIO
    // 设置PA9为输出模式
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    //// 设置PB23为输出模式
    //GPIOB_SetBits(GPIO_Pin_23);
    //GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA);
      
    
    // 配置TMR0为PWM模式,输出到PA9,也可改到PB23上
    TMR0_PWMInit(High_Level, PWM_Times_1);
    TMR0_PWMCycleCfg(6000); // 周期 100us
    //// 重映射PB23为TMR1的功能复用引脚
    //GPIOPinRemap(ENABLE, RB_PIN_TMR0);    
    TMR0_Disable();
    TMR0_PWMActDataWidth(1000); // 占空比 1/6, 修改占空比必须暂时关闭定时器
    TMR0_Enable();
    while(1);
}

由逻辑分析仪捕捉到的PA9的输出信号:

image.png

程序中默认使用PA作为PWM输出,改用PB23的话,将和PB23有关的代码解除注释即可。

改变polar极性的话

TMR0_PWMInit(Low_Level, PWM_Times_1);

输出信号为:

image.png

与前面的信号刚好是互补的。




关键词: CH582M     TMR     PWM    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]