STM32F103单片机定时器自带互补PWM波形输出功能,利用定时器输出比较模式,不仅可以输出互补的 PWM波,还可以设置输出方波的起始相位和死区时间。

下面就总结一下如何实现PWM互补输出。


void TIM1_PWM_DeadtimeInit( u16 arr, u16 psc, u16 ccr1, u16 ccr2, u16 deadtime )
{GPIO_InitTypeDef GPIO_InitSturcture;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );//TIM1 互补PWM CH1->PA8  CH2->PA9  CH1N->PB13  CH2N->PB14GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOA, &GPIO_InitSturcture );GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOB, &GPIO_InitSturcture );//定时器设置TIM_TimeBaseInitStructure.TIM_Period = arr;TIM_TimeBaseInitStructure.TIM_Prescaler = psc;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );//通道1 捕获比较模式设置TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;             //翻转,当 TIMx_CCR1=TIMx_CNT时,翻转OC1REF的电平TIM_OCInitStructure.TIM_Pulse = ccr1;                         //100TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //CCER的CC1P,输入/捕获输出极性TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //CER的CC1N,输入/捕获输出使能TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;    //OIS1位TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  //CR2的OIS1N位,当MOE位0时,输出空闲状态位OIS1N.TIM_OC1Init( TIM1, &TIM_OCInitStructure );//通道2 设置TIM_OCInitStructure.TIM_Pulse = ccr2;                            //316TIM_OC2Init( TIM1, &TIM_OCInitStructure );//刹车和死区设置TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;    //OSSR:运行模式下“关闭状态”选择TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;    //OSSI:空闲模式下“关闭状态”选择TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;             //锁定设 置,级别为1TIM_BDTRInitStructure.TIM_DeadTime = deadtime;                  //死区延时时间TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;           //禁止刹车输 入TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;      //刹车输入极性TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //自动输出使能TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );TIM_CtrlPWMOutputs( TIM1, ENABLE );TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable );TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable );TIM_ARRPreloadConfig( TIM1, ENABLE );TIM_Cmd( TIM1, ENABLE );
}

首先初始化IO口,这里使用的是定时器1的通道1和通道2。

PA8为定时器1通道1输出口,PB13为定时器1通道1互补输出口。

PA9为定时器1通道2输出口, PB14为定时器1通道2互补输出口。

下来初始化定时器,参数arr设置输出PWM波频率,psc设置定时器时钟分频系数。定时器初始化之后,设置定时器工作模式为输出比较模式,其中参数 ccr1 设置通道1的输出方波起始相位,参数cc2设置通道2输出方波起始相位。参数 deadtime 设置互补PWM波形的死区时间。初始化结束后启动定时器。

关于输出比较模式的详细说明参考STM32输出比较模式和PWM模式 比较这篇文章。

下面看主函数设置

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm_ch_chn.h"
// LED0  PA8  LED1 PD2
int main(void)
{delay_init();       //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LED_Init();LED0 = 1;LED1 = 1;delay_ms(500);LED0 = 0;LED1 = 0;// Tout=(719+1)*(0+1)/72M=10us   72M/720=0.1M=100K  TIM1_PWM_DeadtimeInit(719,0,0,0,72);//50KHzwhile(1){}
}

主函数中设置自动装载值为 720,分频系数为0,那么输出方波频率为 72MHz / 720 = 0.1MHz,也就是输出波形频率为100K,由于此处用的是定时器的输出比较模式,所以输出频率为计算值的一半,所以实际输出方波频率为50KHz。ccr1值设置为0,也就是定时器1通道1的输出波形起始相位为0,ccr2的值为0,所以起始相位也为0。死区时间设置为72,为周期数的1/10,也就是2us。

下面看一下输出波形

黄色为 TIM1_CH1波形,绿色为TIM1_CH1N波形,这两个波形是通道1互补波形。

蓝色为 TIM1_CH2波形,粉色为TIM1_CH2N波形,这两个波形是通道2互补波形。

黄色和蓝色波形起始相位相同。

