OpenEdv-开源电子网

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

STM32 PWM 输出禁止为什么还有输出

[复制链接]

37

主题

146

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2014-6-4
在线时间
90 小时
发表于 2021-10-26 10:54:13 | 显示全部楼层 |阅读模式
100金钱
  1. #include "stm32f10x.h"

  2. int main(void)
  3. {
  4.         GPIO_InitTypeDef         GPIO_InitStructure;
  5.         TIM_TimeBaseInitTypeDef  TIM_InitStructure;
  6.         TIM_OCInitTypeDef        TIM_OCInitStructure;
  7.         TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);

  10.         //PA8 :TIM1_CH1的输出比较通道           ->推挽复用模式
  11.         //PB13:TIM1_CH1的输出比较通道的互补通道 ->推挽复用模式
  12.         //PB12:TIM1_CH1的输出比较通道的刹车通道 ->推挽复用模式  
  13.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13;
  14.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//推挽复用
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOB,&GPIO_InitStructure);

  17.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
  18.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  19.        
  20.        
  21.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
  22.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24.         GPIO_Init(GPIOB,&GPIO_InitStructure);

  25.         ///GPIO_ResetBits(GPIOB,GPIO_Pin_12);

  26.         TIM_InitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;
  27.         TIM_InitStructure.TIM_CounterMode    = TIM_CounterMode_Up;
  28.         TIM_InitStructure.TIM_Period    = 100-1;     //这里将频率设为10KHz
  29.         TIM_InitStructure.TIM_Prescaler = 72-1;
  30.         TIM_InitStructure.TIM_RepetitionCounter = 0; //此处没用到
  31.         TIM_TimeBaseInit(TIM1,&TIM_InitStructure);

  32.         TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1;        //PWM1模式
  33.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //互补通道空闲电平极性
  34.         TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;  //比较通道空闲电平极性(这两个根据情况随便配置一下就行)
  35.         TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;   //互补通道电平极性配置
  36.         TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;    //输出通道电平极性配置(高电平有效)
  37.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//输出使能
  38.         TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Disable; //互补输出使能
  39.         TIM_OCInitStructure.TIM_Pulse        = 25; //25%
  40.         TIM_OC1Init(TIM1,&TIM_OCInitStructure);

  41.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

  42.         TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
  43.         TIM_BDTRInitStructure.TIM_Break           = TIM_Break_Enable;
  44.         TIM_BDTRInitStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High;//当PB12检测到高电平的时候输出比较信号就会禁止,状态变为上面配置的空闲电平状态
  45.         TIM_BDTRInitStructure.TIM_DeadTime  = 50;              //这里没有搞清楚怎么算的,这里设为5ns,死区是由MOS管特性产生,可以理解为电平在该跳变的时候没有及时跳变,可能会烧坏元器件,所以要配置死区世间加以延时
  46.         TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;//LOCK的级别参数
  47.         TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
  48.         TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  49.         TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

  50.         TIM_CtrlPWMOutputs(TIM1,DISABLE);
  51.         TIM_Cmd(TIM1,ENABLE);
  52.        
  53.         while(1)
  54.         {
  55.                
  56.         }
  57. }


  58. void TIM1_UP_IRQHandler(void)
  59. {                                    
  60.         if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
  61.         {
  62.                 TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
  63.         }             
  64. }
复制代码

我明明禁止了通道使能,为什么还有波形,这个是不是ST的 bug.
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //互补输出使能
TIM_CtrlPWMOutputs(TIM1,DISABLE);

一路狂奔!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2021-10-26 11:06:26 | 显示全部楼层
你关闭了使能,但是波形你还在啊,关闭使能之前输出占空比为0
我是小白,很白很白的小白!!!
回复

使用道具 举报

37

主题

146

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2014-6-4
在线时间
90 小时
 楼主| 发表于 2021-10-26 11:09:29 | 显示全部楼层
程功之道 发表于 2021-10-26 11:06
你关闭了使能,但是波形你还在啊,关闭使能之前输出占空比为0

那这个关闭使能有啥意义。
一路狂奔!
回复

使用道具 举报

13

主题

645

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2007
金钱
2007
注册时间
2021-4-16
在线时间
511 小时
发表于 2021-10-26 12:28:55 | 显示全部楼层
TIM_SetCompare1();也注释掉
回复

使用道具 举报

37

主题

146

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2014-6-4
在线时间
90 小时
 楼主| 发表于 2021-10-26 13:18:48 | 显示全部楼层
疾如风 发表于 2021-10-26 12:28
TIM_SetCompare1();也注释掉

哪里有这个函数。
一路狂奔!
回复

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4910
金钱
4910
注册时间
2017-7-6
在线时间
720 小时
发表于 2021-10-26 15:18:46 | 显示全部楼层
南帝 发表于 2021-10-26 11:09
那这个关闭使能有啥意义。

TIM_CtrlPWMOutputs(TIM1,DISABLE);我还遇到过MM系列,某个定时器有使能PWM,有些是没有这个使能输出位的,你看看你用的这个STM32
我是小白,很白很白的小白!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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