GD32F103 定时器PWM输出

一、简介

PWM:英文全称“Pulse Width Modulation”也叫“脉冲宽度调制”是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度控制。

1.1、结构框图线路

2.1、PWM原理

这个图简单的说,就是在0~ARR是一个周期需要的时间,通过CCRx来调整高低电平的占空比,CNT>=CCRx为高电平,否则为低电平,每当CNT=ARR时,CNT就会重新归零。

1.3、这里我们使用PA2这个引脚来输出PWM

从表中你给我们可以看出可以使用TIMER1_CH2通道,也可以使用TIMER4_CH2通道,也可以使用TIMER8_CH0通道,这里我们使用TIMER4_CH2来做PWM输出

二、函数介绍

2.1、函数汇总

库函数名称

库函数描述

timer_deinit

复位外设TIMERx

timer_struct_para_init

初始化外设TIMER结构体参数

timer_init

初始化外设TIMERx

timer_enable

使能外设TIMERx

timer_disable

除能外设TIMERx

timer_auto_reload_shadow_enable

TIMERx自动重装载影子使能

timer_auto_reload_shadow_disable

TIMERx自动重装载影子除能

timer_update_event_enable

TIMERx更新使能

timer_update_event_disable

TIMERx更新除能

timer_counter_alignment

设置外设TIMERx的对齐模式

timer_counter_up_direction

设置外设TIMERx向上计数

timer_counter_down_direction

设置外设TIMERx向下计数

timer_prescaler_config

配置外设TIMERx预分频器

timer_repetition_value_config

配置外设TIMERx的重复计数器

timer_autoreload_value_config

配置外设TIMERx的自动重载寄存器

timer_counter_value_config

配置外设TIMERx的计数器值

timer_counter_read

读取外设TIMERx的计数器值

timer_prescaler_read

读取外设TIMERx的预分频值

timer_single_pulse_mode_config

配置外设TIMERx的单脉冲模式

timer_update_source_config

配置外设TIMERx的更新源

timer_dma_enable

外设TIMERx的DMA使能

timer_dma_disable

外设TIMERx的DMA除能

timer_channel_dma_request_source_select

外设TIMERx的通道DMA请求源选择

timer_dma_transfer_config

配置外设TIMERx的DMA模式

timer_event_software_generate

软件产生事件

timer_break_struct_para_init

初始化外设TIMER终止功能结构体参数

timer_break_config

配置终止功能

timer_break_enable

使能TIMERx的终止功能

timer_break_disable

除能TIMERx的终止功能

timer_automatic_output_enable

自动输出使能

timer_automatic_output_disable

自动输出除能

timer_primary_output_config

所有的通道输出使能

timer_channel_control_shadow_config

通道换相控制影子配置

timer_channel_control_shadow_update_config

通道换相控制影子寄存器更新控制

timer_channel_output_struct_para_init

初始化外设TIMER通道输出结构体参数

timer_channel_output_config

外设TIMERx的通道输出配置

timer_channel_output_mode_config

配置外设TIMERx通道输出比较模式

timer_channel_output_pulse_value_config

配置外设TIMERx的通道输出比较值

timer_channel_output_shadow_config

配置TIMERx通道输出比较影子寄存器功能

timer_channel_output_fast_config

配置TIMERx通道输出比较快速功能

timer_channel_output_clear_config

配置TIMERx的通道输出比较清0功能

timer_channel_output_polarity_config

通道输出极性配置

timer_channel_complementary_output_polarity_config

互补通道输出极性配置

timer_channel_output_state_config

配置通道状态

timer_channel_complementary_output_state_config

配置互补通道输出状态

timer_channel_input_struct_para_init

初始化外设TIMER通道输入结构体参数

timer_input_capture_config

配置TIMERx输入捕获参数

timer_channel_input_capture_presc

配置TIMERx通道输入捕获预分频值

timer_channel_capture_value_register_read

读取通道捕获值

timer_input_pwm_capture_config

配置TIMERx捕获PWM输入参数

timer_hall_mode_config

配置TIMERx的HALL接口功能

timer_input_trigger_source_select

TIMERx的输入触发源选择

timer_master_output_trigger_source_select

选择TIMERx主模式输出触发

timer_slave_mode_select

TIMERx从模式配置

timer_master_slave_mode_config

TIMERx主从模式配置

timer_external_trigger_config

配置TIMERx外部触发输入

timer_quadrature_decoder_mode_config

TIMERx配置为编码器模式

timer_internal_clock_config

TIMERx配置为内部时钟模式

timer_internal_trigger_as_external_clock_config

配置TIMERx的内部触发为时钟源

timer_external_trigger_as_external_clock_config

配置TIEMRx的外部触发作为时钟源

timer_external_clock_mode0_config

配置TIMERx外部时钟模式0,ETI作为时钟源

timer_external_clock_mode1_config

配置TIMERx外部时钟模式1

timer_external_clock_mode1_disable

TIMERx外部时钟模式1禁能

timer_interrupt_enable

外设TIMERx中断使能

timer_interrupt_disable

