使用CH582M单片机的PWM控制器,以各自单独的模式的处理代码如下:
#include "CH58x_common.h"
/*********************************************************************
* @fn main
*
* @brief 主函数
*
* @return none
*/
int main() {
SetSysClock(CLK_SOURCE_PLL_60MHz); // 系统时钟频率:60MHz
/* 配置GPIO */
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA); // PA12 - PWM4
GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA); // PA13 - PWM5
GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA); // PB0 - PWM6
GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA); // PB4 - PWM7
GPIOB_ModeCfg(GPIO_Pin_6, GPIO_ModeOut_PP_5mA); // PB6 - PWM8
GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); // PB7 - PWM9
GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA); // PB23 - PWM11
// 时钟分频寄存器(R8_PWM_CLOCK_DIV)
PWMX_CLKCfg(60); // PWM的时钟频率 cycle = Fsys/60 = 1MHz,周期1μs
// 配置控制寄存器(R8_PWM_CONFIG)
PWMX_CycleCfg(PWMX_Cycle_256); // 周期 = 256*cycle,即PWM波的周期为 256 * 1μs = 256μs
// 不同占空比输出
PWMX_ACTOUT(CH_PWM4, 2, High_Level, ENABLE); // 1/128 占空比,对High_Level模式,即高电平为 2μs
PWMX_ACTOUT(CH_PWM5, 4, High_Level, ENABLE); // 1/64 占空比,对High_Level模式,即高电平为 4μs
PWMX_ACTOUT(CH_PWM6, 8, High_Level, ENABLE); // 1/32 占空比,对High_Level模式,即高电平为 8μs
PWMX_ACTOUT(CH_PWM7, 16, High_Level, ENABLE); // 1/16 占空比,对High_Level模式,即高电平为 16μs
PWMX_ACTOUT(CH_PWM8, 32, High_Level, ENABLE); // 12.5% 占空比,对High_Level模式,即高电平为 32μs
PWMX_ACTOUT(CH_PWM9, 64, High_Level, ENABLE); // 25% 占空比,对High_Level模式,即高电平为 64μs
PWMX_ACTOUT(CH_PWM11, 128, High_Level, ENABLE); // 50% 占空比,对High_Level模式,即高电平为 128μs
while(1) {
}
}其中没有测试PWM10,是因为PB14已经被WCH-Link使用,不方便做为PWM输出用了。同时为了方便查看,设置PWM的周期为256个PWM时钟计数。PWM时钟由:
PWMX_CLKCfg(60);
配置为系统时钟的1/60,因为系统时钟为60MHz,所以PWM的标准时钟频率为1MHz,则周期为1微妙。各PWM(4,5, 6,7, 8,9, 11)配置为总数为256的计数,所以各控制器输出的PWM波的周期为256 * 1μs = 256μs。
逻辑分析仪测得的波形:

与预期的数据基本一致,在High_Level模式下,高电平占用的时长为:2、4、8、16、32、64、128 μs。如果配置为Low_Level模式,则应该是低电平占用的时长为:2、4、8、16、32、64、128 μs。
我要赚赏金
