首先要明白什么是PWM输入捕获?

第一,PWM输入捕获是基于TIM实现的一个功能;输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)如果硬件不具备,也可以一个捕获装置,但是需要稍微复杂的配置。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。

简而言之,捕获就是捕获一个边沿信号的变化,pwm输入捕获最后还是捕获功能,只是多了一个跳变沿的设置(高电平和低电平),进而控制占空比,显现不一样的波形;

接下来就是如何实现捕获功能?

1)开启 TIM 时钟,配置 IO口;
2) 初始化 TIM, 设置 TIM 的 ARR 和 PSC;
3) 设置 TIM的输入比较参数,开启输入捕获;
4)使能捕获和更新中断(设置 TIM 的 DIER 寄存器);
5)设置中断分组,编写中断服务函数;
6)使能定时器(设置 TIM 的 CR1 寄存器);

以我的工程为例,进行演示;

1)开启 TIM17 时钟,配置 PA15口;这样是由于PA15复用了TIM17_CH1;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM17, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_2); // tim17_ch1   pA15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);

2) 初始化 TIM, 设置 TIM 的 ARR 和 PSC;arr设置为最大值0xffff;psc设置为95,即(96-1),我的芯片系统时钟频率为96M;

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/* Time Base configuration */TIM_TimeBaseStructure.TIM_Prescaler = 95;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_Period = 0xffff;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInit(TIM17, &TIM_TimeBaseStructure);

3) 设置 TIM17的输入比较参数,开启输入捕获;

TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;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_ICInit(TIM17, &TIM_ICInitStructure);

4)使能捕获和更新中断(设置 TIM 的 DIER 寄存器);

  TIM_DTS_Cfg(TIM17);TIM_TI1E_Set(TIM17);TIM_SelectInputTrigger(TIM17, TIM_TS_TI1FP1);               //选择TIM17输入触发源:TIM经滤波定时器输入1TIM_SelectSlaveMode(TIM17, TIM_SlaveMode_Reset);              //选择从机模式:复位模式TIM_SelectMasterSlaveMode(TIM17, TIM_MasterSlaveMode_Enable); //开启复位模式TIM_ITConfig(TIM17, TIM_IT_CC1, ENABLE);                      //开启CC1中断/* TIM enable counter */TIM_Cmd(TIM17, ENABLE);

5)设置中断分组,编写中断服务函数;

NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM17_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

6)使能定时器(设置 TIM 的 CR1 寄存器);

写在第4步里面了;

第5步的中断服务函数编写:

变量定义为全局变量,不要写在函数里面;CCER寄存器是控制上升沿捕获还是下降沿捕获的;CCR1寄存器里存放的就是计数值;注意溢出的情况怎么处理的;

这里为什么要改变触发方式呢?

是由于这个芯片的TIM17只有一个通道,ch1通道;

