打印

TIM3,4的PWM同步输出问题

[复制链接]
5469|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mousie|  楼主 | 2011-4-13 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mousie 于 2011-4-13 17:30 编辑

用TIM3,4同步PWM输出,TIM3用TRGOSource触发输出,TIM4以Trigger为从模式,两者用TIM_Cmd(TIM3/4, ENABLE)启动,中间用TIM_SetAutoreload和TIM_SetCompare改变频率,最后先用TIM_Cmd(TIM3/4, DISABLE)停止输出脉冲,再用TIM_ForcedOC1-4Config保证输出脉冲的间歇管脚电平固定。
现在的问题是:各路脉冲在程序启动后最开始生成时同步的非常好,但是在频率改变之后,以及脉冲停止后再次生成的时候,两个定时器的脉冲生成会有一个非常小的错位?不知道问题出在哪里?
我理解单片机是在一个脉冲周期完成后自动执行TIM_SetAutoreload和TIM_SetCompare修改寄存器,然后再按照新值生成新的脉冲。另外定时器DISABLE之后再启动定时器整个清零重启。现在看来好像不是这样,还需要哪些操作达到上述要求呢?
沙发
airwill| | 2011-4-13 19:20 | 只看该作者
TIM3 用 update 做TRGOSource, TIM4 再以 Trigger 为从模式

使用特权

评论回复
板凳
mousie|  楼主 | 2011-4-14 10:35 | 只看该作者
本帖最后由 mousie 于 2011-4-14 10:53 编辑

:L按2楼设的错位更加严重并且随时间递加,附上我的定时器设置代码,看看是我哪理解错了?
void CameraTriggerStar(u16 arr3, u16 arr4)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  
  /* TIM失能 */
//  TIM_Cmd(TIM3, DISABLE);
//  TIM_Cmd(TIM4, DISABLE);
  
  /* 时基 */
    TIM_TimeBaseStructure.TIM_Period = arr3;         
    TIM_TimeBaseStructure.TIM_Prescaler = 0x00;      
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//TIM3——周期10K
  
    TIM_TimeBaseStructure.TIM_Period = arr4;
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//TIM4——周期10K

  /* TIM3设置*/
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
    TIM_OCInitStructure.TIM_Pulse = arr3 / 2;  
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInit(TIM3, &TIM_OCInitStructure);//脉宽调制输出——占空比50%
  
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInit(TIM3, &TIM_OCInitStructure);
  
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInit(TIM3, &TIM_OCInitStructure);
  
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//使能主从模式
  
  TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);//选择触发输出模式——更新事件
  
  TIM_UpdateDisableConfig(TIM3, ENABLE);

  /* TIM4设置 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
    TIM_OCInitStructure.TIM_Pulse = arr4 / 2;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInit(TIM4, &TIM_OCInitStructure);//脉宽调制输出——占空比50%
  
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInit(TIM4, &TIM_OCInitStructure);
  
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInit(TIM4, &TIM_OCInitStructure);
  
    TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInit(TIM4, &TIM_OCInitStructure);

  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);//选择从模式——计数器在触发(TRGI)的上升沿开始
  
  TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);//选择输入触发源——(TIM3)
  
  /* TIM使能*/
  TIM_Cmd(TIM3, ENABLE);
  TIM_Cmd(TIM4, ENABLE);  
}

使用特权

评论回复
地板
mousie|  楼主 | 2011-4-14 11:32 | 只看该作者
又改了一下设置,在CameraTriggerStar中开头加入了TIM_DeInit,即每次从新生成脉冲之前先恢复默认,这样两路定时器输出脉冲有一个恒定1.5us的错位,从一开始就有,且与频率无关。
虽然现在的效果已经可以满足要求,不过我还是想问一下:
1.TIM3用update做TRGOSource, TIM4再以Trigger为从模式,为什么会有恒定的1.5us的错位,能消除吗?
2.在PWM输出中直接用TIM_SetAutoreload和TIM_SetCompare改变频率,ARR和CCR能保证恰好在上一个脉冲周期完成之后改写吗
3.每次脉冲输出停止后,能不能记录到底输出了多少个脉冲呢,我用TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE)好像没中断啊

使用特权

评论回复
5
mousie|  楼主 | 2011-4-15 09:11 | 只看该作者
看来需要我自己顶一下啊,PWM输出能记录脉冲数吗?可以生成每周期一次的中断吗?

使用特权

评论回复
6
airwill| | 2011-4-15 17:08 | 只看该作者
PWM输出能记录脉冲数吗?  能,
可以生成每周期一次的中断吗?能
使用溢出中断就可以了

使用特权

评论回复
7
mousie|  楼主 | 2011-4-18 09:48 | 只看该作者
溢出中断是TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE)吗?用这个函数没有中断啊
呃,我比较菜哈:L

使用特权

评论回复
8
mousie|  楼主 | 2011-4-18 10:34 | 只看该作者
已经用TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE)搞定了,折腾半天我忘记设NVIC中断向量了:L
我挖个坑把自己埋了吧:'(

使用特权

评论回复
9
mousie|  楼主 | 2011-4-18 10:37 | 只看该作者
再重复一下4楼的问题,看有人给我解惑吗:
1.TIM3用update做TRGOSource, TIM4再以Trigger为从模式,输出脉冲为什么会有恒定的1.5us的错位,能消除吗?
2.在PWM输出中直接用TIM_SetAutoreload和TIM_SetCompare改变频率,ARR和CCR能保证恰好在上一个脉冲周期完成之后改写吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

63

帖子

1

粉丝