1. 前言

基于《【众拳STM8 40 讲】PWM 输入捕获原理与实验(频率)》我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法。

基于《【思修STM8 39 讲】PWM 输入捕获之占空比测量(寄存器版)》我们了解了 PWM 捕获的详细流程步骤,但是其并非利用 STM8库函数 实现,同时也没有利用中断实现采集。

基于《【STM8】PWM 捕获实战:占空比和频率(TIM1)》我们了解了利用PWM输入模式和复位触发模式采集 PWM,但是并非所有定时器都具有复位触发模式

下面我们介绍利用 STM8库函数 和 中断 的方式来实现利用 TIM2 捕获 PWM 占空比和频率。

2. 实现代码

PWM 采集规定是:CH1 上升捕获,CH2 下降沿捕获

不同于 TIM1 的复位触发模式,TIM2 不具备复位触发模式,所以编码方式上还是有些不同

// tim2.cu16 GV_Tim2PwmiFreq = 0;       //【系统使用】定时器捕获的 PWM 频率
double GV_Tim2PwmiDuty = 0.0;  //【系统使用】定时器捕获的 PWM 正占空比/*** TIM2 PWM 输入初始化*/
void TIM2_PWMI_Init()
{// 重置初始化TIM2_DeInit();// 初始化 TIME1 时基单元// 16预分频,向上计数,每 1s/1M = 1us 计数器值加 1(累加 1000 次需要 1 毫秒)// 参数说明:预分配值,自动重装载值(计数器值到 65536 后重新装载)TIM2_TimeBaseInit(TIM2_PRESCALER_16, 65536-1);// PWM的通道1配置//// 参数说明://  1. TIM2 通道1//  2. 极性:上升沿捕获//  3. 输入脚:TIM2_ICSELECTION_DIRECTTI 表示直接将 T1 信号经过 TI1FP1 发送给 IC1 模块进行处理//  4. 预分频:意思是控制在多少个输入周期做一次捕获;【经过实际测试,复位触发模式下该值无效,都是按照1分频执行】//           1M 系统时钟,捕获 20Hz PWM 一个周期需要计数 50000  次(1M/20=50000),TIM2 最大计数有65536,可以捕获//           1M 系统时钟,捕获 15Hz PWM 一个周期需要计数 66666  次(1M/15=66666),TIM2 最大计数有65536,无法捕获//  5. 滤波频率:经历几个周期相同的跳变则波形稳定。如果频率捕获偶发值不对,那么可以启用 0x02(4个事件)TIM2_PWMIConfig(TIM2_CHANNEL_1, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_DIV1, 0x00);// PWM的通道2配置//【经过实际测试,通道2 可以不用配置,也可以配置,但是如果配置那么参数必须要填写正确:TIM2_ICPOLARITY_FALLING,TIM2_ICSELECTION_INDIRECTTI】//【至于为什么不用配置系统仍旧能正常运行,猜想可能是 STM8库函数 内部自动做了一些处理】// // 参数说明://  1. TIM2 通道2//  2. 极性:下降沿捕获//  3. TIM2_ICSELECTION_INDIRECTTI 表示直接将 T1 信号经过 TI1FP2 发送给 IC2 模块进行处理//  4. 预分频:意思是控制在多少个输入周期做一次捕获;【经过实际测试,复位触发模式下该值无效,都是按照1分频执行】//  5. 滤波频率:经历几个周期相同的跳变则波形稳定。如果频率捕获偶发值不对,那么可以启用 0x02(4个事件)//TIM2_PWMIConfig(TIM2_CHANNEL_2, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_INDIRECTTI, TIM2_ICPSC_DIV1, 0x00);// 输入捕获/比较输出使能//【经过实际测试,以下使能代码可以注释掉,但是为了安心还是加上去】TIM2_CCxCmd(TIM2_CHANNEL_1, ENABLE);TIM2_CCxCmd(TIM2_CHANNEL_2, ENABLE);
}/*** 开始 PWM 捕获*/
void TIM2_PWMI_Start()
{// 清空俘获中断标志TIM2_ClearITPendingBit(TIM2_IT_CC1);TIM2_ClearFlag(TIM2_FLAG_CC1);// 启用中断函数:俘获比较通道CH1中断TIM2_ITConfig(TIM2_IT_CC1, ENABLE);// 开定时器//【经过实际测试,定时器就算未开启,上面的 TIM2_IT_CC1 中断仍正常进入,但是获取的计数器值不确定】TIM2_Cmd(ENABLE);
}/*** 终止 PWM 捕获* 利用 TIM2_Cmd(DISABLE) 关闭输出,注意其他函数可能受影响,例如:TIM2_PWMI_Init*/
void TIM2_PWMI_Stop()
{// 关闭中断函数:俘获比较通道CH1中断TIM2_ITConfig(TIM2_IT_CC1, DISABLE);// 关闭定时器TIM2_Cmd(DISABLE);
}/*** 获取 TIM2 CH1 捕获的 PWM 频率** @return integer  频率*/
u16 TIM2_PWMI_GetFreq()
{return GV_Tim2PwmiFreq;
}/*** 获取 TIM2 CH1 捕获的 PWM 正占空比** @return double  占空比*/
double TIM2_PWMI_GetDuty()
{return GV_Tim2PwmiDuty;
}
// stm8s_it.cINTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 12)
{// 初始化定时器输入捕获值// 分别对应一个PWM周期的第一个上升沿,第一个下降沿,第二个上升沿static u16 icValueA, icValueB, icValueC;// 获取定时器输入捕获值if( icValueA == 0 ){icValueA = TIM2_GetCapture1();}else{icValueB = TIM2_GetCapture2();icValueC = TIM2_GetCapture1();// 处理定时器捕获值溢出情况if( icValueC < icValueA ) icValueC = icValueC-icValueA+65535;else icValueC = icValueC - icValueA;if( icValueB < icValueA ) icValueB = icValueB-icValueA+65535;else icValueB = icValueB - icValueA;// 计算频率和周期// 这里的 1000000 是基于初始化函数中的系统时钟设置(16预分频 = 1000000)// 这里的 100.0 小数点表示将表达式 icValueB*100.0/icValueC 的过程和结果以浮点数来进行GV_Tim2PwmiFreq = 1000000/icValueC;GV_Tim2PwmiDuty = icValueB*100.0/icValueC;// 重置定时器输入捕获值icValueA = icValueB = icValueC = 0;}// 清除中断标志位TIM2_ClearITPendingBit(TIM2_IT_CC1);    TIM2_ClearFlag(TIM2_FLAG_CC1);
}

注意:建议使用 TIM2 就启用一个功能:输入捕获或者输出比较

   主要考虑到不同通道输出/捕获时都同时设置 TIM2_TimeBaseInit 函数,会相互干扰,为了减少程序复杂度所以建议使用 TIM2 就启用一个功能

【STM8】PWM 捕获实战:占空比和频率(TIM2)相关推荐

  1. 【STM8】PWM 捕获实战:占空比和频率(TIM1)

    1. 前言 基于<[众拳STM8 40 讲]PWM 输入捕获原理与实验(频率)>我们已经了解了利用 STM8 库函数 如何捕获和计算 PWM 的频率,但是确没有介绍占空比的捕获方法. 基于 ...

  2. GD32测量pwm波频率以及占空比

    1.需求 最近做的一个项目,其中有一个传感器输出是pwm波形,频率代表速度,频率越高速度越快.不同的占空比代表不同的故障类型.占空比10%~90%,频率范围20hz ~1khz. 基于以上的需求,单片 ...

  3. 10. GD32F103C8T6 定时器-测量pwm的占空比和频率

    一. 利用TIM2的输入通道0,通道1测量pwm的占空比和频率 1. 配置gpio void inpit_gpio_config(void) {rcu_periph_clock_enable(RCU_ ...

  4. GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比

    GD32F303固件库开发.13----定时器TIM捕获PWM测量频率与占空比 概述 视频教学 csdn课程 样品申请 生成例程 keil配置 使能串口 串口重定向 占空比与频率计算 GPIO初始化 ...

  5. 定时器主从模式实现PWM脉冲个数、占空比以及频率可调(250kHz以下)

    GPIO配置: void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd( RCC_APB1 ...

  6. PWM占空比,频率,周期之间关系

    PWM占空比,频率,周期之间关系 频率所涉及的是周期,频率与周期成倒数.脉宽与占空比所涉及的是周期.脉宽是在一个周期内高电平所占的时间,占空比(如其名)为在一个周期内高电平所占的比例.例如:假设频率为 ...

  7. io输出pwm且占空比和频率同时可调驱动实现

    1.设计用户层传递方式 只需传递频率和占空比 参数范围:频率:1hz~1Mhz   占空比(高电平时间/周期):1-99  (代表1%~99%) 2.设计方式 思路手稿:           结论: ...

  8. 基于STC8G1K08A的可调节占空比和频率的PWM应用案例

    基于STC8G的可调节占空比和频率的PWM应用案例 CSDN的小白分享 前言 一.STC8G系列的介绍 二.使用记录 1.建立工程 2.打开工程所需的芯片功能,及本人的函数 总结 CSDN的小白分享 ...

  9. stm8程序无法写入c语言,[转载]STM8 PWM例程

    STM8--PWM 在单片机应用系统中,也常常会用到PWM 信号输出,例如电机转速的控制.现在很多高档的单片机 也都集成了PWM 功能模块,方便用户的应用. 对于PWM 信号,主要涉及到两个概念,一个 ...

最新文章

  1. 虫洞协议和闪电网络如何混为一谈?
  2. Angular的scope. apply和CRM WebClient UI的modify方法
  3. elementui分页组件按钮样式修改_Vue使用Elementui修改默认最快方法!
  4. IPSec L2L ××× 之 Router-to-ASA
  5. 多线程的那点儿事(之无锁队列)
  6. ‘adb‘ 不是内部或外部命令and Error while executing: am start -n解决
  7. ios加密算法AES
  8. 联想笔记本电脑键盘灯怎么开启_解决方案:如何打开Lenovo键盘灯?联想笔记本键盘键盘灯按哪个键?...
  9. mis服务器系统,MIS系统中服务器推技术的实现
  10. 2016阿里巴巴校园招聘内推篇
  11. rand()函数的用法
  12. 八个数码管共阴c语言,LT-51S(STC89C52R):8个共阴极数码管-程序(2)
  13. 机器视觉的9大快速开发库简单介绍
  14. 小米MIX 2获取root超级权限的经验
  15. 芯片行业常用的英文术语及其含义
  16. vue-cli使用element-ui分页组件
  17. 零基础学习C语言必读书籍
  18. OU Graphics 建筑后期悬挂植物制作PS教程
  19. 对于SLAM定位中各类坐标系的理解(坐标系,里程计坐标系,基座坐标系与雷达坐标系)
  20. 安卓APP跟iOSAPP之间的对比

热门文章

  1. Java以毫秒为单位返回秒表记录的流逝时间(即求一个程序段的运行时间)
  2. mysql sql where or_SQL的WHERE子句中包含多个AND和OR
  3. PDA 手持式智能终端和 RFID 技术
  4. 中止执行后超过2年_执行中止后恢复执行的期限有什么规定
  5. 笔记本电脑连接显示器如何让笔记本电脑单纯作为一台主机进行使用/笔记本连接显示器以后只需要显示器进行显示的操作! 2021/1/16
  6. 电脑麦克风没声音怎么办?3个方法快速解决
  7. 修复损坏文件,给电脑保驾续航
  8. [注塑]各种进胶方式优缺点分析
  9. P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序
  10. mapboxgl 加载常用图层汇总