一、编程要点
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;
}
}
}