OpenEdv-开源电子网

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

求助STM32F1PWM捕获模式的相关问题

[复制链接]

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
发表于 2020-4-23 16:46:13 | 显示全部楼层 |阅读模式
5金钱
参考手册说PWM捕获模式几个关键点,
1.同一个TIx输入映射了两个ICx信号。
2. 这两个ICx信号分别在相反的极性边沿有效。

3. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

4. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM

    时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

5. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

然后我看很多例程,都是只配置了一个通道的输入极性等,例如IC2映射到TI1上,并没有配置IC1.但是我按这么写确实能在CCR1和CCR2里得到周期和占空比,为什么?
/*TIM配置*/

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;                   //通道选择
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //上升沿触发
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;    //管脚与寄存器对应关系
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;           //输入预分频。意思是控制在多少个输入周期做一次捕获,如果

//输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,

//可以减少软件被不断中断的次数。
  TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF

  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);                 //根据参数配置TIM外设信息

  /* Select the TIM3 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);                //选择IC2为始终触发源

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);                                 //启动TIM2

  /* Enable the CC2 Interrupt Request */         
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);     //打开中断




最佳答案

查看完整内容[请看2#楼]

多谢原子哥,我已经找到问题了,之前太想当然,仿真了一下看了实际寄存器的值就是配置了两个通道,然后再回头看函数发现TIM_PWMIConfig会自动配置另一个通道为相反极性,应该就专门是为了PWM输入捕获准备的void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) { uint16_t icoppositepolarity = TIM_ICPolarity_Rising; uint16_t icoppositeselection = TIM_ICSelection_DirectTI; /* Check th ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
 楼主| 发表于 2020-4-23 16:46:14 | 显示全部楼层
多谢原子哥,我已经找到问题了,之前太想当然,仿真了一下看了实际寄存器的值就是配置了两个通道,然后再回头看函数发现TIM_PWMIConfig会自动配置另一个通道为相反极性,应该就专门是为了PWM输入捕获准备的void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
{
  uint16_t icoppositepolarity = TIM_ICPolarity_Rising;
  uint16_t icoppositeselection = TIM_ICSelection_DirectTI;
  /* Check the parameters */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  /* Select the Opposite Input Polarity */
  if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising)
  {
    icoppositepolarity = TIM_ICPolarity_Falling;
  }
  else
  {
    icoppositepolarity = TIM_ICPolarity_Rising;
  }
  /* Select the Opposite Input */
  if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI)
  {
    icoppositeselection = TIM_ICSelection_IndirectTI;
  }
  else
  {
    icoppositeselection = TIM_ICSelection_DirectTI;
  }
  if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
  {
    /* TI1 Configuration */
    TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
               TIM_ICInitStruct->TIM_ICFilter);
    /* Set the Input Capture Prescaler value */
    TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
    /* TI2 Configuration */
    TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);
    /* Set the Input Capture Prescaler value */
    TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
  }
  else
  {
    /* TI2 Configuration */
    TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
               TIM_ICInitStruct->TIM_ICFilter);
    /* Set the Input Capture Prescaler value */
    TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
    /* TI1 Configuration */
    TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);
    /* Set the Input Capture Prescaler value */
    TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
  }
}

×××××××××××××××××××××××××××××××××××××
其中 icoppositepolarity和icoppositeselection,对立IC极性和映射,被设置为和已设置IC相反的
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
 楼主| 发表于 2020-4-23 16:50:26 | 显示全部楼层
问题是,为什么程序里只配置了一个IC的映射与极性等,没有配置第二个,不是应该配置成一个上升沿一个下降沿么
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
 楼主| 发表于 2020-4-24 09:55:36 | 显示全部楼层
而且这句TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 和 1.同一个TIx输入映射了两个ICx信号,好像是矛盾的啊,这句代码是IC1映射TI1,IC2映射TI2
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-4-25 01:33:05 | 显示全部楼层
帮顶
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
 楼主| 发表于 2020-4-25 10:34:41 | 显示全部楼层

多谢,已经清楚了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 03:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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