高级定时器—PWM互补输出

一、编程要点

1、初始化TMI相关GPIO

2、初始化时基结构体

3、初始化比较输出结构体

4、初始化死区刹车结构体

5、编写呼吸灯函数

二、结构体&库函数

1、时基结构体 

typedef struct
{
  uint16_t TIM_Prescaler;         /*!<  预分频器 配置TIMxPSC 寄存器    */
 
  uint16_t TIM_CounterMode;       /*!<  计数器模式 向上/向下    */
 
  uint16_t TIM_Period;            /*!<  定时周期  配置 ARR  (自动重装载寄存器)   */ 
 
  uint16_t TIM_ClockDivision;     /*!<  时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟
                                        频率分频比,  */
 
  //uint8_t TIM_RepetitionCounter;  /*!<  重复计数器 高级定时器专属 用于产生多少个PWM波    */
} TIM_TimeBaseInitTypeDef;

2、比较输出结构体

typedef struct
{
  uint16_t TIM_OCMode;        /*!< 比较输出模式 常用PWM1 PWM2 */

  uint16_t TIM_OutputState;   /*!< 比较输出使能 */

  uint16_t TIM_OutputNState;  /*!< 互补比较输出使能 */

  uint16_t TIM_Pulse;         /*!< 设置占空比 CRR的值 0-65535 */

  uint16_t TIM_OCPolarity;    /*!< 比较输出极性 */

  uint16_t TIM_OCNPolarity;   /*!< 互补比较输出极性*/

  uint16_t TIM_OCIdleState;   /*!< 空闲状态输出状态(高、低电平) */

  uint16_t TIM_OCNIdleState;  /*!< 互补空闲状态输出状态(高、低电平)*/

} TIM_OCInitTypeDef;

3、初始化死区刹车结构体

typedef struct
{

  uint16_t TIM_OSSRState;        /*!< 运行模式下的关闭状态选择 */

  uint16_t TIM_OSSIState;        /*!< 空闲模式下的关闭状态选择 */

  uint16_t TIM_LOCKLevel;        /*!< 锁定级别配置 */ 

  uint16_t TIM_DeadTime;         /*!<  死区时间 0-255  */

  uint16_t TIM_Break;            /*!< 断路功能选择  */

  uint16_t TIM_BreakPolarity;    /*!< 断路输出极性 */

  uint16_t TIM_AutomaticOutput;  /*!< 自动输出使能 */
} TIM_BDTRInitTypeDef;

三、TIM相关计算

1、PWM波频率计算

F = TIM_CLK/{(ARR+1)*(PSC+1)}
    TIM_CLK=72M   
    ARR(自动重装载的值)-> TIM_Period
    PCS(时钟预分频器) -> TIM_Prescaler
2、占空比计算
占空比=TIM_Pulse/TIM_Period

四、程序源码

1、Advanced_TIM.h 文件

#ifndef __ADVABCED_H
#define __ADVABCED_H
#include "stm32f10x.h"

#define RCC_APBx_CLOCK    RCC_APB2PeriphClockCmd
#define RCC_APBx_PERIPH   RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
#define RCC_APB2_TIMx			RCC_APB2Periph_TIM1

#define ADVANCED_TIMx			TIM1

#define TIMx_PSC          (9-1)
#define TIMx_ARR          (80-1)
#define TIMx_Pulse	     0

#define TIM_CH1_PIN 			GPIO_Pin_8
#define TIM_CH1_PORT 			GPIOA

#define TIM_CH1N_PIN 			GPIO_Pin_13
#define TIM_CH1N_PORT 		        GPIOB

#define TIM_BKIN_PIN 			GPIO_Pin_12
#define TIM_BKINN_PORT 		        GPIOB
void TIM_ADVANCED_Init(void);
#endif		//__ADVABCED_H
2、Advanced_TIM.c 文件
#include "Advanced_TIM.h"

