简单理解:STM32 互补 PWM 死区时间,档位设计 + 原理 + 实操全解析

一、 死区档位 “多高 3 位值” 的设计本质

DT 寄存器是 8 位(bit0~bit7),被拆为高 3 位(档位位)+ 低 5 位(微调位),一个档位对应多个高 3 位值的核心目的是:在有限的 8 位寄存器中,同时实现 “更宽的时间覆盖范围” 和 “足够的调整精度”

用 “分楼 + 房间” 比喻理解

把 8 位寄存器比作8 层大楼

  • 每层楼有32 个房间(对应低 5 位的 0~31,即 32 个微调值);
  • 大楼要分成4 个区域(对应 4 个档位),每个区域负责不同的死区时间范围。

若每个区域只占 1 层楼:

  • 4 个区域仅占 4 层,剩下 4 层浪费;
  • 每个区域只有 32 个房间,时间覆盖范围窄。

因此硬件设计让每个区域占多层楼(一个档位对应多个高 3 位值):

档位占的楼层数(高 3 位值数量)总房间数(微调值数量)覆盖的时间范围(72MHz 时钟)
1 档4 层(高 3 位 000/001/010/011)4×32=128 个0~127×13.89ns≈1.76μs
2 档2 层(高 3 位 100/101)2×32=64 个1.81~2.63μs
3 档1 层(高 3 位 110)32 个3.61~7.09μs
4 档1 层(高 3 位 111)32 个14.45~28.35μs

关键逻辑说明

1 档最大 DT 值为127,计算逻辑为:完整值高位低位总房间数 4×32=128 个,对应 DT 值范围 0~127(共 128 个连续数值),两者为 “数量” 与 “取值范围” 的对应关系。

二、 核心优势:覆盖范围 + 精度双保障

一个档位对应多个高 3 位值,实现了 “鱼和熊掌兼得”:

  1. 覆盖范围更宽:比如 1 档从 “仅覆盖 0~0.43μs” 扩展到 “覆盖 0~1.76μs”,能满足更多短死区场景;
  2. 调整精度不变:低 5 位始终是 0~31,每一步调整的最小时间是 1×13.89ns≈13.89ns,精度没有牺牲。

三、 关键单位进制(ns 与 μs)

死区时间计算中常用的两个时间单位换算关系为:1 μs=1000 ns1 ns=0.001 μs

示例换算:

  • 13.89 ns=0.01389 μs
  • 514 ns=0.514 μs
  • 1.9 μs=1900 ns

四、 档位判定 + 计算全规则(含多高 3 位值对应关系)

1. 档位与高 3 位值对应表

档位高 3 位二进制值(多个)高 3 位十进制范围DT 值十六进制范围快速判定(看十六进制首位)
1 档(无放大)000、001、010、0110~30x00~0x3F0/1/2/3 开头
2 档(2 倍放大)100、1014~50x80~0xBF8/9/A/B 开头
3 档(8 倍放大)11060xC0~0xDFC/D 开头
4 档(32 倍放大)11170xE0~0xFFE/F 开头

2. 分档位计算公式(含单位换算 + 核心参数解释 + 2 档高 3 位取值说明)

