野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22615|回复: 9

三对6路互补带死区PWM输出

[复制链接]
发表于 2017-8-9 23:52:01 | 显示全部楼层 |阅读模式
本帖最后由 冷库的云 于 2017-8-9 23:57 编辑
  1. void TIM1_PWM_Init(u16 arr,u16 psc)
  2. {        
  3.         GPIO_InitTypeDef          GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef         TIM_OCInitStructure;
  6.         TIM_BDTRInitTypeDef       TIM_BDTRInitStructure;
  7.         
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  9.         
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;                                 //通道1 2 3
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                          //复用推挽输出
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                         //IO口速度为50MHz
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);        
  14.         
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;             //通道1N 2N 3N
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);        
  17.         
  18.         
  19.         TIM_TimeBaseStructure.TIM_Period = arr;
  20.         TIM_TimeBaseStructure.TIM_Prescaler =psc;
  21.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  22.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                                                                                //TIM向上计数模式
  23.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


  24.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                                                                                        //选择定时器模式:TIM脉冲宽度调制模式1
  25.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                                                                        //比较输出使能
  26.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;               //比较互补输出使能
  27.         TIM_OCInitStructure.TIM_Pulse = 0;                                                                                                                                                                                //设置翻转值
  28.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                                                                        //输出极性默认高电平
  29.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;                   //互补输出极性默认高电平        
  30.                
  31.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;                    // 输出通道空闲电平极性配置
  32.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;                // 互补输出通道空闲电平极性配置
  33.         
  34.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                                                                                                                            //配置到通道1
  35.   TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                                  //配置到通道2
  36.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);                                                                                                                                                        //配置到通道3

  37.   TIM_CtrlPWMOutputs(TIM1,ENABLE);                                                                                                                                                                                        //主功能为PWM

  38.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);                                                                                                                 //CH1预装载使能
  39.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);                                                                                                                        //CH2预装载使能
  40.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);                                                                                                                        //CH3预装载使能


  41.   /****************************************************************************
  42.          *死区时间计算方法:
  43.          *@autor 秋雨梧桐
  44.          *@date  2017/8/9
  45.          *TIM1的时钟频率为72MHZ
  46.          *这些位定义了插入互补输出之间的死区持续时间。假设DT表示其持续时间:
  47.    *DTG[7:5]=0xx => DT=DTG[7:0] × Tdtg, Tdtg = TDTS;
  48.    *DTG[7:5]=10x => DT=(64+DTG[5:0]) × Tdtg, Tdtg = 2 × TDTS;
  49.    *DTG[7:5]=110 => DT=(32+DTG[4:0]) × Tdtg, Tdtg = 8 × TDTS;
  50.    *DTG[7:5]=111 => DT=(32+DTG[4:0])× Tdtg, Tdtg = 16 × TDTS;
  51.    *例:若TDTS = 125ns(8MHZ),可能的死区时间为:
  52.    *0到15875ns,若步长时间为125ns;
  53.    *16us到31750ns,若步长时间为250ns;
  54.    *32us到63us,若步长时间为1us;
  55.    *64us到126us,若步长时间为2us;
  56.          *
  57.          *综上可知:因为TIM1时钟为72M,所以TDTS = 1/72M = 13.9ns;又因为DTG[7:5]=000;
  58.          *DTG[7:0] = 0X0A;所以DT(死区时间) = 10(即0X0A) * 13.9ns(即TDTS) = 139us
  59.          ****************************************************************************/
  60.         TIM_BDTRStructInit(&TIM_BDTRInitStructure);                                   //缺省值(一般为0)必须要有,为了保证寄存器的值不是上电随机数
  61.   TIM_BDTRInitStructure.TIM_DeadTime = 0x0A;                                    //死区时间设置
  62.         TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);        
  63.         TIM_CtrlPWMOutputs(TIM1, ENABLE);                                             //主输出使能,开启OC和OCN输出!!
  64.         
  65.         TIM_ARRPreloadConfig(TIM1, ENABLE);                                                                                                                                                                                //使能TIMx在ARR上的重装载寄存器
  66.         TIM_Cmd(TIM1, ENABLE);                                                                                                                                                                                                                                //开启TIM1
  67.                
  68. }

复制代码

死区时间计算

死区时间计算

6路互补PWM波

6路互补PWM波

死区时间验证

死区时间验证

三对6路PWM带互补带死区.zip

311.23 KB, 下载次数: 130

代码

回复

使用道具 举报

发表于 2017-8-10 09:02:53 | 显示全部楼层
很有探究精神,谢谢分享
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-10 09:09:54 | 显示全部楼层
flyleaf 发表于 2017-8-10 09:02
很有探究精神,谢谢分享

谢谢,第一次发帖
回复 支持 反对

使用道具 举报

发表于 2017-8-10 09:41:39 | 显示全部楼层
不错 不错                cool
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-10 09:44:06 | 显示全部楼层
fire 发表于 2017-8-10 09:41
不错 不错                cool

谢谢火哥支持
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-10 09:44:36 | 显示全部楼层
fire 发表于 2017-8-10 09:41
不错 不错                cool

你的粉

回复 支持 反对

使用道具 举报

发表于 2017-8-10 23:23:06 | 显示全部楼层
准备搞三相桥?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-10 23:24:31 | 显示全部楼层

额,帮同学搞的
回复 支持 反对

使用道具 举报

发表于 2023-12-6 21:22:52 | 显示全部楼层
请问这是用什么软件测的PWM波形呀?
回复 支持 反对

使用道具 举报

发表于 2024-6-13 21:26:00 | 显示全部楼层
SSBY 发表于 2023-12-6 21:22
请问这是用什么软件测的PWM波形呀?

单片机的在线运行 仿真 软件带的
keil
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-21 14:32 , Processed in 0.038895 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表