OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2563|回复: 3

STM32F1PWM死区时间不对求助

[复制链接]

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2020-4-24 17:56:22 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 STM129 于 2020-4-24 17:58 编辑

STM32F103PWM想得到250nS的死区时间,但是设置后输出了1.26uS的死区时间
程序是这样:
不知道那里不对
void TIM1_PWM_Init(u32 arr,u32 psc)
{     
   //此部分需手动修改IO口设置
    GPIO_InitTypeDef  GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM1_BDTRInitStruct;
     
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);    //TIM1时钟使能  
     
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  //GPIOA8/A7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA8

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  //GPIOA8/A7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       //
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA8
GPIO_ResetBits(GPIOA, GPIO_Pin_12);//输出低

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;  //GPIOA8/A7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);              //初始化PA8
     
TIM_TimeBaseStructure.TIM_Prescaler = psc;             //Timer clock = sysclock /(TIM_Prescaler+1) = 168M 定时器分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
TIM_TimeBaseStructure.TIM_Period = arr;                        //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;        
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);          //初始化定时器1
  
  
    //初始化TIM1 Channel1 PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;     //选择定时器模式:TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //比较输出使能
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;    //互补输出允许
    TIM_OCInitStructure.TIM_Pulse = (arr+1)/2;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //High为占空比高极性,此时占空比为50%,Low则为反极性,占空比为50%
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;  //互补输出,与以上相反
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
    TIM_OC1Init(TIM1,&TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM1OC1
/*************************/
//通道3
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //比较输出失能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//反向通道失效
TIM_OCInitStructure.TIM_Pulse = 50; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:低
TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH3预装载使能
/*************************/
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器(CR自动装载默认是打开的)
    TIM_ARRPreloadConfig(TIM1,ENABLE);   //ARPE使能(ARR自动装载默认是打开的,可以不设置)
    TIM_Cmd(TIM1,ENABLE);
    TIM_CtrlPWMOutputs(TIM1,ENABLE);    //使能TIM1的PWM输出  
  
  //死区时间控制
  TIM1_BDTRInitStruct.TIM_OSSRState = TIM_OSSRState_Disable;
  TIM1_BDTRInitStruct.TIM_OSSIState = TIM_OSSIState_Disable;
  TIM1_BDTRInitStruct.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  TIM1_BDTRInitStruct.TIM_DeadTime = 18;//250nS
  TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStruct);
                              
}

捕获.JPG
捕获2.JPG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-25 01:19:08 | 显示全部楼层
降低死区 时间设置,结果会跟着变化么?
回复

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
 楼主| 发表于 2020-4-25 12:54:35 | 显示全部楼层
正点原子 发表于 2020-4-25 01:19
降低死区 时间设置,结果会跟着变化么?

第一张图片是  TIM1_BDTRInitStruct.TIM_DeadTime = 18;   得 1.260uS
第二张图片是  TIM1_BDTRInitStruct.TIM_DeadTime = 1;     得 1.020uS
变化不大
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-26 00:59:55 | 显示全部楼层
STM129 发表于 2020-4-25 12:54
第一张图片是  TIM1_BDTRInitStruct.TIM_DeadTime = 18;   得 1.260uS
第二张图片是  TIM1_BDTRInitStru ...

回头我试试, 我也整了个死区控制代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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