原波形和互补波形死区时间为1us,刚才计算的死区时间是2us,这里为什么是1us?因为死区时间是上升沿时间差+下降沿时间差,是两个对称的区间。这里只测了一个区间,所以为总时间的一半。

下来同时改变ccr1和ccr2的初始值,看看输出波形相位有没有发生变化。

 TIM1_PWM_DeadtimeInit(719,0,72,144,72);//50KHz

输出波形为

蓝色波形下降沿比黄色波形下降沿滞后了一点,说明起始相位已经发生了改变。

放大波形后可以看到,下降沿滞后的时间为1us,和死区时间相同。

STM32F103输出互补PWM波相关推荐

  1. STM32F103输出多路死区互补PWM波

    TIM1,TIM8可以产生死区互补PWM波,学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考.Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定 ...

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

    普通定时器输出互补PWM带死区 一般来说三相半桥电路需要互补PWM驱动,而且互补PWM需要带死区,死区的大小跟管子的性能参数有关.公司为了省成本,在云台上把电机驱动芯片替换成三相半桥.用6个MOS驱动 ...

  3. NRF52832输出互补PWM

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

  4. stm32关于带死区时间的互补PWM输出

    1.互补PWM输出简介 在使用stm32输出PWM波形时,笔者所用的stm32f103zet6中的高级定时器TIM1和TIM8可以输出互补的PWM波形,使用互补的PWM波常见与一些半桥电路和全桥电路控 ...

  5. c语言定时器1khz占空比,STM32高级定时器TIM1产生两路互补的PWM波(带死区)

    测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...

  6. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  7. TMS28027输出PWM波例程解析

    PWM波模块由Time-Base(时基).Counter-Compare(计数器比较).Action-Qualifier(波形发生器).Dead-Band(死区设置).Trip-Zone(错误处理). ...

  8. STM32F103输出PWM

    目录 一.PWM 1.pwm简介 2.STM32F1 PWM介绍 3.PWM输出配置步骤 二.输出PWM波形 1.打开源代码 2.修改参数设置 4.代码运行 5.示波器显示 一.PWM 1.pwm简介 ...

  9. STM32F7同一定时器多路输出PWM波通道之间相互影响问题

    --------------------------2020/8/12更新-------------------------------- 这次用Cube直接生成PWM控制代码,然后再RT-Threa ...

最新文章

  1. F2etest+UIRecorder(录制脚本)【2】
  2. AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常
  3. idea 2019.2.4 maven默认配置
  4. DTCC 2020 | 阿里云张鑫:阿里云云原生异地多活解决方案
  5. linux下父子进程共享socket,多进程共享socket(Linux,Win32)
  6. 2017大数据全景图
  7. 机器学习中防止过拟合方法
  8. __ATTRIBUTE__ 你知多少?
  9. mysql数据库 day02
  10. 世界摩天大楼2009年排名
  11. Python创建多线程(join线程同步)
  12. 国密算法-商密认证-硬件加密-同方TF32A09-32位高速加密芯片
  13. JSON.parse() 和 JSON.stringify()使用
  14. 思科CCNA考试流程-ielab
  15. N个数选出M个最小或最大值算法
  16. 微信小程序创建节点选择器获取宽高wx.createSelectorQuery
  17. 实例讲解spark在京东智能供应链预测系统的应用
  18. 天魔 The Omen
  19. 如何在Github中添加图片
  20. node-js上手安装。

热门文章

  1. 使用RIP协议处理不连续的子网和VLSM(一)
  2. Share Favorites
  3. Linux操作系统中的文件管理技巧
  4. [Remoting]dotNet Framework升级后Remoting信道使用的安全问题
  5. wampserver集成环境和安装
  6. 动态规划经典题之石子合并
  7. Thrift框架使用C++的一个demo
  8. 不依赖浏览器控制台的JavaScript断点调试方法
  9. ASP.NET2.0中Calendar的使用(添加自己的日期备注)
  10. springmvc从request中获取body的数据的方法