基于CH32V307VCT6的通用定时器功能实现——输出比较(PWM波的生成)

通用定时器的功能概述

通用定时器除了具有基础定时器的功能以外,还具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能。

通用定时器的输出比较简介

OC(Output Compare)输出比较可以通过比较CNT与CCR寄存器(输入捕获寄存器)值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形,每个高级定时器和通用定时器都拥有4个输出比较通道。注意高级定时器的前3个通道额外拥有死区生成和互补输出的功能。
在这里插入图片描述
由于本此使用的是定时器的输出比较部分,我们着重分析右下角,输出比较与输入捕获的核心在于捕获比较寄存器,但定时器用于输出比较时,则捕获比较寄存器为比较寄存器,而定时器用于输入捕获时,则捕获比较寄存器为捕获寄存器。
输出比较的工作模式为,内部时钟信号经过时基单元分频后,计数器CNT在自增时会与CCR继续比较,其输出模式又有以下几种:
在这里插入图片描述
我们常用的是PWM模式1,在CNT小于CCR时,通道输出有效电平信号,CNT大于CCR时,通道输出无效电平信号。由此可见PWM的周期取决于时基单元,而占空比取决于CCR与时基单元,基于CCR与ARR的比值。
在这里插入图片描述
而有效电平则与CC1P选择器有关,其选择对应的波形输出的极性,这里我们通常都选择为高极性,也就是有效电平为高电平,理论部分就到这,下面开始配置代码。

代码配置

在配置定时器的过程种,这里通道输出所对应的GPIO口仍然需要查引脚复用表所得。

/*
    通用定时器TIM4的配置;输出比较OC(输出PWM)
  CNT与CCR(捕获比较寄存器)比较
  TIM4_CH1 PB6
*/
void Tim4_Init(u16 arr,u16 psc,u16 ccr)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0};
    TIM_OCInitTypeDef TIM_OCInitStructure = {0};
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    /*GPIO配置*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    /*定时器时基单元配置*/
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//设置为向上计数
    TIM_TimeBaseStructure.TIM_Prescaler=psc-1;//设置预分频值
    TIM_TimeBaseStructure.TIM_Period=arr-1;//自动重装载值
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

	/*输出比较配置*/
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               // PWM模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 使能输出
    TIM_OCInitStructure.TIM_Pulse = ccr;                            // 脉冲宽度,决定占空比
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       // 输出极性高(有效电平为高电平)
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);
    TIM_Cmd(TIM4, ENABLE);
}

执行此函数后,定时器就可以成功输出PWM波了,这也是定时器使用的最常用的功能之一。但要注意的是,同一输出比较与输入捕获是共用一个单元的,因此一个通道无法同时实现两种功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值