一、简介
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。
测试结果


1125

被折叠的 条评论
为什么被折叠?



