CH32X035的PWM输出实验

一、简介

CH32X035 是基于青稞 RISC-V 内核设计的工业级微控制器。CH32X035 内置 USB 和 PD PHY,支持 USB Host 主机和 USB Device 设备功能、PDUSB 及 Type-C 快充功能,内置可编程协议 I/O 控制器,提供了 2 组 OPA 运放、3 组 CMP 电压比较器、4 组 USART 串口、I2C、SPI、多组定时器、12 位 ADC、14 路 Touchkey 等丰富外设资源。

有多组定时器:

2 个 16 位高级定时器,增加死区控制和紧急 刹车,提供用于电机控制的 PWM 互补输出

1 个 16 位通用定时器,提供输入捕获/输出比 较/PWM

2 个看门狗定时器:独立和窗口型

系统时基定时器:64 位计数器

CH32X035有提供多种封装型号:

二、PWM的基本介绍

1、什么是PWM

PWM,全称是 Pulse Width Modulation,中文译为脉冲宽度调制。通过控制开关信号的频率和宽度控制输出。

PWM的重要控制参数有三个:

频率:指1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是1秒内有多少个PWM周期。频率的单位是赫兹(Hz)。

周期:是频率的倒数,即一个完整脉冲信号所持续的时间。

占空比:在一个脉冲周期内,高电平的时间占总时间的比例。占空比通常用百分比(%)来表示。

通常在使用PWM的过程中,主要设置的控制参数为频率和占空比,占空比越高说明输出的功率越大,频率越高控制的越平滑,但是频率升高对外部的开关器件要求会越高,MOS管的发热会越严重。

2、PWM的应用

PWM是控制信号,通常用于做电机转速控制、LED灯光亮度控制、电源控制、音频输出等,在电机转速的控制中,可以利用PWM信号控制功率开关,利用占空比的大小控制转速的大小。在控制LED的时一般要注意控制的频率,高频控制可以减小肉眼对LED频闪的捕捉。

在电源控制方案中,可以通过PWM输出波形经过RC电路滤波后输入到运算放大器(OPA)缓冲,然后经过隔离电阻连接到FB引脚,控制DCDC输出Vout的大小。

三、CH32X035如何产生PWM信号

在硬件上CH32X035具备6个通道的三相PWM发生器,具有带死区插入的互补PWM输出功能。

软件实例:

本文使用的DEMO是CH32X035F8U6,实验中使用的引脚为PB11,PB11的映射为T1C3,所以例程如下:

void TIM1_PWMOut_Init(u16 arr, u16 psc, u16 ccp)
{
    GPIO_InitTypeDef        GPIO_InitStructure = {0};
    TIM_OCInitTypeDef       TIM_OCInitStructure = {0};
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);

    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Disable);
    TIM_ARRPreloadConfig(TIM1, ENABLE);
}

初始化PWM输出函数,配置定时器1(TIM1)的通道3,在GPIOB的第11号引脚(PB11)上产生一个可调节的PWM信号。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);

通过RCC使能GPIOB端口和定时器1(TIM1)的时钟。

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

将PB11引脚配置推挽输出,输出频率为50MHz。

    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

PWM的频率计算是:PWM频率 = 系统时钟 / (PSC + 1) /(arr + 1);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);

选择PWM模式1。在这种模式下,当计数器值小于比较值(ccp)时,输出为有效电平;大于比较值时,输出为无效电平。

输出状态设为使能,极性为高电平有效。

因为PB11的映射是T1C3所以将比较值ccp写入通道3的捕获/比较寄存器。

占空比计算公式为:占空比 = ccp / (arr + 1)

TIM1_PWMOut_Init( 100, 48000-1, 50 );

测试PWM输出波形,

CH32X035的TIM1时钟源的频率为48Mhz,

频率 = 48000000 / (48000 x 101) ≈ 9.900Hz

周期 = 1 / 频率 = 1 / 9.9 ≈0.101s

占空比 = cpp / (arr+1) = 50 / 101 ≈ 49.5%

每个周期高电平约为50ms,低电平约为51ms。

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值