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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版