GD32F303固件库开发(12)----输出PWM及修改PWM频率与占空比

GD32F303固件库开发.12----输出PWM及修改PWM频率与占空比

概述

本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。
本章主要配置定时器输出PWM,同时演示PWM频率与占空比。
查阅手册可以得知,PB11为定时器1的通道3,对应ST的为定时器2的通道4。
需要GD样片的可以加QUN申请:615061293 。
在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1BD4y167fE/

GD32F303固件库开发(12)----输出PWM及修改PWM频率与占空比

csdn课程

课程更加详细。
https://download.csdn.net/course/detail/37144

样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#

生成例程

这里准备了自己绘制的开发板进行验证。

使用PB11进行验证。
在这里插入图片描述

工作过程

在ST中查看下面工作原理图可以得知,时钟可以由内部Internal clock产生或者外部ETR。
同时可以设置复位,使能,向上/向下,计数。
在这里插入图片描述
在GD中,内部时钟源 TIMER_CK。
在这里插入图片描述
同时分频只能为1、2、4。
在这里插入图片描述
查看ST下列文档可以得知,定时器主要有TIMx_CNT、TIMx_PSC、TIMx_ARR控制。
同时预分频器(TIMx_PSC)范围位1-65535。
在这里插入图片描述
查看TIMx_PSC说明,可以得知定时器频率为 fCK_PSC / (PSC[15:0] + 1)
在这里插入图片描述
可以看到,当psc设置为不同的值的时候,计数频率也会发生改变。
在这里插入图片描述
查看GD的文档,可以得知,控制 PSC_CLK可以进行分频,定时器频率为 fPSC_CLK / (PSC+ 1)。。
在这里插入图片描述
在这里插入图片描述
在ST中,同时ARR可以改变计数值,当写入的arr越大,他的频率越低,计数周期是ARR+1。
在这里插入图片描述
同时周期由TIMERx_CAR决定,pwm占空比由TIMERx_CHxCV决定。
在这里插入图片描述
ARR计数值如下所示。
在这里插入图片描述

在这里插入图片描述

占空比定义如下所示。

在这里插入图片描述
PWM频率计算如下所示。
其中ARR在GD中中用CAR去定义了。
在这里插入图片描述

配置TIM参数,预分频系数设置为120-1, 自动重载值设置为1000-1,那么PWM频率为120,000,000/((120-1+1)*(1000-1+1))=1000Hz,即1KHz。

初始化代码

		/*使能TIMER1时钟 */
		rcu_periph_clock_enable(RCU_TIMER1);
		/*使能GPIOB时钟 */
		rcu_periph_clock_enable(RCU_GPIOB);
		/*使能复用时钟 */
    rcu_periph_clock_enable(RCU_AF);

		/*设置io口,设置为复用模式 */
    gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
		/*TIMER1全部重映射*/
		gpio_pin_remap_config (GPIO_TIMER1_FULL_REMAP, ENABLE);




		timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;


		/*定时器复位 */
    timer_deinit(TIMER1);

    /* TIMER1 configuration */
		/*时钟分频系数 */
    timer_initpara.prescaler         = 120-1;
    /*边沿对齐 */
		timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    /*上升计数 */
		timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    /*计数值 */
		timer_initpara.period            = 1000-1;
    /*根据prescaler,clockdivision最终该定时器时钟评率为1M */
		timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    /*重复计数器的值 */
		timer_initpara.repetitioncounter = 0;
    /* */
		timer_init(TIMER1,&timer_initpara);

    /* CH0,CH1 and CH2 configuration in PWM mode */
		/*是否使能输出 */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    /*是否互补通道输出 */
		timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
    /*输出极性 */
		timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    /*输出死区延迟的极性 */
		timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    /*空闲状态下通道输出极性通道 */
		timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    /*空闲时互补通道输出极性 */
		timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

    /*配置通道 */
		timer_channel_output_config(TIMER1,TIMER_CH_3,&timer_ocintpara);



    /* CH3 configuration in PWM mode0,duty cycle 30% */
    /*设置阈值(比较值,调节占空比的时候调节这个值) */
		timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,300);
    /*输出模式配置 */
		timer_channel_output_mode_config(TIMER1,TIMER_CH_3,TIMER_OC_MODE_PWM0);
    /*不使用影子寄存器 */
		timer_channel_output_shadow_config(TIMER1,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE);



    /* 使能定时器自动重装载值 */
    timer_auto_reload_shadow_enable(TIMER1);
    /* 使能定时器 */
    timer_enable(TIMER1);