static void ADVANCED_TIM_GPIOConfig(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APBx_CLOCK(RCC_APBx_PERIPH,ENABLE);

	//输出比较通道
	GPIO_InitStructure.GPIO_Pin = TIM_CH1_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(TIM_CH1_PORT,&GPIO_InitStructure);	
	
	//输出比较互补通道
	GPIO_InitStructure.GPIO_Pin = TIM_CH1N_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(TIM_CH1N_PORT,&GPIO_InitStructure);	
	
	//输出刹车通道
	GPIO_InitStructure.GPIO_Pin = TIM_BKIN_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(TIM_BKINN_PORT,&GPIO_InitStructure);	
	
}

static void ADVANCED_TIM_MODE_Config(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;		//时基结构
	TIM_OCInitTypeDef TIM_OCStructure;			//输出比较
	TIM_BDTRInitTypeDef TIM_BDTRStructure;			//刹车 死区
	
	RCC_APBx_CLOCK(RCC_APB2_TIMx,ENABLE);
	
	//时基配置
	TIM_TimeBaseStructure.TIM_Prescaler = TIMx_PSC;
	TIM_TimeBaseStructure.TIM_Period = TIMx_ARR;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit( ADVANCED_TIMx,&TIM_TimeBaseStructure );

	//比较输出
	TIM_OCStructure.TIM_OCMode = TIM_OCMode_PWM1;			//pwm1模式
	TIM_OCStructure.TIM_OutputState = TIM_OutputState_Enable;        //输出使能
	TIM_OCStructure.TIM_OutputNState = TIM_OutputNState_Enable;	//互补输出使能
	TIM_OCStructure.TIM_Pulse = TIMx_Pulse;				//占空比
	TIM_OCStructure.TIM_OCPolarity = TIM_OCPolarity_High;		//比较输出极性
	TIM_OCStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;		//互补比较输出极性
	TIM_OCStructure.TIM_OCIdleState = TIM_OCIdleState_Set;		//空闲输出电平
	TIM_OCStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;	//空闲互补输出电平
	
	TIM_OC1Init(ADVANCED_TIMx , &TIM_OCStructure );
	TIM_OC1PreloadConfig(ADVANCED_TIMx, TIM_OCPreload_Enable);

	//刹车死区
	TIM_BDTRStructure.TIM_OSSIState = TIM_OSSIState_Enable;
	TIM_BDTRStructure.TIM_OSSRState = TIM_OSSRState_Enable;
	TIM_BDTRStructure.TIM_Break = TIM_Break_Enable;
	TIM_BDTRStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
	TIM_BDTRStructure.TIM_DeadTime = 11 ;
	TIM_BDTRStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;	
	TIM_BDTRStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
	TIM_BDTRConfig( ADVANCED_TIMx , &TIM_BDTRStructure );
		
	TIM_Cmd(ADVANCED_TIMx, ENABLE );
	
	TIM_CtrlPWMOutputs( ADVANCED_TIMx, ENABLE );	
}

void TIM_ADVANCED_Init(void)
{
	ADVANCED_TIM_GPIOConfig();
	ADVANCED_TIM_MODE_Config();
}
3、main.c文件
#include "stm32f10x.h"  
#include "bsp_led.h"
#include "usart.h"
#include "Advanced_TIM.h"

int main(void)
{	
	uint32_t i;
	u8 STD=0,crr=0;
	
	USART_config();
	
	printf("串口测试\n");	
	TIM_ADVANCED_Init();
	
	TIM1->CCR1 = crr;
while(1)
  {                      
			
        TIM1->CCR1 = crr;

      if(STD==0)
        {
	    for(i=0x8ffff;i>0;i--);
	    crr++;
	    if(crr>=80)STD=1;
	}
	else
	{
	    for(i=0x8ffff;i>0;i--);
	    crr--;
	    if(crr<=0)STD=0;						
	}		
  }
}



猜你喜欢

转载自blog.csdn.net/qq_41985317/article/details/80866927