OpenEdv-开源电子网

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

STM32 定时器设置同步发生时,PWM输出波形不同步。

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-5-18
在线时间
20 小时
发表于 2018-7-23 17:35:09 | 显示全部楼层 |阅读模式
30金钱
本帖最后由 769417953 于 2018-7-24 13:30 编辑

本人在写一个程序时主要功能实现一个传感器的3路时序输出采用定时器的同步功能来实现,其中TIM2输出主时钟信号CLK,TIM4输出移位信号SH,TIM1输出门信号ICG,TIM2设置为主模式,TIM1和TIM4设置为从模式由TIM2启动,现在问题出现在TIM4产生的移位信号和TIM1产生的门信号不同步的问题?示波器的图形如图:图中红色为移位信号SH 黄色为门信号ICG 理论中上的信号如图2:[mw_shl_code=c,true]
void TIM1_UP_IRQHandler(void)
{
   u16 temp = 1000;
   TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
   
   
   if(++fdgdg >= 20)
   {
      //if(Dis_flag)
       //  Dis_B();
      fdgdg = 0;
   }
   
   
   if(ICG_Ready == 1)
   {
      while(temp--);
      DMA_Cmd(DMA1_Channel1, ENABLE);//使能通道 1
      if( Inner_Ave_Count <= Inner_Ave_Count_Set)//Inner_Ave_Count_Set )
      {
         if(Comm_Send_Mark)
         {
            Inner_Ave_Count++;
            //XFL_TRIG_H();
            //temp = 200;
            //while(temp--);
            //XFL_TRIG_L();
         }
         Data_Sum_Mark = 1;
         ICG_Ready = 0;
      }
      else
      {
         if(Inner_Ave_Count > Inner_Ave_Count_Set)
         {
            Inner_Ave_Count = 0;
            Comm_Send_Mark = 0;
         }
         else
            ICG_Ready = 1;
      }
   }
}
/*******************************************************************************
* Function Name  : TIM2_IRQHandler 定时器2中断处理函数
*******************************************************************************/
void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM2 , TIM_IT_CC1);
  }
}
/*******************************************************************************
* Function Name  : TIM3_IRQHandler 定时器3中断处理函数
*******************************************************************************/
void TIM3_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3 , TIM_IT_CC3);
  }
  if(TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM3 , TIM_IT_CC4);
  }
}[/mw_shl_code][mw_shl_code=c,true]/**********************************
配制定时器1
开中断为1304ICG和DMA触发
***********************************/
void Tim1_config( void )
{
  
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_DeInit(TIM1);

   
     u16 time_Pulse=399;
   
   
    TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);               //设置为从时钟模式
    TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1);                   //设置TIM1为从模式查表得受TIM2控制
   
    /* Time base configuration */
    TIM_BaseInitStructure.TIM_Period = time_Pulse;//Tim_Period_Val; //35;
    TIM_BaseInitStructure.TIM_Prescaler = 39;
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
   
    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
   
   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 5;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
    //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
      
   
   
    //TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    //TIM_OCInitStructure.TIM_Pulse = 20;
    //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //输出比较极性为高即当输出xx%时为高电平
   
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
   
    TIM_CtrlPWMOutputs(TIM1, ENABLE);//DISABLE//ENABLE
   
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);
   
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
   
}

/**********************************
配制定时器2的通道1 PA0为1304CLK

PWM输出模式,占空比为50%
***********************************/
void Tim2_config(void)
{
    vu16 CCR1_Val = 17;
   
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    //TIM_DeInit(TIM2);



   
    TIM_TimeBaseStructure.TIM_Period = 35;//
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
   
    /* Master Configuration in PWM1 Mode */
   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //Output Compare Mode
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 18;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
   
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
   
    /* Select the Master Slave Mode */
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   //TIM2 设置为主时钟模式
   
    /* Master Mode selection */
    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
   
}
/**********************************
配制定时器3的通道2 PA7为1/4的1304CLK
用来连接外部中断线11,触发AD1通道11进行AD转换
PWM输出模式,占空比为50%
***********************************/  
void Tim3_config(void)
{
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   
    TIM_DeInit(TIM3);

    TIM_TimeBaseStructure.TIM_Period = 143;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   
   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCMode_Toggle;//
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OutputState_Disable;
    TIM_OCInitStructure.TIM_Pulse = 72;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //输出比较极性为高即当输出xx%时为高电平
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
   
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);
   
    TIM_CtrlPWMOutputs(TIM3, ENABLE);//DISABLE//ENABLE
}


/**********************************
配制定时器4的通道1 PB6为1304_SH
sh_time为全局变量,用来改变积分时间
PWM输出模式
***********************************/
void Tim4_config(void)
{
    u16 time_Pulse=399;

    TIM_DeInit(TIM4);
   
   
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   
    TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Gated);               //TIM4 设置为从时钟模式
    TIM_SelectInputTrigger(TIM4, TIM_TS_ITR1);                     //设置TIM1为从模式查表得受TIM2控制
   
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   
    TIM_TimeBaseStructure.TIM_Period = time_Pulse;
    TIM_TimeBaseStructure.TIM_Prescaler = 39;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
   
    /* Master Configuration in PWM1 Mode*/
   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //Output Compare Mode
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 4;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
   
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);
}[/mw_shl_code]

E7798E66FD25BB689CC4818665BF26A2.png
QQ截图20180723175522.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-24 01:51:28 | 显示全部楼层
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-5-18
在线时间
20 小时
 楼主| 发表于 2018-7-24 11:32:02 | 显示全部楼层
本帖最后由 769417953 于 2018-7-24 12:26 编辑

TIM4的SH信号总是在TIM1第二次反转才会转化电平
回复

使用道具 举报

10

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2016-9-28
在线时间
40 小时
发表于 2021-12-27 21:15:09 | 显示全部楼层
请问你这个问题解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 02:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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