当前位置: 首页 > news >正文

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模式1TIM_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(互补通道)的相位差和死区时间。
http://www.dtcms.com/a/352137.html

相关文章:

  • yggjs_rbutton React按钮组件v1.0.0 多主题系统使用指南
  • 什么叫API对接HR系统?
  • 2025年8月技术问答第3期
  • 03MySQL——DCL权限控制,四种常用函数解析
  • SSM入门到实战: 3.6 SpringMVC RESTful API开发
  • 基于muduo库的图床云共享存储项目(一)
  • vs2019安装cpu版本的fftw 以实现傅里叶变换
  • 《护理学》10月版面征稿论文速递
  • 【46页PPT】AI智能中台用ABC+IOT重新定义制造(附下载方式)
  • SQLBot:一款基于大语言模型和RAG的智能数据分析工具
  • AI人工智能一体化HR系统如何选型?
  • 重塑金融管理会计核心引擎,容智管会智能体打造智能决策新基建
  • 手写MyBatis第35弹:@Select、@Insert等注解的背后原理
  • 【软考论文】论DevOps及其应用
  • BotCash:2025 中国算力大会——国家级数据标注产业供需对接大会
  • 【自记】Python 局部变量、全局变量及global的示例
  • Python实现RANSAC进行点云直线、平面、曲面、圆、球体和圆柱拟合
  • 负载均衡之平滑加权轮询(Smooth Weighted Round Robin)详解与实现
  • 前沿技术趋势与应用:探索数字世界的下一个十年
  • 本地通过阿里云ECS建立SSH隧道连接阿里云RDS MYSQL数据库
  • 【P2P】RELAY服务2:cmake+ c实现及ubuntu运行
  • 淘宝/天猫商品详情API数据解析【附代码】
  • 软件检测报告:XML外部实体(XXE)注入漏洞原因和影响
  • 【Erdas实验教程】031:遥感图像频率域增强(傅立叶变换)
  • BCI良好棉花认证标准及申请条件(2025年最新版)
  • 加密狗与U盘的核心区别,U盘能否替代加密狗?
  • 电力工程大模型驱动AI工程计算:从“算错挨骂”到“一键精准”
  • 开发指南135-CSS中定义参数
  • 技术干货丨基于SimSolid的塑胶模具温度场瞬态分析
  • 【贪心算法】day3