TIM高级定时器(2)输出比较(互补输出)

1. 作用

输出比较:用以输出PWM信号或脉冲信号
在这里插入图片描述
输入捕获和输出比较的寄存器共用,具体看初始化时的配置
在这里插入图片描述

2.PWM模式

输出比较有8种模式,其中,只有PWM输出模式最常用。
PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器ARR的值决定,占空比由比较寄存器CCR的值决定。(CCR既是捕获寄存器,也是比较寄存器,是哪一个,看TIM的初始化模式)
在这里插入图片描述
一般情况下使用PWM1模式,CNT递增,并配置高电平有效
PWM1模式,默认低电平,满足条件使得通道有效,跳变到高电平
PWM2模式,默认高电平,满足条件使得通道有效,跳变到低电平

3.带互补输出的PWM输出比较

只有通道1~3带互补输出,通道4无互补输出
带死区时间和刹车控制
选用通道CH1,CH1N,BKIN

PWM信号的频率为:
F=TIM_CLK/[(ARR+1)(PSC+1)]
PWM信号的占空比为:
占空比=CCR/(ARR+1)*100%
时基初始化结构体

typedef struct
{
  uint16_t TIM_Prescaler;        //分频因子    PSC                            72-1     即频率为1MHz,即1us    
  uint16_t TIM_CounterMode;      //计数模式,向上/向下(基本定时器可以不配置
                                 //TIM_CounterMode_Up|TIM_CounterMode_Down 
  uint16_t TIM_Period;           //自动重装载值 ARR                            1000-1   计数1000次,即1ms 
  uint16_t TIM_ClockDivision;    //外部输入时钟分频因子(基本定时器没有),只有使用死区时间时才使用,如果不使用,随便配置
  uint8_t TIM_RepetitionCounter; //重复计数器(高级定时器专属)       100,则每次重装载不触发中断,重装载100次以后才触发中断,即100ms
} TIM_TimeBaseInitTypeDef;       //时基初始化结构体

输出比较结构体

typedef struct
{
  uint16_t TIM_OCMode;        //PWM模式,TIM_OCMode_PWM1|TIM_OCMode_PWM2
  uint16_t TIM_OutputState;   //输出通道是否使能
  uint16_t TIM_OutputNState;  //互补通道是否使能
  uint16_t TIM_Pulse;         //CCR寄存器的值,占空比
  uint16_t TIM_OCPolarity;    //输出通道 高|低 电平有效
  uint16_t TIM_OCNPolarity;   //互补输出通道 高|低 电平有效
  uint16_t TIM_OCIdleState;   //空闲状态输出通道的电平
  uint16_t TIM_OCNIdleState;  //空闲状态互补输出通道的电平
} TIM_OCInitTypeDef;//输出比较结构体初始化

刹车和死区时间结构体

typedef struct
{

  uint16_t TIM_OSSRState;       //运行模式下“关闭状态”
  uint16_t TIM_OSSIState;        //空闲模式下“关闭状态”
  uint16_t TIM_LOCKLevel;      //锁定级别设置  
  uint16_t TIM_DeadTime;       //死区时间,参考数据手册 BDTR:UTG[7:0]描述
  uint16_t TIM_Break;          //刹车功能是否使能 
  uint16_t TIM_BreakPolarity;  //刹车输入 高/低 电平有效
  uint16_t TIM_AutomaticOutput;// 自动输出使能
} TIM_BDTRInitTypeDef;//刹车和死区结构体初始化
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);//通道1 输出比较结构体初始化
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);//通道1 是否允许自动重装载
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);//主输出使能
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);//设置通道1 输出比较的极性(空闲状态下的极性)
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);//设置通道1 互补输出的极性

4.PWM输出

tim.c

void PWM_IO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ; //CH1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;//BKIN、CH1N
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOB,GPIO_Pin_12);//BKIN引脚默认先输出低电平
}
void PWM_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	//初始化时基结构体
	TIM_TimeBaseStructure.TIM_Period = 7;  
	TIM_TimeBaseStructure.TIM_Prescaler = 8;
	//此处,要使PWM信号周期为1us,即频率为1Hz。
	//则根据(PSC+1)/72M为CNT计数器记一次数的时间,则(ARR+1)(PSC+1)/72M为一个PWM周期计数所需时间
	//则,72M/(ARR+1)(PSC+1)为PWM信号的频率,即(ARR+1)(PSC+1)=72,此时PWM频率为1MHz
	//PSC+1是官方规定,ARR+1是因为CNT从0开始计数
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //只有使用死区时间时才使用
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 
	//初始化输出比较结构体
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               //PWM1模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //输出通道有效
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补输出通道有效
	TIM_OCInitStructure.TIM_Pulse = 4;                              //占空比为4(周期为8,所以占空比为50%)  
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //输出通道高电平有效
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     //互补输出通道高电平有效
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;      //空闲状态输出通道呈高电平
	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;	//空闲状态互补输出通道呈低电平
	
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);    //TIM1使用通道OC1作为输出通道(也可以使用OC2、OC3)
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //允许TIM自动重装载
	
	//初始化刹车和死区结构体
	TIM_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Enable;
	TIM_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Enable;
	TIM_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_1;
	TIM_BDTRInitStructure.TIM_DeadTime=11;
	//由于	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;因此时钟为72HZ,所以死区时间为11/72M=152us;
	TIM_BDTRInitStructure.TIM_Break=TIM_Break_Enable;
	TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;
	TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
	
	
	TIM_Cmd(TIM1,ENABLE); //	TIM计数器使能
	TIM_CtrlPWMOutputs(TIM1,ENABLE);//主输出使能,仅高级定时器才使用
}
void PWM_Init(void)
{
	PWM_IO_Config();
	PWM_Mode_Config();
}

主函数只要写上PWM_Init()函数即可。

示波器应该连接相应引脚才行。
刹车功能检测:BKIN引脚连接电源正极(TIM_BreakPolarity_High)即可,看图像TIM_OCIdleState_Set、TIM_OCIdleState_Reset是否正确

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于高级定时器(Advanced Timer)和HAL库,您可以使用PWM(脉冲宽度调制)功能来实现互补输出。 首先,您需要选择一个支持PWM输出高级定时器通道。然后,使用HAL库的相关函数来配置和控制该通道的PWM输出。 下面是一个示例代码,用于配置高级定时器3的通道1和通道2为互补输出: ```c #include "stm32f4xx_hal.h" // 配置高级定时器3的通道1和通道2为互补输出 void PWM_Init(void) { TIM_HandleTypeDef htim; TIM_OC_InitTypeDef sConfigOC; // 初始化高级定时器3 htim.Instance = TIM3; htim.Init.Prescaler = 0; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 1000; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim); // 配置通道1为PWM输出 sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); // 配置通道2为互补输出 sConfigOC.OCMode = TIM_OCMODE_PWM2; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_2); // 启动PWM输出 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_2); } ``` 在这个示例中,高级定时器3的通道1和通道2被配置为互补输出。通道1的极性为高电平有效,占空比为50%;通道2的极性为低电平有效,占空比也为50%。您可以根据需要修改这些参数。 请注意,示例代码中的配置是基于STM32F4系列微控制器和HAL库的。如果您使用的是其他型号的微控制器或不同的库,配置方法可能会有所不同。请参考您所使用的微控制器和库的文档进行具体配置。 希望能对您有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值