测试说明一下 CH58x 芯片 PWM 输出功能 ...... 矜辰所致 ...... 增加补充说明 2026/4/16前言今天轻松一下来测试一个基础的 PWM 输出功能在 CH58x 芯片上除了定时器可以产生 PWM 输出芯片还提供了单独的 PWM 控制器。本文我们主要来测试说明一下定时器和 PWM 控制器如何输出 PWM 波。相关文章沁恒微 RISC-V 蓝牙 CH5xx GPIO使用说明.系列文章目录【导航】沁恒微 RISC-V 蓝牙 入门教程目录 【快速跳转】.我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、 基础介绍二、 定时器 PWM 输出2.1 示例说明2.2 CH585 定时器 PWM 最大频率2.3 定时器使用 DMA 输出 PWM三、PWM 控制器输出四、补充说明4.1 引脚对应4.2 两种方式区别结语一、 基础介绍PWM 波Pulse Width Modulation脉冲宽度调制。基础的东西不过多赘述对于应用而言我们需要关注的是 PWM 的两个重要的参数占空比周期这两个指标关系到我们程序中需要指定修改的参数当然还有其他比如分辨率在下文介绍 PWM 控制器会有说明 。另外提一下 PWM 波的典型应用 — “模拟” 模拟量利用惯性系统电机、人眼、电容的积分效应电机电感电流不能突变 → 平均电压 ∝ 占空比人眼视觉暂留 → 亮度 ∝ 占空比电容RC 滤波 → 直流电压 ∝ 占空比二、 定时器 PWM 输出关于通用定时器芯片手册有如下说明芯片提供了4 个26 位定时器TMR0、TMR1、TMR2 和TMR3最长定时时间为2^26 个时钟周期。它适用于多种场合包括测量输入信号脉冲长度输入捕捉或者产生输出波形PWM支持 DMA 功能。每个定时器都是完全独立的可以一起同步操作。CH585 的4个定时器都可以输出 PWM 波。2.1 示例说明在官方 EVT 中提供了定时器使用的示例TMR里面关于 PWM 输出的代码示例为#defineg_10us(FREQ_SYS/100000)...#if1/* 定时器3PWM输出 */GPIOB_ResetBits(GPIO_Pin_22);// 配置PWM口 PB22GPIOB_ModeCfg(GPIO_Pin_22,GPIO_ModeOut_PP_5mA);TMR3_PWMInit(High_Level,PWM_Times_1);TMR3_PWMCycleCfg(g_10us*10);// 周期 100us 最大67108864TMR3_PWMActDataWidth(g_10us/2*10);// 占空比 50%, 修改占空比必须暂时关闭定时器TMR3_PWMEnable();TMR3_Enable();#endif测试效果如下我们在应用中直接按照示例格式使用即可其中我们要修改的地方就是控制 周期 和 占空比 的两句代码。周期设置是TMR3_PWMCycleCfg函数中的参数 周期 参数 / 系统主频 秒占空比是TMR3_PWMActDataWidth函数中的参数占空比 参数 / 周期只要会设置这两个参数就可以根据需求设置自己想要的 PWM了。2.2 CH585 定时器 PWM 最大频率在CH585 上可以达到 25MHz设置如下SetSysClock(CLK_SOURCE_HSE_PLL_78MHz);TMR3_PWMCycleCfg(3);// 周期 125us 最大67108864TMR3_PWMActDataWidth(1);// 占空比 20%, 修改占空比必须暂时关闭定时器2.3 定时器使用 DMA 输出 PWM此小节博主自己没有测试推荐博文连接如下https://www.cnblogs.com/gscw/p/17679057.html三、PWM 控制器输出关于 PWM 控制器 官方手册有如下说明 除了定时器提供的4路26位PWM输出之外系统还提供了8路 8 位PWM输出PWM4PWM11或 6 路16位 PWM输出PWM4PWM9占空比可调PWM 周期固定可选8种周期操作简单。在官方 EVT 中提供了定时器使用的示例PWMX使用起来也是及其简单我们只测试一路示例如下GPIOB_ModeCfg(GPIO_Pin_0,GPIO_ModeOut_PP_5mA);// PB0 - PWM6PWMX_CLKCfg(4);// cycle 4/FsysPWMX_CycleCfg(PWMX_Cycle_64);// 周期 64*cyclePWMX_ACTOUT(CH_PWM6,64/4,Low_Level,ENABLE);// 25% 占空比测试结果同样的我们可以看一下周期和占空比如何设置看看上面这个周期和占空比是怎么来的周期设置是PWMX_CLKCfg和PWMX_CycleCfg同时设置的:首先通过PWMX_CLKCfg设置通道基准时钟基准时钟 参数 / 系统主频然后通过PWMX_CycleCfg设置 PWM 周期周期 参数 * 基准时钟 秒在使用 8 位 PWM 的时候PWMX_CycleCfg只能选择如下几种typedef enum{PWMX_Cycle_256 0, // 256 个PWMX周期PWMX_Cycle_255, // 255 个PWMX周期PWMX_Cycle_128, // 128 个PWMX周期PWMX_Cycle_127, // 127 个PWMX周期PWMX_Cycle_64, // 64 个PWMX周期PWMX_Cycle_63, // 63 个PWMX周期} PWMX_CycleTypeDef;.我们可以算一下上面 4.11 us 的由来周期计算如下64 * 4 * 1/62400000s ≈ 4.102 us占空比是PWMX_ACTOUT函数中的第二个参数占空比 第二个参数 / 周期同样只要会设置这两个参数就可以根据需求设置自己想要的 PWM了。但是因为 PWM 控制器的分辨率有限所以有些波形并不能完全对应上会有误差比如说我们实现一个 8KHZ 的PWM 波形我们可以知道我们需要把周期定义位 125us 。我们近似可以如下设置为了进一步的设置准确的周期我们可以使用 16 位的 PWM 使用示例如下与 8 位 PWM 相比只是有2个设置的函数不一样周期设置的参数不再局限固定的几个值可以自行在 16 位范围内设置周期和占空比设置的计算方式都是一样的PWMX_16bit_CycleCfg(60-1);// 16位数据宽度NcycRB_PWM_CYC_VALUE1PWMX_16bit_ACTOUT(CH_PWM6,12,Low_Level,ENABLE);// 20% 占空比 60/5四、补充说明4.1 引脚对应目前只列举 CH585/CH584其他型号自行查看手册定时器 PWM 输出 IOPWM 引脚功能PA9定时器0 捕捉输入0 / PWM 输出通道0PA10定时器1 捕捉输入1 / PWM 输出通道1PA11定时器2 捕捉输入2 / PWM 输出通道2PB22定时器3 捕捉输入3 / PWM 输出通道3PWM 控制器输出 IO 映射引脚没有标明实在需要用到自行查看手册PWM 引脚功能PA12PWM4脉宽调制输出通道4PA13PWM5脉宽调制输出通道5PB0PWM6脉宽调制输出通道6PB4PWM7脉宽调制输出通道7PB6PWM8脉宽调制输出通道8PB7PWM9脉宽调制输出通道9PB14PWM10脉宽调制输出通道10PB23PWM11脉宽调制输出通道11复用为外部复位脚需关闭复位功能才能使用 4.2 两种方式区别概括来说定时器 PWM 灵活精细适合通用控制PWM 控制器是专用工具频率和分辨率受限但部分场景有优势比如某些电机电源控制场景。定时器 PWM 是 26位 PWM 频率高可任意分频更加灵活适合通用、精细控制。PWM 控制器是 8 位/16 位的评论低频率固定 / 粗分频档位有限 硬件自带互补输出也方便多路同步适合电源电机等特定场景。结语本文我们了解了 CH58x 芯片如何输出 PWM 波整体来说是很简单的只需要知道如何计算 周期 和占空比就可以实现自己想要的输出。好了本文就到这里。谢谢大家