u32 IC1Value = 0, IC1ValueOld = 0, cat_H = 0,cat_L=0,IC2ValueOld;u8 catstep;
u32 duty_ok;void TIM17_Handler(void)
{if((catstep==0)&&(TIM17->CCER==1)){IC1ValueOld = TIM17->CCR1;TIM17->CCER = 3;//下降沿duty_ok = 0;}else if((catstep==0)&&(TIM17->CCER==3)){IC1Value = TIM17->CCR1;if(IC1Value>IC1ValueOld)cat_H=IC1Value-IC1ValueOld;else cat_H=(IC1Value+65535-IC1ValueOld);//溢出TIM17->CCER = 1;//变上升沿触发catstep=1;}
//    else if ((catstep==1)&&(TIM17->CCER==1)){IC2ValueOld = TIM17->CCR1;IC1ValueOld =TIM17->CCR1;if(IC2ValueOld>IC1Value)cat_L=IC2ValueOld-IC1Value;else cat_L=(IC2ValueOld+65535-IC1Value);TIM17->CCER = 3;//下降沿catstep=0;duty_ok = 1;//建议duty=1时在while里面计算占空比}TIM_ClearITPendingBit(TIM17, TIM_IT_CC1);
}

最后在main函数里调用;注意一些变量的声明;

extern u32 cat_H;
extern u32 cat_L;
extern u32 duty_ok;
float duty;//写在while循环里
if(duty_ok)duty=((float)cat_L/(float)(cat_L+cat_H));  //电平与信号相反

最后,如果不出意外,IO口触发电平的转换,就会有信号的变化; 可以弄个按键触发;

单片机之PWM输入捕获相关推荐

  1. stm32 PWM输入捕获

    普通的输入捕获,可使用定时器的四个通道,一路捕获占用一个捕获寄存器. PWM输入,只能使用两个通道,通道1和通道2. 一路PWM输入占用两个捕获寄存器,一个捕获周期,一个捕获占空比. 这里,用通用定时 ...

  2. 【WB32库开发】第12章(上)TIM1高级定时器——PWM输入捕获

    本章要学习的PWM输入捕获是定时器又一重要应用,使用PWM输入捕获可以测量输入PWM的频率和占空比. PWM输入只能使用定时器的两个通道:通道1和通道2,且一路PWM输入要占用两个捕获寄存器,一个用于 ...

  3. PWM输入捕获(只使用一路定时器通道)

    前言 上一篇文章介绍了使用<STM32参考手册>上 PWM 输入模式捕获的 PWM 波,这种方法简单且准确,但是它占用的资源太多了,因为它使用定时器的两个通道,且这两个通道映射在一个通道上 ...

  4. 华大半导体HC32F4A0笔记(一),PWM输入捕获,使用TIM6

    一.启动时钟 PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR6_x, Enable); TMR6对应FCG2,根据PWM输入引脚来确定是TMR6_x(本例为TMR6_2).运行 ...

  5. stm32时钟(2)输入捕获以及PWM输入捕获

    输入捕获 过程 ​ 在输入捕获模式下,信号从TIx输入,一共有四个输入口,以TI1为例,经过滤波器和边沿检测器后输出TI1FPx两路信号,该信号可以直接从IC1从输入,也可以从IC2输入,此处以IC1 ...

  6. STM32遥控方法SONY PS2 、航模,STM32定时器PWM输入捕获航模接收机

    PS2接线: 买家会给你程序和说明: 接线: GND接STM32 GND VCC接STM32 VCC DAT接 STM32 PB12 CMD接STM32 PB13 CS接 STM32 PB14 CLK ...

  7. STM32 输入捕获 测量频率 PWM占空比

    看了网上关于STM32输入捕获的资料,有几篇介绍的很不错,但是内容上还有一点问题,稍加修改,大家可以参考一下. 重要概念理解(对于理解输入捕获功能很重要,特别看了数据手册CCR1\CCR2\CCR3\ ...

  8. 【蓝桥杯嵌入式】【STM32】13_PWM输入捕获模式

    文章目录 前言 1.PWM输入模式 2.硬件设计 3.软件设计 前言   STM32的定时器输入捕获模式可以通过更改输入捕获极性实现PWM的输入捕获,但实际上STM32也包含有非常方便的PWM输入捕获 ...

  9. stm32PWM输入捕获模式详解

    一.概念理解 PWM输入捕获模式是输入捕获模式的特例,自己理解如下 每个定时器有四个输入捕获通道IC1.IC2.IC3.IC4.且IC1 IC2一组,IC3 IC4一组.并且可是设置管脚和寄存器的对应 ...

最新文章

  1. 世界隐形冠军比拼:德国1307家、美国366家、中国68家
  2. vs2013突然没有代码提示功能了。
  3. css选择器(css Selectors)的语法分析
  4. 做人应该知道的十个道理
  5. mysql dump xtrabackup_MySQL--备份恢复【Mysqdump+xtrabackup(XBK)】
  6. Python 文件和目录操作总结
  7. IntellIJ IDEA 启动 参数 配置
  8. 微信支付教程系列之扫码支付
  9. 深度学习之基于DCGAN实现手写数字生成
  10. 阻止SPY++类似的程序捕捉软件窗口
  11. Centos上安装jdk版本出错的问题
  12. Flash视频播放器开发经验总结
  13. PR值计算公式带来的思考
  14. Django学习笔记-settings.py详解
  15. PTA L1-049 天梯赛座位分配(20分)(python)
  16. OpenGL学习笔记--配置VS环境
  17. hive时间AM PM格式转化为24小时制 按小时分morning,noon 思路+演示
  18. vcenter中修改vm配置硬盘失败问题分析处理
  19. 朱刘算法 有向图的最小生成树
  20. Redmine基础: 邮件配置

热门文章

  1. 为什么前端工作越来越难找了?
  2. 计算机性能过低配色方案,系统之家windows7提示更改配色方案提高性能的方法
  3. 拉伯证券|A股延续强势格局 北向资金开年以来净买入超1500亿元
  4. 阿里云和腾讯云免费SSL证书 专题
  5. 西门子plm_历年中国工业软件营收十强厂商:华为、西门子稳居前二名
  6. vue 动态生成下载二维码
  7. BIRTV 2018媒体融合峰会:TVU CEO演讲干货分享
  8. github+hexo搭建自己的博客网站(五)进阶配置(畅言实现博客的评论)
  9. kafka日志清理策略,compact和delete
  10. html下拉框动态增加成员,JavaScript实现左右下拉框动态增删示例