OpenEdv-开源电子网

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

使用STM32 TIM2的PWM输入捕获模式,结果不正常求解

[复制链接]

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2014-12-15 14:33:59 | 显示全部楼层 |阅读模式
5金钱
//TIM2设置为输入捕获功能
void TIM2_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //NVIC配置
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

    //TIM2设置
    //时基设置  
    TIM_BaseInitStructure.TIM_Prescaler = 0;// 设置预分配器
    TIM_BaseInitStructure.TIM_ClockDivision = 0;//时钟分频值
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;//是重复计数,就是重复溢出多少次才给你来一个溢出中断
    TIM_TimeBaseInit(TIM2,&TIM_BaseInitStructure);
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;             //  TIM_Channel_4; //通道选择
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //设 置 输 入 信 号 的 有效 捕获 极性 ====上升沿触发
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ; //管脚与寄存器对应关系   ---配置 IC1 直接映射在 TI1 上 
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //输入预分频。
    TIM_ICInitStructure.TIM_ICFilter = 0x0;                      //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
    TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);  //根据参数配置TIM外设信息
    
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1|TIM_TS_TI2FP2);   //选择IC1,2为触发源 这里不大懂触发源是怎么分配到捕获单元的

    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);              //TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
    TIM_Cmd(TIM2, ENABLE);                                       //启动TIM2
    TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);                      //打开中断
}


TIM2对应的引脚已经设置成浮空输入。

//中断函数
void TIM2_IRQHandler(void)
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);    //清楚TIM的中断待处理位
  IC2Value = TIM_GetCapture2(TIM2);    //读取IC2捕获寄存器的值,即为PWM周期的计数值
  if(IC2Value != 0)
    {/*
      注意:TIM_GetCapture2(TIM2);和TIM_GetCapture1(TIM2);函数名的细微区别,这个很重要 
    */
      //需要分开保存两次测得的PWM频率和占空比
      //
      //
      PWM.DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value; //读取IC1捕获寄存器的值,并计算占空比
      PWM.Rightf = 72000000 / IC2Value;  //计算PWM频率。
      PWM.Period=IC2Value;               //PWM周期
      PWM.flag=1;
    }
  else
    { 
      PWM.flag=0;
      PWM.DutyCycle = 0;
      PWM.Rightf = 0;
    }
}


在中断函数里 我认为第一次捕获成功后IC2Value =0;
仿真也确实如此,
第二次发生捕获中断就应该能读出PWM的周期数据
IC2Value = TIM_GetCapture2(TIM2);
                 TIM_GetCapture1(TIM2);但是仿真发现 第二次发生捕获中断后这两个读出的数据都是1 ,

求解

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-15 18:57:56 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 06:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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