普通定时器输出互补PWM带死区

一般来说三相半桥电路需要互补PWM驱动,而且互补PWM需要带死区,死区的大小跟管子的性能参数有关。公司为了省成本,在云台上把电机驱动芯片替换成三相半桥。用6个MOS驱动无刷电机。这下就需要用到互补PWM了。
然后选型的单片机只有一路高级定时器tim1,另外一个电机的PWM驱动分别是tim3,tim4.不同的定时器怎么实现互补PWM而且带死区呢。
1、定时器主从功能
2、定时器中心对齐模式
3、tim3使用PWM1模式,tim4使用PWM2模式
4、输出PWM时占空比预留死区

在我的项目中互补PWM都已经实现,死区也已经实现,但是发现板子驱动电流还是很大,达不到要求,在经历了几天各种怀疑硬件问题的过程当中也寻找了很多解决办法。PWM配置问题等。。。
后来发现,波形的高电平有重叠。再次记住高电平不能有重叠的现象,要不就会出现短路导致电流过大。
具体配置代码如下:

tim1为主定时器
void bsp_InitTMR1_PWM1(uint16_t arr,uint16_t psc)
{GPIO_InitType GPIO_InitStructure;TMR_TimerBaseInitType TMR_TMReBaseStructure;TMR_OCInitType TMR_OCInitStructure;NVIC_InitType NVIC_InitStructure;TMR_BRKDTInitType TIM_BDTRInitStruct;/* 使能GPIO时钟 */RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);/* 使能TMR1时钟 */RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_TMR1, ENABLE);/* 配置GPIO */GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8 | GPIO_Pins_9 | GPIO_Pins_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 复用模式 */GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pins = GPIO_Pins_13 | GPIO_Pins_14 | GPIO_Pins_15; //TIM1_CH1N,TIM1_CH2NGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/* 配置TMR1 */TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);TMR_TMReBaseStructure.TMR_Period = arr;              /* PWM周期 */TMR_TMReBaseStructure.TMR_DIV = psc;                   /* 120分频,即1MHz */TMR_TMReBaseStructure.TMR_ClockDivision = 0;               /* 时钟除频 */TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up; /* 向上计数 */TMR_TimeBaseInit(TMR1, &TMR_TMReBaseStructure);/* Set the default configuration */TIM_BDTRInitStruct.TMR_OSIMRState = TMR_OSIMRState_Enable;//运行模式下关闭状态选择TIM_BDTRInitStruct.TMR_OSIMIState = TMR_OSIMIState_Enable;//空闲模式下关闭状态选择TIM_BDTRInitStruct.TMR_LOCKgrade = TMR_LOCKgrade_OFF;//软件错误锁定配置:锁定关闭无保护TIM_BDTRInitStruct.TMR_DeadTime = 0x40;//DTG[7:0]死区发生器配置:(死区时间DT)  ,注意死区时间要设成100ns左右,否则过大会导致MOS栅极PWM波形异常,太小导致上下臂短路//TDTS = 125nS(8MHz)//DTG[7: 5] = 0xx => DT = DTG[7: 0] * Tdtg, Tdtg = TDTS;//DTG[7: 5] = 10x => DT =(64+DTG[5: 0]) * Tdtg, Tdtg = 2 * TDTS;//DTG[7: 5] = 110 => DT =(32+DTG[4: 0]) * Tdtg, Tdtg = 8 * TDTS; //DTG[7: 5] = 111=> DT =(32 + DTG[4: 0]) *  Tdtg, Tdtg = 16 * TDTS;TIM_BDTRInitStruct.TMR_Break = TMR_Break_Disable;  //刹车配置:使能刹车TIM_BDTRInitStruct.TMR_BreakPolarity = TMR_BreakPolarity_High;//刹车输入极性选择:高电平有效TIM_BDTRInitStruct.TMR_AutomaticOutput = TMR_AutomaticOutput_Enable;//自动输出使能配置:MOE只能软件置1TMR_BRKDTConfig(TMR1, &TIM_BDTRInitStruct); //配置互补输出死区时间/* 配置PWM从TMR1_CH1输出 */TMR_OCStructInit(&TMR_OCInitStructure);TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;                           /* PWM模式 */TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;       /* 使能输出 */TMR_OCInitStructure.TMR_OutputNState = TMR_OutputNState_Enable;TMR_OCInitStructure.TMR_Pulse = 1000; /* PWM占空比 */TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;                   /* 高电平有效 */TMR_OCInitStructure.TMR_OCNPolarity = TMR_OCNPolarity_High;TMR_OCInitStructure.TMR_OCIdleState = TMR_OCIdleState_Reset;TMR_OCInitStructure.TMR_OCNIdleState = TMR_OCNIdleState_Reset;TMR_OC1Init(TMR1, &TMR_OCInitStructure);TMR_OC2Init(TMR1, &TMR_OCInitStructure);TMR_OC3Init(TMR1, &TMR_OCInitStructure);/* 使能定时器TIM1在CCM上的周期值 */TMR_OC1PreloadConfig(TMR1, TMR_OCPreload_Enable);TMR_OC2PreloadConfig(TMR1, TMR_OCPreload_Enable);TMR_OC3PreloadConfig(TMR1, TMR_OCPreload_Enable);/* 使能TIM3在AR上的预装载寄存器 */TMR_ARPreloadConfig(TMR1, ENABLE);/* 使能TMR1 */TMR_Cmd(TMR1, ENABLE);TMR_CtrlPWMOutputs(TMR1, ENABLE);TMR_INTConfig(TMR1,TMR_INT_CC1,ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TMR1_CC_IRQn;        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);TMR_SelectOutputTrigger(TMR1, TMR_TRGOSource_OC1);TMR_SelectMasterSlaveMode(TMR1, TMR_MasterSlaveMode_Enable);  //主从模式
}
volatile uint32_t TMR1_Count = 0;
void TMR1_CC_IRQHandler(void)  //24k  42us
{if (TMR_GetINTStatus(TMR1, TMR_INT_CC1) != RESET)     // TIM_IT_CC1{TMR_ClearITPendingBit(TMR1, TMR_INT_CC1); // 清除中断标志位 TMR1_Count ++;//       all_foc_update();}
}
tim3为从定时器
void bsp_InitTMR3_PWM(void)
{GPIO_InitType GPIO_InitStructure;TMR_TimerBaseInitType TMR_TMReBaseStructure;TMR_OCInitType TMR_OCInitStructure;NVIC_InitType NVIC_InitStructure;/* 使能GPIO时钟 */RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);/* 使能TMR1时钟 */RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TMR3, ENABLE);/* 配置GPIO */GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* 复用模式 */GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pins = GPIO_Pins_0 | GPIO_Pins_1; //TIM1_CH1N,TIM1_CH2NGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/* 配置TMR1 */TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);TMR_TMReBaseStructure.TMR_Period = CYCLE - 1;              /* PWM周期 */TMR_TMReBaseStructure.TMR_DIV = 1;                   /* 120分频,即1MHz */TMR_TMReBaseStructure.TMR_ClockDivision = 0;               /* 时钟除频 */TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_CenterAligned1; /* 向上计数 */TMR_TMReBaseStructure.TMR_RepetitionCounter = 0x0000;TMR_TimeBaseInit(TMR3, &TMR_TMReBaseStructure);/* 配置PWM从TMR1_CH1输出 */TMR_OCStructInit(&TMR_OCInitStructure);TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;                           /* PWM模式 */TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;      /* 使能输出 */TMR_OCInitStructure.TMR_OutputNState = TMR_OutputNState_Disable;TMR_OCInitStructure.TMR_Pulse = 1000; /* PWM占空比 */TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;                   /* 高电平有效 */
//      TMR_OCInitStructure.TMR_OCNPolarity = TMR_OCNPolarity_High;TMR_OCInitStructure.TMR_OCIdleState = TMR_OCIdleState_Reset;TMR_OC1Init(TMR3, &TMR_OCInitStructure);TMR_OC3Init(TMR3, &TMR_OCInitStructure);TMR_OC4Init(TMR3, &TMR_OCInitStructure);TMR_SelectMasterSlaveMode(TMR3, TMR_MasterSlaveMode_Enable);TMR_SelectInputTrigger(TMR3, TMR_TRGSEL_ITR0);TMR_SelectSlaveMode(TMR3, TMR_SlaveMode_Trigger);/* 使能定时器TIM1在CCM上的周期值 */TMR_OC1PreloadConfig(TMR3, TMR_OCPreload_Enable);TMR_OC3PreloadConfig(TMR3, TMR_OCPreload_Enable);TMR_OC4PreloadConfig(TMR3, TMR_OCPreload_Enable);/* 使能TIM3在AR上的预装载寄存器 */TMR_ARPreloadConfig(TMR3, ENABLE);/* 使能TMR1 */TMR_Cmd(TMR1, ENABLE);TMR_CtrlPWMOutputs(TMR1, ENABLE);
}
tim4为从定时器
void bsp_InitTMR4_PWM(void)
{GPIO_InitType GPIO_InitStructure;TMR_TimerBaseInitType TMR_TMReBaseStructure;NVIC_InitType NVIC_InitStructure;TMR_OCInitType TMR_OCInitStructure;/* 使能GPIO时钟 */RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);/* 使能TMR1时钟 */RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TMR4, ENABLE);/* 配置GPIO */GPIO_InitStructure.GPIO_Pins = GPIO_Pins_6 | GPIO_Pins_7 | GPIO_Pins_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/* 配置TMR4 */TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);TMR_TMReBaseStructure.TMR_Period = CYCLE - 1;              /* PWM周期 */TMR_TMReBaseStructure.TMR_DIV = 1;                   /* 120分频,即1MHz */TMR_TMReBaseStructure.TMR_ClockDivision = 0;               /* 时钟除频 */TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_CenterAligned1; /* 向上计数 */TMR_TMReBaseStructure.TMR_RepetitionCounter = 0x0000;TMR_TimeBaseInit(TMR4, &TMR_TMReBaseStructure);TMR_SelectMasterSlaveMode(TMR4, TMR_MasterSlaveMode_Enable);TMR_SelectInputTrigger(TMR4, TMR_TRGSEL_ITR0);TMR_SelectSlaveMode(TMR4, TMR_SlaveMode_Trigger);/* 配置PWM从TMR1_CH1输出 */TMR_OCStructInit(&TMR_OCInitStructure);TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;                           /* PWM模式 */TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;      /* 使能输出 */TMR_OCInitStructure.TMR_OutputNState = TMR_OutputNState_Disable;TMR_OCInitStructure.TMR_Pulse = 1050; /* PWM占空比 */TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_Low;                   /* 高电平有效 */
//      TMR_OCInitStructure.TMR_OCNPolarity = TMR_OCNPolarity_High;TMR_OCInitStructure.TMR_OCIdleState = TMR_OCIdleState_Reset;TMR_OC1Init(TMR4, &TMR_OCInitStructure);TMR_OC2Init(TMR4, &TMR_OCInitStructure);TMR_OC3Init(TMR4, &TMR_OCInitStructure);/* 使能定时器TIM1在CCM上的周期值 */TMR_OC1PreloadConfig(TMR4, TMR_OCPreload_Enable);TMR_OC2PreloadConfig(TMR4, TMR_OCPreload_Enable);TMR_OC3PreloadConfig(TMR4, TMR_OCPreload_Enable);/* 使能TIM3在AR上的预装载寄存器 */TMR_ARPreloadConfig(TMR4, ENABLE);/* 使能TMR1 */TMR_Cmd(TMR1, ENABLE);TMR_CtrlPWMOutputs(TMR1, ENABLE);
}