档位核心计算公式(72MHz 时钟)公式中关键参数解释单位换算说明示例计算结果(双单位)
1 档看上图1. 完整 DT 值:高 3 位 + 低 5 位共同决定的 8 位数值(范围 0~127);2. 高 3 位十进制值:1 档高 3 位二进制(000/001/010/011)对应十进制(0~3);3. 32:低 5 位的权重(二进制左移 5 位等价 ×32,对应低 5 位范围 0~31);4. 低 5 位十进制值:低 5 位二进制(00000~11111)对应十进制(0~31);5. 13.89ns:72MHz 时钟单个周期时长(1/(72×106)≈13.89 ns)结果 ÷1000 转换为 μs步骤 1:拆解 DT=0x25 → 二进制0010 0101;步骤 2:高 3 位(bit7~bit5)001→十进制 1;低 5 位(bit4~bit0)00101→十进制 5;步骤 3:完整 DT 值 = 1×32+5=37;步骤 4:死区时间 = 37×13.89 ns=513.93 ns514 ns / 0.51 μs
2 档看上图1. 64:2 档固定基础偏移值(2×32,2 为放大系数,32 为低 5 位基数);2. DT[4:0]​:低 5 位值(0~31);3. 2:2 档硬件放大系数(21);4. 13.89ns:72MHz 时钟单个周期时长;※ 2 档高 3 位(100/101)仅标识档位,低 5 位相同则死区时间一致结果 ÷1000 转换为 μs示例 1(高 3 位 = 100,DT=0x85):低 5 位 = 5 → (64+5)×2×13.89 ns=1916.82 ns;示例 2(高 3 位 = 101,DT=0xA5):低 5 位 = 5 → (64+5)×2×13.89 ns=1916.82 ns1917 ns / 1.92 μs
3 档看上图1. 32:3 档固定基础偏移值(硬件简化后的低 5 位基数);2. DT[4:0]​:低 5 位值(0~31);3. 8:3 档硬件放大系数(23);4. 13.89ns:72MHz 时钟单个周期时长结果 ÷1000 转换为 μsDT=0xC3 → 低 5 位 = 3 → (32+3)×8×13.89 ns=3889.2 ns3889 ns / 3.89 μs
4 档看上图1. 32:4 档固定基础偏移值(硬件简化后的低 5 位基数);2. DT[4:0]​:低 5 位值(0~31);3. 32:4 档硬件放大系数(25);4. 13.89ns:72MHz 时钟单个周期时长结果 ÷1000 转换为 μsDT=0xF0 → 低 5 位 = 16 → (32+16)×32×13.89 ns=21335.04 ns21335 ns / 21.34 μs


3. 低 5 位固定、高 3 位不同的计算实例(含单位换算)

以 ** 低 5 位固定为二进制01010/ 十进制10** 为例,计算逻辑为:完整值(十进制)高位十进制值低位十进制值死区时间完整值完整值

低 5 位(二进制)低 5 位(十进制)高 3 位(二进制)高 3 位(十进制)完整 DT 值(十六进制)完整 DT 值(十进制)死区时间(ns)死区时间(μs)
010101000000x0A10138.90.14
010101000110x2A42583.380.58
010101001020x4A741027.861.03
010101001130x6A1061472.341.47

4. DT=0x85 拆分为高 3 位 + 低 5 位的验证步骤

第一步:明确 8 位寄存器结构 →高3位(bit7~bit5) + 低5位(bit4~bit0)第二步:0x85 转 8 位二进制 → 8(1000)+ 5(0101)=10000101第三步:拆分高低位

  • 高 3 位(bit7~bit5):取前 3 位 →100(十进制 4,属于 2 档)
  • 低 5 位(bit4~bit0):取后 5 位 →00101(十进制 5)

验证计算(2 档死区时间):(64+5)×2×13.89ns=1916.82ns≈1.92μs

五、 实操结论

一个档位对应多个高 3 位值,是硬件资源的高效复用设计

  1. 不用纠结 “为什么多个值”,只需记住 “高 3 位在对应范围内,就属于该档位”;
  2. 1 档公式需先拆解高 / 低 5 位计算完整 DT 值,再乘以时钟周期;2/3/4 档仅需低 5 位,高 3 位仅做档位标识;
  3. 低 5 位固定时,1 档高 3 位直接决定完整 DT 值的大小,2 档两种高 3 位值无功能差异;
  4. 计算结果默认单位为 ns,除以 1000 即可快速转换为 μs,适配不同场景的表述需求。

以 STM32F103(最常用的型号)为例,给出可直接复用的代码模板,并详细解释死区时间配置、互补 PWM 输出的关键步骤,方便你移植到自己的项目中。

一、完整代码模板(以 TIM1_CH1/CH1N 为例)

TIM1 是 STM32F103 的高级定时器,原生支持互补 PWM + 死区时间,适合电机驱动等场景,代码如下:

#include "stm32f10x.h" // 宏定义:PWM周期、占空比、死区时间(可根据需求修改) #define PWM_ARR 999 // 自动重载值,决定PWM周期:T = (ARR+1)*T_clk #define PWM_CCR 500 // 比较值,决定占空比:Duty = CCR/(ARR+1)*100% = 50% #define DEAD_TIME 0x0F // 死区时间配置值(需根据公式计算,示例为约1us) /** * @brief TIM1 带死区互补PWM初始化函数 * @note 通道配置:CH1(PWM输出) - PA8,CH1N(互补PWM) - PB13 * 时钟源:APB2=72MHz,TIM1时钟=72MHz,预分频=72 → 计数频率=1MHz */ void TIM1_Complementary_PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; // 1. 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 2. 配置GPIO引脚(CH1=PA8,CH1N=PB13,复用推挽输出) // CH1 - PA8 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // CH1N - PB13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_Init(GPIOB, &GPIO_InitStructure); // 3. 配置定时器时基参数 TIM_TimeBaseStructure.TIM_Period = PWM_ARR; // 自动重载值,PWM周期=1000*1us=1ms(频率1kHz) TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器:72MHz/(71+1)=1MHz,计数周期1us TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频=1 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 4. 配置PWM输出比较参数(CH1) TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1:CNT<CCR时输出有效电平 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// 使能CH1输出 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; // 使能CH1N互补输出 TIM_OCInitStructure.TIM_Pulse = PWM_CCR; // 比较值,占空比50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // CH1有效电平为高 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; // CH1N有效电平为高 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; // 空闲时CH1置低 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; // 空闲时CH1N置低 TIM_OC1Init(TIM1, &TIM_OCInitStructure); // 应用到CH1通道 // 5. 配置死区时间(核心) TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; // 运行模式下OSSR使能 TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; // 空闲模式下OSSI使能 TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; // 锁定级别:关闭 TIM_BDTRInitStructure.TIM_DeadTime = DEAD_TIME; // 死区时间配置值(关键参数) TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; // 禁止刹车功能 TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; // 刹车电平高 TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; // 自动输出使能 TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); // 应用死区配置 // 6. 使能PWM输出和定时器 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // 使能CH1预装载寄存器 TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能ARR预装载 TIM_Cmd(TIM1, ENABLE); // 使能TIM1 TIM_CtrlPWMOutputs(TIM1, ENABLE); // 高级定时器必须开启这个才能输出PWM } // 主函数测试示例 int main(void) { TIM1_Complementary_PWM_Init(); // 初始化带死区的互补PWM while(1) { // 可在循环中动态修改CCR值调整占空比,例如: // TIM_SetCompare1(TIM1, 300); // 修改占空比为30% } }

二、关键代码解释

1. 死区时间计算(核心)

STM32 的死区时间由TIM_DeadTime寄存器值决定,计算公式(以 TIM1 为例):

若 DT[7:5] = 0xx → 死区时间 = DT[7:0] × Tdtck(Tdtck=1/72MHz≈13.89ns) 若 DT[7:5] = 10x → 死区时间 = (64 + DT[4:0]) × 2 × Tdtck 若 DT[7:5] = 110 → 死区时间 = (32 + DT[4:0]) × 8 × Tdtck 若 DT[7:5] = 111 → 死区时间 = (32 + DT[4:0]) × 32 × Tdtck

示例中DEAD_TIME=0x0F(二进制 00001111):死区时间 = 15 × 13.89ns ≈ 208ns(可根据功率器件调整,如 MOS 管一般配置 1~5us)。

2. 核心配置要点
  • TIM_OutputNState_Enable:必须开启,才能输出互补 PWM(CH1N)。
  • TIM_CtrlPWMOutputs(TIM1, ENABLE):高级定时器(TIM1/TIM8)专属,必须调用才能使能 PWM 输出。
  • TIM_OCMode_PWM1:两种 PWM 模式区别:
    • PWM1:CNT < CCR → 有效电平;CNT ≥ CCR → 无效电平。
    • PWM2:CNT < CCR → 无效电平;CNT ≥ CCR → 有效电平。
3. 引脚对应关系(STM32F103)
定时器通道主 PWM 引脚互补 PWM 引脚
TIM1_CH1PA8PB13
TIM1_CH2PA9PB14
TIM1_CH3PA10PB15

三、总结

  1. 核心配置步骤
    • 使能定时器 / 引脚时钟 → 配置复用 GPIO → 初始化定时器时基 → 配置 PWM 输出(含互补通道)→ 配置死区时间 → 使能输出。
  2. 死区时间关键
    • 根据功率器件的关断延迟计算配置值,避免过小(短路)或过大(波形畸变)。
  3. 高级定时器注意
    • 必须调用TIM_CtrlPWMOutputs()才能输出 PWM,普通定时器无需此步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rembg模型架构深度解析:U2NET原理

Rembg模型架构深度解析&#xff1a;U2NET原理 1. 智能万能抠图 - Rembg 在图像处理与内容创作领域&#xff0c;自动去背景是一项高频且关键的需求。无论是电商商品图精修、社交媒体内容制作&#xff0c;还是AI艺术生成前的素材准备&#xff0c;精准、高效的背景移除技术都至关…

从零开始使用MiDaS:深度估计实战指南

从零开始使用MiDaS&#xff1a;深度估计实战指南 1. 引言&#xff1a;走进单目深度估计的世界 在计算机视觉领域&#xff0c;三维空间感知一直是实现智能交互、机器人导航和增强现实&#xff08;AR&#xff09;的核心能力。然而&#xff0c;传统深度感知依赖双目摄像头或多传…

单目深度估计MiDaS:安防监控场景实践案例

单目深度估计MiDaS&#xff1a;安防监控场景实践案例 1. 引言&#xff1a;AI单目深度估计在安防中的价值 随着智能安防系统的不断演进&#xff0c;传统的2D视频监控已难以满足对空间感知和行为理解的高阶需求。如何让摄像头“看懂”三维世界&#xff0c;成为提升异常检测、入…

MiDaS部署技巧:如何优化CPU环境下的推理速度

MiDaS部署技巧&#xff1a;如何优化CPU环境下的推理速度 1. 引言&#xff1a;AI 单目深度估计 - MiDaS 在计算机视觉领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff09;是一项极具挑战性但又极具应用价值的技术。它允许AI仅通过一张2D图像推断…

从零部署Qwen2.5-7B:vLLM推理加速与Gradio界面集成

从零部署Qwen2.5-7B&#xff1a;vLLM推理加速与Gradio界面集成 1. 引言 随着大语言模型&#xff08;LLM&#xff09;在自然语言处理领域的广泛应用&#xff0c;如何高效部署并快速构建交互式应用成为开发者关注的核心问题。阿里云推出的 Qwen2.5-7B 是当前极具竞争力的开源大…

Rembg抠图API监控:实时性能仪表盘

Rembg抠图API监控&#xff1a;实时性能仪表盘 1. 智能万能抠图 - Rembg 在图像处理与内容创作领域&#xff0c;自动去背景技术已成为提升效率的关键工具。无论是电商商品图精修、社交媒体素材制作&#xff0c;还是AI生成内容&#xff08;AIGC&#xff09;的预处理环节&#x…

MiDaS实战:工业检测深度估计案例

MiDaS实战&#xff1a;工业检测深度估计案例 1. 引言&#xff1a;AI 单目深度估计在工业场景中的价值 随着智能制造和自动化检测的快速发展&#xff0c;传统2D视觉系统在复杂环境下的局限性日益凸显。尤其是在缺陷检测、物料定位、空间避障等任务中&#xff0c;仅依赖颜色和轮…

导师严选9个AI论文写作软件,助本科生轻松搞定毕业论文!

导师严选9个AI论文写作软件&#xff0c;助本科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作不再“难” 随着人工智能技术的不断发展&#xff0c;越来越多的 AI 工具被引入到学术写作领域&#xff0c;尤其是在降低 AIGC 率、保持语义通顺和提升写作效率方面展现出显著…

MiDaS实战教程:无需GPU的高效深度感知方案

MiDaS实战教程&#xff1a;无需GPU的高效深度感知方案 1. 引言&#xff1a;AI 单目深度估计 - MiDaS 在计算机视觉领域&#xff0c;从单张2D图像中恢复3D空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件设备&#xff0c;成本高且部署复杂。近年来&a…

简单理解:什么是双线接口(TWI)

核心定义双线接口​ 是一种串行通信接口协议&#xff0c;它仅使用两条信号线在多个设备&#xff08;通常是一个主设备和多个从设备&#xff09;之间进行数据交换。它最著名的实现是IC。虽然TWI有时被用作IC的同义词&#xff0c;但两者在技术渊源上稍有区别&#xff0c;不过在实…

单目视觉测距系统:基于MiDaS的完整部署教程

