OpenEdv-开源电子网

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

STM32 用TIM1 产生互补PWM的问题?

[复制链接]

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
发表于 2018-8-28 15:12:20 | 显示全部楼层 |阅读模式
5金钱
static void BLDC_TIMx_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
  TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

  /* 定时器基本参数时钟 */                 
  TIM_TimeBaseStructure.TIM_Period = BLDC_TIM_PERIOD;
  /* 设置预分频:不预分频,即为72MHz */
  TIM_TimeBaseStructure.TIM_Prescaler = BLDC_TIM_PRESCALER;
  /* 设置时钟分频系数:不分频(这里用不到) */
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
  /* 向上计数模式 */
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  /* 重复计算器 */
  TIM_TimeBaseStructure.TIM_RepetitionCounter = BLDC_TIM_REPETITIONCOUNTER;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* 定时器输出通道1模式配置 */
  /* 模式配置:PWM模式1 */
  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;
  /* 当定时器计数值小于CCR1_Val时为高电平 */
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  /* 初始化定时器通道1输出PWM */
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  /* 定时器输出通道2模式配置 */
  /* 设置通道2的电平跳变值,输出另外一个占空比的PWM */
  TIM_OCInitStructure.TIM_Pulse = 0;
  /* 初始化定时器通道2输出PWM */
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  /* 定时器输出通道3模式配置 */
  /* 设置通道3的电平跳变值,输出另外一个占空比的PWM */
  TIM_OCInitStructure.TIM_Pulse = 0;
  /* 初始化定时器通道3输出PWM */
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  TIM_BDTRInitStructure.TIM_DeadTime = 5;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

  TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
  TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
  TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);

  /* 使能定时器重载寄存器ARR */
  TIM_ARRPreloadConfig(TIM1, ENABLE);

  /* 使能定时器 */
  TIM_Cmd(TIM1, ENABLE);

  /* TIM主输出使能 */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Disable);
  TIM_CCxNCmd(TIM1,TIM_Channel_1,TIM_CCxN_Disable);
  TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Disable);
  TIM_CCxNCmd(TIM1,TIM_Channel_2,TIM_CCxN_Disable);
  TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Disable);
  TIM_CCxNCmd(TIM1,TIM_Channel_3,TIM_CCxN_Disable);
}
存在问题有两个:
1.这样初始化后的引脚通道输出都为0,我想将初始化后的引脚通道都为1,怎么设置?
2.在程序使用中,可以通过TIM_CCxNCmd(TIM1,TIM_Channel_3,TIM_CCxN_Disable);失能,将两个引脚都置为0;想要将都为1,两个都使能Enable,却只有CH1为0,CH1N为1,这样怎么修改?

最佳答案

查看完整内容[请看2#楼]

1.这样初始化后的引脚通道输出都为0,我想将初始化后的引脚通道都为1,怎么设置? TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-28 15:12:21 | 显示全部楼层
1.这样初始化后的引脚通道输出都为0,我想将初始化后的引脚通道都为1,怎么设置?

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-28 19:30:32 | 显示全部楼层
有人在吗?
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-28 19:33:43 | 显示全部楼层
你是想让别猜猜你碰到什么问题么? 呵呵
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-28 20:40:38 | 显示全部楼层
edmund1234 发表于 2018-8-28 19:33
你是想让别猜猜你碰到什么问题么? 呵呵

额  我不是说了我的问题吗,怎么去配置啊,,,
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-28 20:43:38 | 显示全部楼层
主要是这里的问题感觉,设置问题,我将下面
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
改成这样:
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
,并且将最后的失能,改成:
TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
  TIM_CCxNCmd(TIM1,TIM_Channel_1,TIM_CCxN_Enable);
  TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);
  TIM_CCxNCmd(TIM1,TIM_Channel_2,TIM_CCxN_Enable);
  TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Enable);
  TIM_CCxNCmd(TIM1,TIM_Channel_3,TIM_CCxN_Enable);
后,初始化后的波形,全是高电平了,
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-28 20:51:06 | 显示全部楼层
在主函数中while中,执行的程序如下:(speed_duty此时为100)
                          TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
        TIM_CCxNCmd(TIM1,TIM_Channel_1,TIM_CCxN_Enable);

      TIM_SetCompare2(TIM1,BLDC_TIM_PERIOD*speed_duty/100);
      TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);

此时对应的CH1波形为1通道,CH1N波形为2通道,CH2波形为3通道,CH2N波形为4通道,

IMG_20180828_204454.jpg
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-28 20:52:35 | 显示全部楼层
有懂的帮个忙啊,如果我描述不清楚,说一下,重新说一下问题
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-29 10:54:18 | 显示全部楼层
edmund1234 发表于 2018-8-29 01:10
1.这样初始化后的引脚通道输出都为0,我想将初始化后的引脚通道都为1,怎么设置?

TIM_OCInitStructure. ...

这样设置后,初始化后是对的,但是不能够CH1为高电平,CH1N进行PWM
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-29 13:39:42 | 显示全部楼层
本帖最后由 edmund1234 于 2018-8-29 13:55 编辑
我心逐梦 发表于 2018-8-29 10:54
这样设置后,初始化后是对的,但是不能够CH1为高电平,CH1N进行PWM
那你为什么要用互补? 分开4个独立通道不就完了么
不明白你想要怎样的结果,
回复

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2018-1-19
在线时间
20 小时
 楼主| 发表于 2018-8-29 14:43:04 | 显示全部楼层
edmund1234 发表于 2018-8-29 13:39
那你为什么要用互补? 分开4个独立通道不就完了么
不明白你想要怎样的结果,

程序使用中,需要使用6路PWM,分为3组互补,但是这时候输出高电平对应后面控制电路是关断状态,所以
1、假设CH3和CH3N都输出高电平,这时候CH1输出PWM,CH1N输出高电平,CH2输出高电平,CH2N输出PWM,,,这样是一种想要的结果,
2、下一步,有可能切换状态,CH3和CH3N不变,但是CH1输出高电平,CH1N输出PWM,CH2输出PWM,CH2N输出高电平
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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