CH585提供了多路PWM,除了定时器提供的 4 路 26 位 PWM 输出之外,系统还提供了 8 路 8 位 PWM 输出(PWM4~PWM11)或6 路 16 位 PWM 输出(PWM4~PWM9),其占空比可调,PWM 周期固定可选 8 种周期。
时钟周期数(Ncyc)计算公式:
数据宽度n=8/7/6:Ncyc=2^n-RB_PWM_CYCLE_SEL;
16 位数据宽度 Ncyc=RB_PWM_CYC_VALUE+1
PWMx 占空比计算公式:
占空比=R8_PWMx_DATA/Ncyc
PWMx 输出频率 Fpwmout 计算公式:
PWMx 输出频率 Fpwmout=Fpwm/Ncyc=Fsys/R8_PWM_CLOCK_DIV/Ncyc
为了使用PWM的调节功能与RGB彩色相配合来制作色彩渐变的效果,是选取3路PWM输出通道与彩灯的RGB引脚相连。
3路PWM与彩灯的连接关系为:
R-----PWM4
G-----PWM5
B-----PWM6
实现色彩渐变效果的主程序为:
uint8_t dutyCycle = 0;
uint8_t direction = 0;
int main()
{
uint8_t i;
HSECFG_Capacitance(HSECap_18p);
SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
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
PWMX_CLKCfg(4); // cycle = 4/Fsys
PWMX_CycleCfg(PWMX_Cycle_64); // 周期 = 64*cycle
PWMX_ACTOUT(CH_PWM4, 64 / 100, Low_Level, ENABLE); // 1% 占空比
PWMX_ACTOUT(CH_PWM5, 64 / 100, Low_Level, ENABLE); // 1% 占空比
PWMX_ACTOUT(CH_PWM6, 64 / 100, Low_Level, ENABLE); // 1% 占空比
while(1)
{
if(direction == 0)
{
dutyCycle+=10;
}
else if(direction == 1)
{
dutyCycle-=10;
}
DelayMs(80);
if(i==0)
{
PWMX_ACTOUT(CH_PWM4, (64 * dutyCycle)/ 100, Low_Level, ENABLE);
PWMX_ACTOUT(CH_PWM5,(64 * 1)/ 100, Low_Level, ENABLE);
PWMX_ACTOUT(CH_PWM6, (64 * 1)/ 100, Low_Level, ENABLE);
}
if(i==1)
{
PWMX_ACTOUT(CH_PWM4, (64 * 1)/ 100, Low_Level, ENABLE);
,PWMX_ACTOUT(CH_PWM5, (64 * dutyCycle)/ 100, Low_Level, ENABLE);
PWMX_ACTOUT(CH_PWM6, (64 * 1)/ 100, Low_Level, ENABLE);
}
if(i==2)
{
PWMX_ACTOUT(CH_PWM4, (64 * 1)/ 100, Low_Level, ENABLE);
PWMX_ACTOUT(CH_PWM5, (64 * 1)/ 100, Low_Level, ENABLE);
PWMX_ACTOUT(CH_PWM6, (64 * dutyCycle)/ 100, Low_Level, ENABLE);
}
if(dutyCycle > 90)
direction = 1;
else if(dutyCycle < 10)
{
direction = 0;
i=(i+1)%3;
DelayMs(50);
}
}
}
经程序的编译与下载,其测试效果如图1至图3所示。

图1 显示紫色

图2 紫色渐弱

图3 显示青色
色彩渐变效果演示: