CH573-05-PWM——RISC-V内核BLE MCU快速开发教程

在这里插入图片描述

1. 简介

  PWM,脉冲宽度调制,通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形(含形状和幅值)简单说就是使用数字信号达到一个模拟信号的效果。结合 DMA 可以用于模拟 DAC 的效果。在此处基于上一讲的定时器完成相关操作。
从引脚中我们可以看到支持PWM输出的引脚。例如基于定时器的PA9\PA10\PA11\PB22\:
在这里插入图片描述

  另外还有专门提供脉宽调制输出通道的引脚,例如PB14\PB7\PB4\PB23\PA13\PA12\PB6\PB0:
在这里插入图片描述

2. 新建工程

  复制并粘贴上一讲的定时器工程,并重命名为“CH573_05_PWM”。
在这里插入图片描述

3. PWM初始化与设置

  1) 引入CH57x_pwm.c文件

    将“CH57x_pwm.c”设置为参与编译,因为有部分函数需要使用到,如TMR3_PWMCycleCfg()等函数。


  2) 初始化

初始化两个PWM引脚,有两种方式,分别为基于定时器的PB22以及PWM通道4的PA12为例

    //基于定时器的引脚PWM初始化:PA9\PA10\PA11\PB22
    GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22
    GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_5mA);
    TMR3_PWMInit(High_Level, PWM_Times_1);
    TMR3_PWMCycleCfg(6000); // 周期 100us

    //PWM引脚初始化:PB14\PB7\PB4\PB23\PA13\PA12\PB6\PB0:
    GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA);  // PA12 - PWM4
    PWMX_CLKCfg(4);                                   // cycle = 4/Fsys
    PWMX_CycleCfg(PWMX_Cycle_64);                     // 周期 = 64*cycle
    PWMX_ACTOUT(CH_PWM4, 64 / 4, Low_Level, ENABLE);  // 25% 占空比

  3) 使用

    设定一个占空比,并不断变化,呈递增递减的方式模拟呼吸灯变化,例如:

int main()
{
    
    
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    LED_init();//LED初始化

    //基于定时器的引脚PWM初始化:PA9\PA10\PA11\PB22
    GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22
    GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_5mA);
    TMR3_PWMInit(High_Level, PWM_Times_1);
    TMR3_PWMCycleCfg(6000); // 周期 100us

    //PWM引脚初始化:PB14\PB7\PB4\PB23\PA13\PA12\PB6\PB0:
    GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_5mA);  // PA12 - PWM4
    PWMX_CLKCfg(4);                                   // cycle = 4/Fsys
    PWMX_CycleCfg(PWMX_Cycle_64);                     // 周期 = 64*cycle
    PWMX_ACTOUT(CH_PWM4, 64 / 4, Low_Level, ENABLE);  // 25% 占空比

    uint16_t i=0;
    while(1)
    {
    
    
        //呼吸灯1
        for(i=0;i<6000;i+=20)
        {
    
    
            TMR3_Disable();
            TMR3_PWMActDataWidth(i); //修改占空比必须暂时关闭定时器
            TMR3_Enable();
            DelayMs(2);
        }
        for(i=6000;i>0;i-=20)
        {
    
    
            TMR3_Disable();
            TMR3_PWMActDataWidth(i); // 修改占空比必须暂时关闭定时器
            TMR3_Enable();
            DelayMs(2);
        }
        //呼吸灯2
        for(i=1;i<64;i++)
        {
    
    
            PWMX_ACTOUT(CH_PWM4, 64 / i, Low_Level, ENABLE);
            DelayMs(5);
        }
        for(i=64;i>1;i--)
        {
    
    
            PWMX_ACTOUT(CH_PWM4, 64 / i, Low_Level, ENABLE);
            DelayMs(5);
        }
    }
}

4. 编译烧录运行

   编译烧录运行后,用杜邦线分别连接PA8(板载LED引脚)与PB22、PA8与PA12,可以看到两种不同的PWM呼吸灯效果变化。


    如果可以看到两种不同呼吸灯的状态,即达到本实验的目的,如果异常,请检查源代码,如有疑问可关注公众号 “IOT趣制作”,将您遇到的问题描述出来,平台收到您的留言后会第一时间进行解决。

猜你喜欢

转载自blog.csdn.net/weixin_43351158/article/details/131141484