基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形

本文介绍如何基于CH32F203微控制器使用TIM1定时器初始化并输出四个通道的固定占空比PWM波形。代码示例展示了一个多通道配置函数,允许对每个通道单独初始化,并提供了在主函数中设置不同占空比的示例。此外,文章还提及了使用RP2040逻辑分析仪来验证PWM波形。
摘要由CSDN通过智能技术生成

基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形


  • ✨虽然CH32F203和STM32F103重合度很高,但是在程序上有些外设还是不能兼容。外设的使用还是可以参考资料丰富的STM32来开发或学习使用。从对应提供的接口API函数来看,基本都是照搬的。
  • 🔖本案例是基于官方提供SDK资料中的单路PWM输出例程中新增的多通道PWM输出。
    • 🎈原案例:CH32F20xEVT\EVT\EXAM\TIM\PWM_Output
  • 🎞4通道输出PWM波形
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 🎉使用RP2040开源的逻辑分析仪,使用免费上位机软件PulseView参考pwm波形脉宽

在这里插入图片描述

📑多通道配置

  • ✨如果想对每个通道单独进行初始化配置,可以将下面的函数分开来写。
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_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
		//4个通道分别对应PA8 PA9 PA10 PA11
    GPIO_InitStructure.GPIO_Pin = (uint16_t)(GPIO_Pin_11 | GPIO_Pin_10 | GPIO_Pin_9| GPIO_Pin_8);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &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_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

#if (PWM_MODE == PWM_MODE1)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

#elif (PWM_MODE == PWM_MODE2)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

#endif

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);//通道1
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);//通道2
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);//通道3
    TIM_OC4Init(TIM1, &TIM_OCInitStructure);//通道4

    TIM_CtrlPWMOutputs(TIM1, ENABLE);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
    TIM_ARRPreloadConfig(TIM1, ENABLE);
    TIM_Cmd(TIM1, ENABLE);
}

📝main主函数

  • 🔰由于通道2在PA9引脚上,不能开启串口1,否则该引脚无法输出波形。
int main(void)
{
//    USART_Printf_Init( 115200 );//不能开启串口1,PA9 TIM1 PWM通道2
//    printf( "SystemClk:%d\r\n", SystemCoreClock );
//96000 000/48/100=2KHz
    TIM1_PWMOut_Init(1000, 48 - 1, 500);  //96000 000/4800=--->2KHz
    TIM_SetCompare1(TIM1, 800); //80%占空比
    TIM_SetCompare2(TIM1, 600); //60%占空比
    TIM_SetCompare3(TIM1, 400); //40%占空比
    TIM_SetCompare4(TIM1, 200); //20%占空比

    while(1);
}
📓如果项通过其他定时器实现多通道PWM输出功能,原理一样可以照搬,如果想调节每一路的占空比输出,需要补充对应的函数以及关联变量即可实现。

📚程序源码

链接: https://pan.baidu.com/s/1GHRg98C0MnlJ9uqjBhCQjQ
提取码: 4s9d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值