[蓝牙芯片] CH573-PWM——RISC-V内核BLE MCU快速开发教程

[复制链接]
 楼主| tpgf 发表于 2023-7-7 17:04 | 显示全部楼层 |阅读模式
1. 简介
  PWM,脉冲宽度调制,通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形(含形状和幅值)简单说就是使用数字信号达到一个模拟信号的效果。结合 DMA 可以用于模拟 DAC 的效果。在此处基于上一讲的定时器完成相关操作。
从引脚中我们可以看到支持PWM输出的引脚。例如基于定时器的PA9\PA10\PA11\PB22\:
9457364a7d4f6a7fea.png

  另外还有专门提供脉宽调制输出通道的引脚,例如PB14\PB7\PB4\PB23\PA13\PA12\PB6\PB0:

2310564a7d4facb0c1.png
2. 新建工程
  复制并粘贴上一讲的定时器工程,并重命名为“CH573_05_PWM”。

8205564a7d4ffd2fdd.png
3. PWM初始化与设置
  1) 引入CH57x_pwm.c文件
    将“CH57x_pwm.c”设置为参与编译,因为有部分函数需要使用到,如TMR3_PWMCycleCfg()等函数。
8108564a7d505f1f28.png

  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呼吸灯效果变化。
————————————————
版权声明:本文为CSDN博主「IOT趣制作」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43351158/article/details/131141484

 楼主| tpgf 发表于 2023-8-5 08:54 | 显示全部楼层
现在的单片机上基本上都有pwm功能 这个应该只能通过调节频率来调速了吧
wiba 发表于 2023-8-5 19:02 | 显示全部楼层
如果在使用过程中更改pwm的配置 会导致混乱吗
kxsi 发表于 2023-8-5 19:41 | 显示全部楼层
普通的定时器和具有pwm功能的定时器的区别是什么  为什么普通的定时器不能模拟pwm功能呢
coshi 发表于 2023-8-5 20:28 | 显示全部楼层
我们用dac驱动外部器件的时候,是不是还需要考虑到器件的执行延时啊
qcliu 发表于 2023-8-5 21:00 | 显示全部楼层
如何实现动态更改pwm的占空比和频率呢
drer 发表于 2023-8-5 21:32 | 显示全部楼层
为什么在单片机上无法实现通过调节幅值来实现速度的控制呢
yorkbarney 发表于 2023-9-7 16:50 | 显示全部楼层
使用CH573的PWM功能,您可以生成特定频率和占空比的PWM信号,以控制外部设备
rosemoore 发表于 2023-9-7 16:57 | 显示全部楼层
CH573芯片具备多个通用IO引脚,在固件编程中可以将其中某些引脚配置为PWM输出功能
plsbackup 发表于 2023-9-9 17:13 | 显示全部楼层
具有32位RISC-V内核、12通道的脉冲宽度调制
tifmill 发表于 2023-9-9 17:33 | 显示全部楼层
ch573可以pwmdma吗              
yorkbarney 发表于 2023-9-9 18:44 | 显示全部楼层
CH573-PWM是一种基于CH573芯片的PWM模块
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2347

主题

17448

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部

2347

主题

17448

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部