设置占空比是预留tim3 tim4占空比不一样,即可实现死区

TMR_SetCompare1(TMR3, (uint32_t)w_time_ph_a);TMR_SetCompare1(TMR4, (uint32_t)(w_time_ph_a + 20));TMR_SetCompare3(TMR3, (uint32_t)w_time_ph_b);TMR_SetCompare2(TMR4, (uint32_t)(w_time_ph_b + 20));TMR_SetCompare4(TMR3, (uint32_t)w_time_ph_c);TMR_SetCompare3(TMR4, (uint32_t)(w_time_ph_c + 20));

普通定时器输出互补PWM带死区相关推荐

  1. NRF52832输出互补PWM

    特别说明:本文章需要使用过此pwm模块才会看明白,小白还是先去看看NRF52832芯片的pwm模块,如何再来看如何输出互补pwm. 初步使用NRF52832芯片的pwm模块,因为模块不能直接输出互补p ...

  2. 定时器输出的PWM频率范围及占空比精度

    我想要TIM定时器输出的PWM波形:0.1%精度占空比, 频率范围:200Hz - 10KHz.请问能实现吗? Ⅰ 写在前面 如果有朋友下载了上一篇文章我提供的例程,在"bsp_timer. ...

  3. STM32F103输出互补PWM波

    STM32F103单片机定时器自带互补PWM波形输出功能,利用定时器输出比较模式,不仅可以输出互补的 PWM波,还可以设置输出方波的起始相位和死区时间. 下面就总结一下如何实现PWM互补输出. voi ...

  4. GD32F303高级定时器输出互补PWM-开发笔记

    GD32F303高级定时器timer0输出3组互补PWM 主要特性 ◼ 总通道数:4: ◼ 计数器宽度:16位: ◼ 时钟源可选:内部时钟,内部触发,外部输入,外部触发: ◼ 多种计数模式:向上计数, ...

  5. 【WB32库开发】第9章 TIM1高级定时器——输出多路PWM

    PWM(Pulse Width Modulation)意为脉冲宽度调制,简称脉宽调制 .在工控行业,PWM信号可以用来调节电机转速.调节变频器以及BLDC电机驱动等:在LED照明行业,可以通过PWM来 ...

  6. stm32定时器输出pwmIO口模拟pwm——呼吸灯

    文章目录 前言 一.pwm(脉冲宽度调制) 1.基本原理 2.PWM的优点 3.PWM波的控制方法 二.定时器的相关介绍 1.stm32定时器 2.通用定时器计数模式 3.定时器的基本工作原理 三.定 ...

  7. 第十八章 AT32F403A基于V2库 定时器输出移相pwm

    目录 概述 硬件 TMR互联同步 软件 初始化 初始化代码 测试 概述 本文主要是使用AT32F403A开发板,基于V2库使用tmr的同步功能来实现定时器输出移相pwm的功能. 串口工具使用的Atli ...

  8. 定时器输出PWM控制电机(程序)

    电机控制程序的三方面要点: 一.定时器的输出通道设置 二.电机频率的设定 三.占空比输入函数的设计 对于电机来说,转速与转向是最重要的表现.这里的程序是针对四个直流无刷电机来编写的. 控制四个电机,是 ...

  9. STM32 TIM PWM中阶操作:互补PWM输出

    STM32 TIM PWM中阶操作详解:互补PWM输出 STM32 TIM可以输出管脚PWM信号适合多种场景使用,功能包括单线/非互补PWM输出,双线/互补PWM输出,以及死区时间和刹车控制等. 实际 ...

