你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103高级定时器互补PWM使用问题

[复制链接]
armstone 提问时间:2018-11-12 21:31 /
悬赏1ST金币未解决
在使用STM32F103的高级定时器TIM8时,遇到一个问题:初始化的互补PWM波形输出时,同时初始化3对互补通道,CH1CH1NCH2CH2NCH3CH3N,使用时,需要将CH1=1CH1N=0CH2=0CH2N=1,到这里都可以实现,但是下面的CH3=1CH3N=1,不会实现,同时为0倒是会,请问怎么去配置呢?
初始化代码如下:
voidTIM8_Configuration(void) //72M
{
       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
      TIM_OCInitTypeDefTIM_OCInitStructure;
       TIM_BDTRInitTypeDefTIM_BDTRInitStructure;  

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       TIM_TimeBaseStructure.TIM_Period=99;
       TIM_TimeBaseStructure.TIM_Prescaler=71;  
       TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;
       TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterAligned1;
       TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);

  //PWM互补信号输出PC6PA7
       TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM输出模式   
       TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
       TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//互补输出使能
       TIM_OCInitStructure.TIM_Pulse=0;//初始占空比
       TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
       TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
       TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;//死区后输出状态
       TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
       TIM_OC1Init(TIM8,&TIM_OCInitStructure);
       TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable);//PWM输出口PB13
       TIM_OC1FastConfig(TIM8,TIM_OCFast_Enable);

       //PWM互补信号输出PC7PB0
       TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
       TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
       TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
       TIM_OCInitStructure.TIM_Pulse=0;
       TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
       TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
       TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;//死区后输出状态
       TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
       TIM_OC2Init(TIM8,&TIM_OCInitStructure);
       TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);//PWM输出口PB14
       TIM_OC2FastConfig(TIM8,TIM_OCFast_Enable);

       //PWM互补信号输出PC8PB1
       TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
       TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
       TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
       TIM_OCInitStructure.TIM_Pulse=0;
       TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
       TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
       TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;//死区后输出状态
       TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
       TIM_OC3Init(TIM8,&TIM_OCInitStructure);
       TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);//PWM输出口PB14
       TIM_OC3FastConfig(TIM8,TIM_OCFast_Enable);

  //死区设置
  TIM_BDTRInitStructure.TIM_OSSRState =TIM_OSSRState_Disable;//使能
  TIM_BDTRInitStructure.TIM_OSSIState =TIM_OSSIState_Disable;//使能
  TIM_BDTRInitStructure.TIM_LOCKLevel =TIM_LOCKLevel_OFF;//不锁任何位
  TIM_BDTRInitStructure.TIM_DeadTime =0xCF;//死区设置为5us
  TIM_BDTRInitStructure.TIM_Break =TIM_Break_Disable;//使能TIM刹车输入
  TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;//TIM刹车输入管脚为高
  TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;//自动输出功能使能
TIM_BDTRConfig(TIM8,&TIM_BDTRInitStructure);

       //TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;
    TIM_ARRPreloadConfig(TIM8,ENABLE);
       //TIM_CCPreloadControl(TIM8,ENABLE);
       TIM_CtrlPWMOutputs(TIM8,ENABLE);
       TIM_Cmd(TIM8,ENABLE);
}
主函数如下:
intmain(void)
{

       RCC_Configuration();//时钟配置
       TIM8_Configuration();    //TIM8初始化
  while(1)
        {
               TIM8->CCR1=60;
               //TIM_CCxCmd(TIM8,TIM_Channel_1,TIM_CCx_Disable);
               //TIM_CCxNCmd(TIM8,TIM_Channel_1,TIM_CCxN_Disable);

               //TIM_SetCompare2(TIM8,60);
               //TIM8->CCR2=60;
               //TIM8->CCR3=60;
             //TIM_CCxCmd(TIM8,TIM_Channel_2,TIM_CCx_Enable);
           TIM_CCxNCmd(TIM8,TIM_Channel_2,TIM_CCxN_Enable);
              TIM_ForcedOC2Config(TIM8,TIM_ForcedAction_InActive);
   }
}
此时使用的是通道CH1CH2两组互补波形,(示波器是4通道),波形如下图所示:
CH1对应TIM8-CH1CH2对应TIM8-CH1NCH3对应TIM8-CH2CH4对应TIM8-CH2N
从图上可以看到,TIM8-CH2TIM8-CH2N没有同时指高,请问怎么设置?

