硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5024|回复: 5
收起左侧

TIM9作PWM输入捕获时定时器会自动停止。

[复制链接]

6

主题

24

回帖

6

积分

新手上路

积分
6
发表于 2016-8-1 09:03:31 | 显示全部楼层 |阅读模式
不知道为什么,我用tim9做PWM输入捕获时,定时器会自己停止。哪位大神帮忙看看呀?
中断里面做PWM频率输出和占空比输出。每次进入中断都要重新打开定时器TIM_Cmd(ADVANCE_TIM, ENABLE);,不然捕获为零。
void  ADVANCE_TIM_IRQHandler (void)
{
  /* Çå3y¶¨ê±Æ÷2¶»ñ/±è½Ï1ÖD¶Ï */
  TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);
    TIM_Cmd(ADVANCE_TIM, ENABLE);

  /* »ñè¡êäèë2¶»ñÖμ */
  IC1Value = TIM_GetCapture1(ADVANCE_TIM);
  IC2Value = TIM_GetCapture2(ADVANCE_TIM);   
  //printf("IC1Value = %d  IC2Value = %d ",IC1Value,IC2Value);
   
  if (IC1Value != 0)
  {
    /* Õ¼¿Õ±è¼ÆËã */
    DutyCycle = (float)(IC2Value * 100) / IC1Value;

    /* ÆμÂê¼ÆËã */
    Frequency = 180000000/30/(float)IC1Value;
        printf("Õ¼¿Õ±è£o%0.2f%%   ÆμÂê£o%0.2fHz\n",DutyCycle,Frequency);
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}
定时器设置如下:
static void TIMx_GPIO_Config(void)
{
    /*¶¨òåò»¸öGPIO_InitTypeDefààDíμĽá11ìå*/
    GPIO_InitTypeDef GPIO_InitStructure;

    /*¿aÆôLEDÏà1ØμÄGPIOíaéèê±Öó*/
//    RCC_AHB1PeriphClockCmd (GENERAL_OCPWM_GPIO_CLK, ENABLE);
    RCC_AHB1PeriphClockCmd (ADVANCE_ICPWM_GPIO_CLK, ENABLE);     

    /* ¶¨ê±Æ÷¸′óÃòy½Å */
//    GPIO_PinAFConfig(GENERAL_OCPWM_GPIO_PORT,GENERAL_OCPWM_PINSOURCE,GENERAL_OCPWM_AF);
    GPIO_PinAFConfig(ADVANCE_ICPWM_GPIO_PORT,ADVANCE_ICPWM_PINSOURCE,ADVANCE_ICPWM_AF);
   
    /* í¨óö¨ê±Æ÷PWMêä3öòy½Å */                                                               
//    GPIO_InitStructure.GPIO_Pin = GENERAL_OCPWM_PIN;   
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
//    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//    GPIO_Init(GENERAL_OCPWM_GPIO_PORT, &GPIO_InitStructure);
   
    /* ¸ß¼¶¿ØÖƶ¨ê±Æ÷PWMêäèë2¶»ñòy½Å */
    GPIO_InitStructure.GPIO_Pin = ADVANCE_ICPWM_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;     
    GPIO_Init(ADVANCE_ICPWM_GPIO_PORT, &GPIO_InitStructure);
}
static void TIMx_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    // éèÖÃÖD¶Ï×éÎa0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        
        // éèÖÃÖD¶Ïà′Ô′
    NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQn;     
        // éèÖÃÇàÕ¼óÅÏè¼¶
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     
      // éèÖÃ×óóÅÏè¼¶
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

static void TIM_PWMINPUT_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
   
    // ¿aÆôTIMx_CLK,x[1,8]
  RCC_APB2PeriphClockCmd(ADVANCE_TIM_CLK, ENABLE);

  TIM_TimeBaseStructure.TIM_Period = 0xFFFF-1;     
    // ¸ß¼¶¿ØÖƶ¨ê±Æ÷ê±ÖóÔ′TIMxCLK = HCLK=180MHz
    // é趨¶¨ê±Æ÷ÆμÂêÎa=TIMxCLK/(TIM_Prescaler+1)=100KHz
  TIM_TimeBaseStructure.TIM_Prescaler = 30-1;   
  // ¼Æêy·½ê½
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   
    // 3õê¼»ˉ¶¨ê±Æ÷TIMx, x[1,8]
    TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
   
    /* IC12¶»ñ£oéÏéyÑØ′¥·¢ TI1FP1 */
  TIM_ICInitStructure.TIM_Channel = ADVANCE_IC1PWM_CHANNEL;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
   
//    /* IC22¶»ñ£oϽμÑØ′¥·¢ TI1FP2 */   
//    TIM_ICInitStructure.TIM_Channel = ADVANCE_IC2PWM_CHANNEL;
//  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
//  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
//  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//  TIM_ICInitStructure.TIM_ICFilter = 0x0;
//  TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
   
    /* Ñ¡Ôñ¶¨ê±Æ÷êäèë′¥·¢: TI1FP1 */
  TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);        

  /* Ñ¡Ôñ′óÄ£ê½: ¸′λÄ£ê½ */
  TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable);

  /* ê1Äü¸ß¼¶¿ØÖƶ¨ê±Æ÷ */
  TIM_Cmd(ADVANCE_TIM, ENABLE);

  /* ê1Äü2¶»ñ/±è½Ï2ÖD¶ÏÇëÇó */
  TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);
}

void TIMx_Configuration(void)
{
    TIMx_GPIO_Config();
   
    TIMx_NVIC_Configuration();   
  
    //TIM_PWMOUTPUT_Config();
   
    TIM_PWMINPUT_Config();
}
与之相关的是TIM3输出一个控制一个模块使他输入一个PWM波形用TIM9来测量。
回复

使用道具 举报

6

主题

24

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2016-8-1 09:07:28 | 显示全部楼层
源代码如下 TIM9PWM输入捕获.rar (8.56 MB, 下载次数: 173)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115668
QQ
发表于 2016-8-1 13:04:58 | 显示全部楼层
帮顶,下载下来看了一下,没有发现什么问题,找官方标准固件库里面的定时器捕获例子对比下,看看是不是那个选项少配置什么了。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-8-3 22:30:14 | 显示全部楼层
问题解决了吗?楼主可以说说
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115668
QQ
发表于 2020-8-4 08:21:10 | 显示全部楼层
erlun 发表于 2020-8-3 22:30
问题解决了吗?楼主可以说说

他这个是用的从机触发捕获,太麻烦了,用的TI1FP1
饶了非常大一个圈来使用

QQ截图20200804082450.png

你应该直接使用IC输入捕获即可,参考案例,我们V6论坛置顶帖的标准库网盘,红色接收例子即可,用的这个方案:

4.png

回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-11 04:11 , Processed in 0.297589 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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