打印
[蓝牙芯片]

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

[复制链接]
1944|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-7-7 17:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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呼吸灯效果变化。
————————————————
版权声明:本文为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功能呢

使用特权

评论回复
5
coshi| | 2023-8-5 20:28 | 只看该作者
我们用dac驱动外部器件的时候,是不是还需要考虑到器件的执行延时啊

使用特权

评论回复
6
qcliu| | 2023-8-5 21:00 | 只看该作者
如何实现动态更改pwm的占空比和频率呢

使用特权

评论回复
7
drer| | 2023-8-5 21:32 | 只看该作者
为什么在单片机上无法实现通过调节幅值来实现速度的控制呢

使用特权

评论回复
8
yorkbarney| | 2023-9-7 16:50 | 只看该作者
使用CH573的PWM功能,您可以生成特定频率和占空比的PWM信号,以控制外部设备

使用特权

评论回复
9
rosemoore| | 2023-9-7 16:57 | 只看该作者
CH573芯片具备多个通用IO引脚,在固件编程中可以将其中某些引脚配置为PWM输出功能

使用特权

评论回复
10
plsbackup| | 2023-9-9 17:13 | 只看该作者
具有32位RISC-V内核、12通道的脉冲宽度调制

使用特权

评论回复
11
tifmill| | 2023-9-9 17:33 | 只看该作者
ch573可以pwmdma吗              

使用特权

评论回复
12
yorkbarney| | 2023-9-9 18:44 | 只看该作者
CH573-PWM是一种基于CH573芯片的PWM模块

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1903

主题

15576

帖子

11

粉丝