IMG_20181112_211203.jpg
收藏 评论20 发布时间:2018-11-12 21:31

举报

20个回答
wenyangzeng 回答时间:2018-11-13 09:41:17
没看到楼主初始化GPIO的代码,是否那部分代码有欠缺设置,比如重映像未配置什么的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

armstone 回答时间:2018-11-13 09:42:49
wenyangzeng 发表于 2018-11-13 09:41
没看到楼主初始化GPIO的代码,是否那部分代码有欠缺设置,比如重映像未配置什么的。 ...

这方面刚刚在考虑了,请问要配置什么吗,因为我之前使用PWM模式时候,从来没有在配置GPIO模式,
armstone 回答时间:2018-11-13 09:43:43
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOA
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
这是对CH1和CH1N两个通道的GPIO初始化设置,后来修改的
wenyangzeng 回答时间:2018-11-13 09:59:22
本帖最后由 wenyangzeng 于 2018-11-13 10:01 编辑
armstone 发表于 2018-11-13 09:43
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //复用推挽 ...

PA6是TIM8_BKIN.
看下图,TIM8_CH4N貌似就没有引脚:
楼主应该优先使用TIM1的8个通道才是

无标题.png

xmshao 回答时间:2018-11-13 10:43:22
本帖最后由 xmshao 于 2018-11-13 10:44 编辑

对于互补通道,注意没法同时输出有效信号的。
你注意你的极性选择与输出配置。

关于有效电平、无效电平 和高、低电平好好琢磨下。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

armstone 回答时间:2018-11-13 10:59:16
wenyangzeng 发表于 2018-11-13 09:59
PA6是TIM8_BKIN.
看下图,TIM8_CH4N貌似就没有引脚:
楼主应该优先使用TIM1的8个通道才是

不是啊,哥们,我用的是TIM8-CH1,引脚是PC6啊,TIM1定时器使用了,那边也用互补了;TIM8不是也有6路通道吗
armstone 回答时间:2018-11-13 11:00:41
xmshao 发表于 2018-11-13 10:43
对于互补通道,注意没法同时输出有效信号的。
你注意你的极性选择与输出配置。

是这样的,同时输出有效电平,在初始化可以设置好,但是程序运行,就不会了
tanic 回答时间:2018-11-13 13:21:02
查找TIM_OCMode_PWM1   的定义,那里有 active   noactive   两个模式,就可以强制IO输出高低电平

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

armstone 回答时间:2018-11-13 14:12:29
tanic 发表于 2018-11-13 13:21
查找TIM_OCMode_PWM1   的定义,那里有 active   noactive   两个模式,就可以强制IO输出高低电平 ...

好的,我先试试,在来请教
armstone 回答时间:2018-11-13 14:13:50
tanic 发表于 2018-11-13 13:21
查找TIM_OCMode_PWM1   的定义,那里有 active   noactive   两个模式,就可以强制IO输出高低电平 ...

CH1和互补通道CH1N两个都能够强制输出高电平吗
xmshao 回答时间:2018-11-13 14:25:40
本帖最后由 xmshao 于 2018-11-13 16:17 编辑
armstone 发表于 2018-11-13 11:00
是这样的,同时输出有效电平,在初始化可以设置好,但是程序运行,就不会了 ...

程序运行后电平由输出比较机构决定。
你如果希望这样的话,OCX与OCXN就不要使用相同的极性选择了。
你可以OCx,高有效,OCxN极性选择为低有效。这样就可以出来你要的信号了。

armstone 回答时间:2018-11-13 14:28:53
tanic 发表于 2018-11-13 13:21
查找TIM_OCMode_PWM1   的定义,那里有 active   noactive   两个模式,就可以强制IO输出高低电平 ...

老哥,你说的是初始化后,输出高电平吗?我是想初始化,和我现在一样,这样后面给占空比是互补的;但是如果一开始初始化都为高电平,后面输出就同步了,两个都为高或者都为低,不是互补的了
埃斯提爱慕 回答时间:2018-11-13 14:46:05
提示: 作者被禁止或删除 内容自动屏蔽
armstone 回答时间:2018-11-13 14:57:19
dsjsjf 发表于 2018-11-13 14:46
用比较输出模式试试

啥意思啊,没理解你的话
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版