打印

如何在中断中改变PWM的周期?或者占空比?

[复制链接]
4218|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LPcfANS|  楼主 | 2009-1-7 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    TIM_BaseInitStructure.TIM_Period = 65535;
    TIM_BaseInitStructure.TIM_Prescaler = 17;
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);
   
    TIM_ARRPreloadConfig(TIM3,DISABLE);
    //TIM_ARRPreloadConfig(TIM3, ENABLE);
    
    TIM_UpdateRequestConfig(TIM3,TIM_UpdateSource_Regular);

    
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
   
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
    
 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);

    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
    

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);

    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

    
    TIM_ITConfig(TIM3,TIM_IT_CC1 | TIM_IT_Update,ENABLE);
   

    TIM_Cmd(TIM3, ENABLE);

    TIM_CtrlPWMOutputs(TIM3, ENABLE);
沙发
LPcfANS|  楼主 | 2009-1-7 13:39 | 只看该作者

中断函数:

void TIM3_IRQHandler(void)
{

    TIM_OCInitTypeDef  TIM_OCInitStructure;


  
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
       TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
       
     savetime_2+=1;
     if(savetime_2>100)
     {
       savetime_2=0;
       savetime_3+=1;
       if(savetime_3>100)
       {
         savetime_3=0;
         
         CCR1_Val++;
        if(CCR1_Val>60000)
          CCR1_Val=511;
        TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
            
        GPIO_SetBits(GPIOF, GPIO_Pin_9); //关LED4
        GPIO_ResetBits(GPIOF, GPIO_Pin_8);  //关LED5
        GPIO_SetBits(GPIOF, GPIO_Pin_7); //关LED6
        GPIO_ResetBits(GPIOF, GPIO_Pin_6);  //关LED7
       }
     }
   
    
    
  }
  else if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
    
    savetime_4+=1;
     if(savetime_4>100)
     {
       savetime_4=0;
       savetime_1+=1;
       if(savetime_1>100)
       {
         savetime_1=0;
         
         CCR2_Val++;
        if(CCR2_Val>32768)
          CCR2_Val=511;
        TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
            
        GPIO_ResetBits(GPIOF, GPIO_Pin_9); //关LED4
        GPIO_SetBits(GPIOF, GPIO_Pin_8);  //关LED5
        GPIO_ResetBits(GPIOF, GPIO_Pin_7); //关LED6
        GPIO_SetBits(GPIOF, GPIO_Pin_6);  //关LED7
       }
     }
     
    
    
  } 

}

使用特权

评论回复
板凳
LPcfANS|  楼主 | 2009-1-7 13:42 | 只看该作者

===

是不是还有那些地方没设置对?????

使用特权

评论回复
地板
香水城| | 2009-1-7 14:20 | 只看该作者

请先解释一下这是什么程序?

哪些语句是做什么事情的?

使用特权

评论回复
5
LPcfANS|  楼主 | 2009-1-7 14:28 | 只看该作者

我想在TIM3中断改变他的占空比...

这个程序在TIM3输出PWM没问题,中断也可以进去.(我在中断中记数,在LCD显示,中断可以进去)

使用特权

评论回复
6
香水城| | 2009-1-7 15:28 | 只看该作者

请说清楚TIM3的几个通道是如何用的?

TIM3的中断是什么中断?

使用特权

评论回复
7
LPcfANS|  楼主 | 2009-1-7 17:23 | 只看该作者

都输出PWM...中断设置如下:谢谢...

TIM_ITConfig(TIM3,TIM_IT_CC1 | TIM_IT_Update,ENABLE);

使用特权

评论回复
8
LPcfANS|  楼主 | 2009-1-8 11:39 | 只看该作者

顶.....

期待斑竹给讲讲.谢谢..
需要设置的地方太多了...

使用特权

评论回复
9
LPcfANS|  楼主 | 2009-1-8 13:49 | 只看该作者

这样就可以了。谢谢斑竹,参考了一个网友的例子.

void SysTickHandler(void)
{
 static unsigned char j=0;
  savetime++;

  if (savetime >100)
  {

     savetime = 0;
     savetime1++;
     
     if(savetime1>100)
       savetime1=0;

     //TIM3_Configuration();
      j++;
      TIM3->CCR1=sindata[j];
      TIM3->CCR2=sindata[j];
      TIM3->CCR3=sindata[j];
      TIM3->CCR4=sindata[j];
      if(j>7)j=0;
    

  }

}

使用特权

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

本版积分规则

69

主题

1614

帖子

1

粉丝