外设TIMERx中断除能

timer_interrupt_flag_get

获取外设TIMERx的中断标志

timer_interrupt_flag_clear

清除外设TIMERx的中断标志

timer_flag_get

获取外设TIMERx的状态标志

timer_flag_clear

清除外设TIMERx状态标志

2.2、timer_channel_output_config函数介绍

2.3、timer_channel_output_mode_config函数介绍

2.4、timer_channel_output_pulse_value_config函数介绍

三、功能实现

3.1、timer4_pwm_duty_set函数实现

uint16_t period_num=0;//这个变量用来保存自动重装载值
// 功能:调整pwm的占空比,1~100
// duty: 捕获/比较
void timer4_pwm_duty_set(uint16_t duty)
{
    uint16_t pulse1=period_num/100.0*duty;
	timer_channel_output_pulse_value_config(TIMER4, TIMER_CH_2,pulse1);
}

函数实现设置PWM的占空比,这个函数可以查看“2.1、PWM原理”这个图

变量介绍

period_nom:就是图中的ARR

pulse1:就是图中的CCRx

duty:是占空比

我们把period_nom分成100份,然后乘以duty就能得到设置的占空比

3.2、TIMER4_PWM_Init函数实现,就是用来初始化

//TIMER4 PWM输出初始化
void TIMER4_PWM_Init(uint16_t psc,uint16_t arr)
{
    timer_parameter_struct timer_init_struct;//定义初始化结构体
    timer_oc_parameter_struct timer_oc_init_struct;
    
    rcu_periph_clock_enable(RCU_TIMER4);//使能TIMER4定时器
    rcu_periph_clock_enable(RCU_AF);
    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);//GPIO KEY 初始化
    
    timer_deinit(TIMER4);      //复位外设TIMERx
    timer_init_struct.prescaler      = psc;//设置分频系数
    timer_init_struct.period         = arr;//自动重装载值
    timer_init_struct.alignedmode    = TIMER_COUNTER_EDGE;//对齐方式
    timer_init_struct.clockdivision  = TIMER_CKDIV_DIV1;//时钟分频因子
    timer_init_struct.counterdirection = TIMER_COUNTER_UP;//向上计数
    timer_init(TIMER4,&timer_init_struct);
    //PWM初始化
    timer_oc_init_struct.outputstate = TIMER_CCX_ENABLE;
    timer_channel_output_config(TIMER4,TIMER_CH_2,&timer_oc_init_struct);//外设TIMER4的通道输出配置
    
    timer_channel_output_mode_config(TIMER4,TIMER_CH_2,TIMER_OC_MODE_PWM0);//通道2输出PWM比较模式
    
//    timer_channel_output_pulse_value_config(TIMER4,TIMER_CH_2,arr/2);//配置外设TIMERx的通道输出比较值
    period_num=arr;
    timer4_pwm_duty_set(50);
    timer_enable(TIMER4);//使能定时器4
}

3.3、主函数实现

int main(void)
{
    SystemClock_Config();//系统时钟配置
    systick_config();//systick配置

    LED_Init();
    TIMER4_PWM_Init(72-1,1000-1);
    while(1)
    {
        
    }
    return 0;
}

TiMER4_PWM_Init(72-1,1000-1);设置的其实就是1000Hz的频率,由于我们这个函数里面设置占空比为50,所以程序输出频率为1000Hz占空比为50。

频率=72Mhz/72/1000=1000Hz

3.4、函数结果如下

通过逻辑分析仪抓取发现程序输出结果符合预期

为实现GD32f103定时器输出固定PWM,可以根据以下步骤进行配置和初始化操作: 1. 首先,需要配置GPIO以设置定时器输出引脚。可以使用函数`inpit_gpio_config()`来配置GPIO引脚,例如在PA6上配置为TIM2的CH0通道。 2. 接下来,需要进行定时器的基本初始化。可以使用函数`trigger_time_base_init()`来初始化定时器。在该函数中,需要设置定时器的时钟频率、计数模式、重载值等参数。此外,根据需要可以选择使能或禁用定时器。 3. 接下来,需要配置PWM输入模式。可以使用函数`time_pwm_break_config()`来配置PWM输入模式,其中需要设置中止功能的电平、死区时间等参数。 4. 最后,可以在`main`函数中调用以上配置和初始化函数,并使能定时器。在while循环中可以进行其他操作或保持定时器工作。 需要注意的是,定时器PWM输出周期和占空比可以通过中断来获取。在中断中,可以记录定时器当前值来获取PWM周期,以及在下降沿中断中记录计数器值来获取占空比的值。 总结起来,以上步骤提供了一个基本的方法来配置和初始化GD32f103定时器输出固定PWM。通过适当调整参数和设置中断处理程序,可以实现不同的PWM周期和占空比要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [10. GD32F103C8T6 定时器-测量pwm的占空比和频率](https://blog.csdn.net/u010261063/article/details/124086472)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [13. GD32F103C8T6入门教程-定时器-3路pwm输出-刹车死区保护](https://blog.csdn.net/u010261063/article/details/124105535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值