STM32 定时器(互补输出+刹车)

以下是一个基于STM32F103标准库实现的PWM互补输出+刹车功能的完整代码,使用高级定时器TIM1(支持互补输出和刹车功能)。代码包含详细注释和配置说明,适用于电机控制等场景。


🛠 完整代码实现(STM32F103标准库)

#include "stm32f10x.h"

// 引脚定义
#define PWM_CH1_PIN     GPIO_Pin_8     // PA8: TIM1_CH1
#define PWM_CH1N_PIN    GPIO_Pin_13    // PB13: TIM1_CH1N
#define BRAKE_PIN       GPIO_Pin_12    // PB12: TIM1_BKIN

// 定时器配置参数
#define PWM_FREQ        20000          // PWM频率20kHz
#define DEAD_TIME       0x36           // 死区时间≈500ns (72MHz时钟)
#define DUTY_CYCLE      50             // 初始占空比50%

void TIM1_PWM_Brake_Init(void) 
{
    GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
    TIM_OCInitTypeDef TIM_OCInitStruct;
    TIM_BDTRInitTypeDef TIM_BDTRStruct;

    // 1. 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | 
                           RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE);

    // 2. 配置GPIO
    // PA8 (TIM1_CH1): 复用推挽输出
    GPIO_InitStruct.GPIO_Pin = PWM_CH1_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // PB13 (TIM1_CH1N): 互补通道复用推挽输出
    GPIO_InitStruct.GPIO_Pin = PWM_CH1N_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // PB12 (TIM1_BKIN): 浮空输入(刹车信号)
    GPIO_InitStruct.GPIO_Pin = BRAKE_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 3. 定时器时基配置(20kHz PWM)
    TIM_TimeBaseStruct.TIM_Period = (SystemCoreClock / PWM_FREQ) - 1; // 自动重装载值
    TIM_TimeBaseStruct.TIM_Prescaler = 0;      // 无分频
    TIM_TimeBaseStruct.TIM_ClockDivision = 0;
    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStruct);

    // 4. PWM通道配置(互补输出)
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;        // PWM模式1
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Enable; // 互补通道使能
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;       // 主通道高电平有效
    TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_Low;    // 互补通道高低平有效
    TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset;    // 空闲时主通道低电平
    TIM_OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Set;  // 空闲时互补通道高电平
    TIM_OCInitStruct.TIM_Pulse = (TIM_TimeBaseStruct.TIM_Period * DUTY_CYCLE) / 100; // 占空比
    TIM_OC1Init(TIM1, &TIM_OCInitStruct);

    // 5. 死区与刹车配置
    TIM_BDTRStruct.TIM_OSSRState = TIM_OSSRState_Enable;
    TIM_BDTRStruct.TIM_OSSIState = TIM_OSSIState_Enable;
    TIM_BDTRStruct.TIM_LOCKLevel = TIM_LOCKLevel_1;
    TIM_BDTRStruct.TIM_DeadTime = DEAD_TIME;            // 死区时间
    TIM_BDTRStruct.TIM_Break = TIM_Break_Enable;        // 刹车功能使能
    TIM_BDTRStruct.TIM_BreakPolarity = TIM_BreakPolarity_High; // 高电平触发刹车
    TIM_BDTRStruct.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; // 自动恢复输出
    TIM_BDTRConfig(TIM1, &TIM_BDTRStruct);

    // 6. 启动定时器与PWM输出
    TIM_CtrlPWMOutputs(TIM1, ENABLE); // 关键!使能主输出
    TIM_Cmd(TIM1, ENABLE);             // 启动TIM1
}

int main(void) 
{

    // 初始化PWM互补输出+刹车
    TIM1_PWM_Brake_Init();

    while (1) 
    {
        // 主循环中可动态调整占空比
        // TIM_SetCompare1(TIM1, new_value); 
    }
}

🔍 关键配置说明

1. ​GPIO配置
  • 主通道(TIM1_CH1)​​:PA8,复用推挽输出
  • 互补通道(TIM1_CH1N)​​:PB13,复用推挽输出
  • 刹车引脚(TIM1_BKIN)​​:PB12,浮空输入(高电平触发刹车)
2. ​PWM互补输出
  • 模式​:PWM1(CNT < CCRx时输出有效电平)
  • 极性​:主/互补通道均高电平有效
  • 空闲状态​:刹车时强制拉低(TIM_OCIdleState_Reset
3. ​死区时间
  • 计算公式​:DeadTime = (DTG[7:0] + 1) * T_dts
    • 示例中0x36对应约500ns(72MHz时钟)
  • 作用​:防止主/互补信号同时导通导致短路
4. ​刹车功能
  • 触发条件​:PB12输入高电平时立即刹车
  • 行为​:
    • 主/互补通道输出空闲状态(低电平)
    • 自动恢复:当刹车信号消失后自动恢复PWM输出(TIM_AutomaticOutput_Enable

⚠️ 注意事项

  1. 时钟配置​:
    • 代码默认使用72MHz系统时钟,需在SystemInit()中配置PLL。
  2. 死区时间调整​:
    • 根据实际驱动电路调整DEAD_TIME值(参考数据手册DTG寄存器计算)。
  3. 占空比动态修改​:
    • while(1)中调用TIM_SetCompare1(TIM1, value)实时修改占空比。
  4. 调试工具​:
    • 用示波器观察PA8(主通道)和PB13(互补通道)的相位差和死区时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值