最新文章

  1. 家长会:我的发言稿,女儿的信
  2. S5PV210开发 -- 开发板配置
  3. Redis操作key相关API
  4. 不使用比较运算符如何比较两个数的大小
  5. 000 初步使用Kotlin开发Android应用
  6. 前端操作复制粘贴板(clicpboardData )
  7. “SD卡已损坏。可能需要重新格式化卡” 解决办法!
  8. 36氪独家|「秦汉胡同」完成1亿元A轮融资,将发力线上内容产品和女性生活学习服务社群...
  9. 最简单的免费安卓手机投屏电脑游戏直播工具推荐:电脑控制手机玩游戏了解一下
  10. Process-wide API spying - an ultimate hack 摘要翻译(二)
  11. 应用|5G时代10大应用场景!
  12. 注册非公共邮箱,学校邮箱
  13. STM32 SPI方式读写SD卡
  14. 【ABviewer从零开始教学查看器篇①】3D查看器和3D剖面板
  15. Python Tkinter Radiobutton控件
  16. CSDN日报20170410 ——《未经检视的人生不值得活》
  17. 2019年电赛D题《简易电路特性测试仪》全过程
  18. mysql函数 游标_存储过程/游标/mysql 函数
  19. Race_Condition实验
  20. 计算机音乐作曲排名2019,2019全球歌曲排行榜_数据 2019全球古典音乐排行榜

热门文章

  1. linux系统下questasim 10.7安装教程
  2. 俞敏洪:度过有意义的生命
  3. 实时天气预报API——易客云API
  4. python csv转tsv
  5. 助力低碳出行 | 基于ACM32 MCU的电动滑板车方案
  6. html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...
  7. U盘修复“系统找不到指定文件”问题记录
  8. 保存Unity中的Log日志
  9. windows 8 修改窗口颜色为淡绿色
  10. [前端三剑客之CSS]display:none opacity:0 visibility:hidden三角恋的爱恨情仇