由于上述设置计数值位1000,那么设置30%的正占空比的ccr应该配置为30%*1000=300。

/*设置阈值(比较值,调节占空比的时候调节这个值) */
timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,300);

在这里插入图片描述

\

修改PWM频率

修改PWM频率可以修改PSC或者ARR来进行改变。

在这里插入图片描述

设置TIM自动重新加载寄存器值。
初始设置为PSC为120-1,ARR为1000-1,若设置为500-1,那么他的频率应该是120M/(120-1+1)(500-1+1)=2k
占空比为300/500*100%=60%

timer_autoreload_value_config (TIMER1, 500-1);

在这里插入图片描述

在运行时设置TIM Prescaler。
初始设置为ARR为500-1,PSC为120-1,若设置为60-1,那么他的频率应该是120M/(60-1+1)(500-1+1)=4k
占空比为300/500*100%=60%

timer_prescaler_config (TIMER1, 60-1, TIMER_PSC_RELOAD_NOW);

在这里插入图片描述

GD32F103RC微控制器上,GD标准库提供了一系列函数用于配置TIM3定时器的PWM功能,尤其是对于其通道CH1和CH2。以下是一个简单的步骤概述: 1. **包含头文件**: 首先,需要在你的C代码中包含相关的头文件: ```c #include "gd32f10x_tim.h" ``` 2. **初始化TIM3**: 确保TIM3模块处于关闭状态并配置时钟源、工作模式等基础设置: ```c TIM_InitTypeDef tim3_InitStructure; TIM_DeInit(TIM3); tim3_InitStructure.TIM_Prescaler = (SystemCoreClock / (16 * TIM3_APBCLKDivider)) - 1; // 根据实际系统时钟调整预分频 tim3_InitStructure.TIM_Period = 0xFFFF; // 设置周期长度,取决于你需要的占空比 tim3_InitStructure.TIM_ClockDivision = 0; // 分频系数设为1 tim3_InitStructure.TIM_CounterMode = TIM_COUNTERMODE_UP; // 单向计数 TIM_Init(TIM3, &tim3_InitStructure); TIM_Cmd(TIM3, ENABLE); // 启动TIM3 ``` 3. **配置TIM3 CH1和CH2作为PWM输出**: 对于每个通道,需要单独配置: ```c TIM_OCInitTypeDef timocInitStructure; timocInitStructure.TIM_OCMode = TIM_OCMODE_PWM1; // PWM1模式 timocInitStructure.TIM_OutputState = ENABLE; // 输出使能 timocInitStructure.TIM_PinSelect = TIM_PINSourceGPIOA; // GPIOA映射到对应通道 timocInitStructure.TIM_OCPolarity = TIM_OCPOLARITY_HIGH; // 输出高电平 TIM_OC1Init(TIM3, &timocInitStructure); // 对于CH1 TIM_OC1PreloadConfig(TIM3, ENABLE); // 先填充满缓冲区 // 对于CH2,更改TIM_PinSelect和TIM_OCxxIndex参数 TIM_OC2Init(TIM3, &timocInitStructure); TIM_OC2PreloadConfig(TIM3, ENABLE); ``` 4. **设置占空比**: 如果需要动态改变CH1和CH2的占空比,可以分别调用`TIM_OC1SetCompare`和`TIM_OC2SetCompare`函数设置比较值。 5. **启动通道**: 调用`TIM_OC1Cmd`和`TIM_OC2Cmd`启用或禁用特定通道的PWM输出。 记得替换示例中的`TIM_PINSourceGPIOA`为实际连接到CH1和CH2的GPIO引脚。此外,确保在实际应用中处理中断或者定时溢出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值