打印

请问TIMx中断如何捕获?PWM

[复制链接]
2468|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thefly|  楼主 | 2010-3-7 01:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM, TI, mx, TE, ST
本帖最后由 thefly 于 2010-3-8 20:29 编辑

利用TIM3 CH3产生了一个PWM,并且想动态改变占空比,利用如下中断程序测试指示灯无反应,请问为什么?
/* -----------------------------------------------------------------------
    TIM3 Configuration: generate PWM signal with duty cycle:
    TIM3 CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
    TIM3 ARR Register = 719 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
    TIM3 Frequency = 100 KHz.
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%     CRRx_Val = 360
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%     CRRx_Val = 180
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
  ----------------------------------------------------------------------- */

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 719;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
  
  // Clear TIM2 update pending flag
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  
  // Enabel interrupt
  //TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  
  
  //TIM_UpdateRequestConfig(TIM3,TIM_UpdateSource_Regular);
  
  

   /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  //TIM_ARRPreloadConfig(TIM3,DISABLE);
  TIM_ARRPreloadConfig(TIM3, ENABLE);



  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);


void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_CC3)!= RESET)
    {
        
        GPIO_WriteBit(GPIO_LED, GPIO_LED0_PIN, (BitAction)((1-GPIO_ReadOutputDataBit(GPIO_LED, GPIO_LED0_PIN))));
        //IC3value = TIM_GetCapture3(TIM3);
   
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
    }
}
另外还有个问题: "在中断里面放一个变量自加,再观察变量是否变化,可以检查I/O配置是否正确" 这个方法具体如何操作?斑竹能否指教一二,谢谢
沙发
ST_ARM| | 2010-3-8 11:01 | 只看该作者
把你的初始化程序贴出来。

使用特权

评论回复
板凳
baidudz| | 2010-3-8 11:46 | 只看该作者
应该是初始化没配置好

使用特权

评论回复
地板
thefly|  楼主 | 2010-3-8 20:28 | 只看该作者
初始化如下,已经可以在示波器上看到所设定的访波信号,各位高手请帮我看看
/* -----------------------------------------------------------------------
    TIM3 Configuration: generate PWM signal with duty cycle:
    TIM3 CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
    TIM3 ARR Register = 719 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
    TIM3 Frequency = 100 KHz.
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%     CRRx_Val = 360
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%     CRRx_Val = 180
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
  ----------------------------------------------------------------------- */

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 719;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
  
  // Clear TIM2 update pending flag
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  
  // Enabel interrupt
  //TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  
  
  //TIM_UpdateRequestConfig(TIM3,TIM_UpdateSource_Regular);
  
  

   /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  //TIM_ARRPreloadConfig(TIM3,DISABLE);
  TIM_ARRPreloadConfig(TIM3, ENABLE);



  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);

使用特权

评论回复
5
xsgy123| | 2010-3-8 21:02 | 只看该作者
可以在示波器上看到所设定的访波信号?意思是说有波形,指示灯没反应?

使用特权

评论回复
6
thefly|  楼主 | 2010-3-8 21:30 | 只看该作者
是的,可以看到波形,并且频率和占空比也正确,但就是不能捕获中断

使用特权

评论回复
7
thefly|  楼主 | 2010-3-9 17:28 | 只看该作者
顶一下,香版帮帮忙

使用特权

评论回复
8
香水城| | 2010-3-9 18:08 | 只看该作者
标题是"捕获",帖子中又说"波形",还有什么指示灯,实在不明白在说什么。

使用特权

评论回复
9
thefly|  楼主 | 2010-3-9 20:42 | 只看该作者
我的意思是:利用TIM3产生了一个PWM信号,并且想在这个信号的上升沿进中断toggle指示灯,之前笨笨的一个贴子里提到过,可是为什么在我这不灵呢?

使用特权

评论回复
10
gxgclg| | 2010-3-9 21:51 | 只看该作者
只能是用一个引脚产生PWM波,用另一个引脚进行中断捕获

使用特权

评论回复
11
thefly|  楼主 | 2010-3-10 00:03 | 只看该作者
本帖最后由 thefly 于 2010-3-10 03:42 编辑

原来是这样,多谢提醒.
再请问一下,是否必须使用另一个计时器进行捕获,还是也可以用本计时器的其他通道
只能是用一个引脚产生PWM波,用另一个引脚进行中断捕获
gxgclg 发表于 2010-3-9 21:51

使用特权

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

本版积分规则

4

主题

24

帖子

1

粉丝