单目视觉测距系统&#xff1a;基于MiDaS的完整部署教程 1. 引言 1.1 AI 单目深度估计 —— 让2D图像“看见”3D世界 在自动驾驶、机器人导航、AR/VR和智能安防等领域&#xff0c;深度感知是实现环境理解的核心能力。传统方案依赖双目立体视觉或多线激光雷达&#xff08;LiDA…

MiDaS模型深度解析:从原理到部署的完整教程

MiDaS模型深度解析&#xff1a;从原理到部署的完整教程 1. 引言&#xff1a;AI 单目深度估计的现实意义 在计算机视觉领域&#xff0c;深度估计是实现3D空间感知的核心技术之一。传统方法依赖双目立体视觉或多传感器融合&#xff08;如LiDAR&#xff09;&#xff0c;但这些方…

数据库设计利器:ER图完全指南

ER图详解&#xff1a;数据库设计的蓝图 ER图&#xff08;Entity-Relationship Diagram&#xff0c;实体-关系图&#xff09;是数据库概念设计的核心工具&#xff0c;用于直观描述现实世界中的数据及其相互关系。 &#x1f3af; ER图的核心价值 可视化沟通&#xff1a;让开发人员…

Rembg批量处理效率:不同规模测试对比

Rembg批量处理效率&#xff1a;不同规模测试对比 1. 引言&#xff1a;智能万能抠图 - Rembg 在图像处理领域&#xff0c;背景去除是一项高频且关键的任务&#xff0c;广泛应用于电商展示、广告设计、内容创作等场景。传统手动抠图耗时耗力&#xff0c;而基于深度学习的自动去…

三菱Q01U在12轴伺服控制中的实战应用

三菱PLC Q系列大型程序伺服12轴Q01U RS232通讯CCD 应用 实际使用中程序&#xff0c;详细中文注释 2个模块QD70P8&#xff0c;QD70P4控制12轴 模块QD62外接欧姆龙编码器E6C2-CWZ6C 模块QJ71C24N-R2和基恩士DL-RS1A RS-232通讯测量高度 模块Q64AD连接基恩士CCD激光测试仪IG-1000测…

AI深度估计进阶:MiDaS模型的多任务学习优化

AI深度估计进阶&#xff1a;MiDaS模型的多任务学习优化 1. 引言&#xff1a;从单目图像中“看见”三维世界 1.1 单目深度估计的技术背景 在计算机视觉领域&#xff0c;深度估计是实现3D感知的核心能力之一。传统方法依赖双目立体视觉或多传感器融合&#xff08;如LiDAR&…

阿里开源Qwen3-VL-WEBUI|轻松实现GUI操作与跨模态推理任务

阿里开源Qwen3-VL-WEBUI&#xff5c;轻松实现GUI操作与跨模态推理任务 在多模态大模型快速演进的今天&#xff0c;视觉-语言理解能力已不再局限于“看图说话”。随着应用场景向自动化、代理化和复杂决策方向延伸&#xff0c;用户对AI系统提出了更高要求&#xff1a;不仅要能识…

分类模型效果对比:云端GPU同时跑5个算法,3小时仅花3块钱

分类模型效果对比&#xff1a;云端GPU同时跑5个算法&#xff0c;3小时仅花3块钱 1. 为什么需要云端GPU并行测试分类模型&#xff1f; 作为算法工程师&#xff0c;当你需要为业务场景选择最佳分类模型时&#xff0c;通常会面临三个典型痛点&#xff1a; 本地测试效率低&#…

AI分类竞赛速成:用云端GPU72小时冲榜,花费不到300

AI分类竞赛速成&#xff1a;用云端GPU72小时冲榜&#xff0c;花费不到300 1. 为什么你需要云端GPU 参加AI分类竞赛时&#xff0c;最痛苦的莫过于看着本地电脑吭哧吭哧跑数据&#xff0c;而截止日期却在眼前。想象一下&#xff1a; 你的笔记本跑全量数据需要48小时截止前想尝…

轻量级AI视觉:MiDaS模型部署全解析

轻量级AI视觉&#xff1a;MiDaS模型部署全解析 1. 引言&#xff1a;为何单目深度估计正在成为AI视觉新热点&#xff1f; 在计算机视觉领域&#xff0c;从2D图像中理解3D空间结构一直是核心挑战之一。传统方法依赖双目立体视觉或多传感器融合&#xff08;如LiDAR&#xff09;&…