OpenEdv-开源电子网

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

关于PWM输出一定脉冲数之后,延时一点时间再输出一定脉冲数的疑问

[复制链接]

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
发表于 2014-9-10 20:07:57 | 显示全部楼层 |阅读模式
5金钱
我用的是TIM3的通道1输出50%40KHZ的方波,然后再开一个TIM2定时器进行输出脉冲数的限制,
if(time==1&&flag==1)
{
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
 TIM_Cmd(TIM3, ENABLE);
 TIM_ARRPreloadConfig(TIM3, ENABLE);
 flag=0;
}
 if(time>3&&flag==0)
{
 TIM_Cmd(TIM3, DISABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , DISABLE);
 TIM_SetCounter(TIM3,0);
 flag=1;
}
time是加到400之后清零,确实实现的输出固定脉冲数,但是输出方波关掉PWM的那段延时PA6有的时候是高电平,有的时候是低电平,我只想要低电平的效果该如何实现

最佳答案

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

直接修改IO为推挽输出,然后输出低电平.等要输出PWM的时候,再设置为复用输出.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-10 20:07:58 | 显示全部楼层
直接修改IO为推挽输出,然后输出低电平.等要输出PWM的时候,再设置为复用输出.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-10 20:58:18 | 显示全部楼层

回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-10 20:59:33 | 显示全部楼层
上面两幅图就是我所说的现象,还有就是定时器的门控模式是怎么回事去哪找资料
回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-11 18:24:40 | 显示全部楼层
嗯谢谢我解决了,我让他在输出最后一个PWM脉冲时,把它的计数值改了,不让它的电平发生反转,这样就实现了
回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-11 18:24:55 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯谢谢我解决了,我让他在输出最后一个PWM脉冲时,把它的计数值改了,不让它的电平发生反转,这样就实现了
回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-11 20:17:39 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥你好,我想深入学习一下定时器以及其中断的知识,比如定时器的门控模式是怎么回事,原子哥能否给我提供一下资料,在网上找的太乱了,谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-11 22:42:34 | 显示全部楼层
回复【7楼】想十字路口:
---------------------------------
STM32中文参考手册
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-12 10:30:59 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
嗯,谢谢
回复

使用道具 举报

11

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-9-29
在线时间
1 小时
 楼主| 发表于 2014-9-12 10:49:25 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
还有就是他的通用定时器都有一个自己单独的16位计数器吗,互不干扰啊,因为我现在我同时开三个定时器,设定的分频和那个计数值都不相同,会有影响吗??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-13 00:16:18 | 显示全部楼层
回复【10楼】想十字路口:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-13 00:16:25 | 显示全部楼层
回复【10楼】想十字路口:
---------------------------------
没有影响
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-19 17:30:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我现在采用门控方式两路输出固定数量的PMM,我需要它结束时都保持低电平,但结束时总有一个是高电平,怎么办?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-20 00:39:41 | 显示全部楼层
回复【13楼】laoguren1122:
---------------------------------
简单的就是直接设置为推完输出,然后输出0.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-20 09:25:51 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
问题是门控方式没有中断,也不知到什么时候结束,也就不能及时设置为推挽输出
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-20 09:35:00 | 显示全部楼层
配置程序为:
void TIM_PWM_Number_Init(u16 master_arr, u16 master_psc, u16 slave_arr, u16 slave_psc)

{   

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure; 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能定时器2的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能定时器3的时钟
   
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8|GPIO_Pin_9; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
   
  //TIM2工作在单脉冲下
   TIM_TimeBaseStructure.TIM_Period = master_arr;//TIM2per;//重装值
   TIM_TimeBaseStructure.TIM_Prescaler = master_psc;//7200;//预分频值,每100us计数一次
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0;//TIM_CKD_DIV1;//没有时钟分割
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

   TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止
   TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
   TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
//  TIM_OCInitStructure.TIM_Pulse = 1;//比较捕获1的预装载值
  TIM_OC1Init(TIM2,&TIM_OCInitStructure);  

  TIM_Cmd(TIM2,DISABLE);//先不使能能TIM2

  //TIM1工作在从模式的门控模式下的PWM输出模式
  TIM_TimeBaseStructure.TIM_Period = slave_arr; //TIM3per;设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = slave_psc; //720;设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0; //TIM_CKD_DIV1;/设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;  //TIM向上计数模式
// TIM_TimeBaseStructure.TIM_RepetitionCounter = 10;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 
  
  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//TIM3为门控模式
 // TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);//使能TIM3的主从模式
  TIM_SelectInputTrigger(TIM1,TIM_TS_ITR1);//内部触发,从TIM2触发

//初始化TIM3 Channel2 PWM模式  
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
// TIM_OCInitStructure.TIM_Pulse = TIM3Compare1;//比较捕获1的预装载值
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCNPolarity_Low; //输出极性:TIM输出比较极性高
// TIM_OCInitStructure.TIM_Pulse = TIM3Compare1;//比较捕获1的预装载值
  TIM_OC2Init(TIM1, &TIM_OCInitStructure);  
 
    TIM_CtrlPWMOutputs(TIM1,ENABLE);
    TIM_Cmd(TIM1,ENABLE);//使能TIM3
}



因为有90度相位差,所有总有一路结束时输出的是高电平,怎么破?
现在驱动MOS,不能长时间输出高电平,但门控模式又不知道脉冲什么时候结束,没法进行重新配置。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 21:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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