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

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

代码如下:
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的输出信号:

程序中默认使用PA作为PWM输出,改用PB23的话,将和PB23有关的代码解除注释即可。
改变polar极性的话
TMR0_PWMInit(Low_Level, PWM_Times_1);输出信号为:

与前面的信号刚好是互补的。
我要赚赏金
