1. 前言

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

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

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

2. 实现代码

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

以下代码利用了 TIM1 的 PWM输入模式+复位触发模式 进行 PWM 采集

// tim1.c/*** TIM1 PWM 输入初始化*/
void TIM1_PWMI_Init()
{// 重置初始化TIM1_DeInit();// 初始化 TIME1 时基单元// 16预分频,向上计数,每 1s/1M = 1us 计数器值加 1(累加 1000 次需要 1 毫秒)// 参数说明:预分配值,计数模式,自动重装载值(计数器值到 65536 后重新装载),计数器起始值(计数器值重新装载后从0开始)TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 65536-1, 0);// PWM的通道1配置// PWM的通道2无需配置,因为 TIM1_PWMIConfig(...) 内部已经进行了配置//// 参数说明://  1. TIM1 通道1//  2. 极性:上升沿捕获//  3. 输入脚:TIM1_ICSELECTION_DIRECTTI 表示直接将 T1 信号经过 TI1FP1 发送给 IC1 模块进行处理//  4. 预分频:意思是控制在多少个输入周期做一次捕获;【经过实际测试,复位触发模式下该值无效,都是按照1分频执行】//           1M 系统时钟,捕获 20Hz PWM 一个周期需要计数 50000  次(1M/20=50000),TIM1 最大计数有65536,可以捕获//           1M 系统时钟,捕获 15Hz PWM 一个周期需要计数 66666  次(1M/15=66666),TIM1 最大计数有65536,无法捕获//  5. 滤波频率:经历几个周期相同的跳变则波形稳定,此处不滤波。如果频率捕获偶发值不对,那么可以启用 0x02(4个事件)TIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x02);// 选择输入触发源// 设置 TI1FP1 的信号为触发输入源// 芯片根据触发源的触发信息自动设置 触发复位模式 的一些动作(包括:复位计数器值等)TIM1_SelectInputTrigger(TIM1_TS_TI1FP1);  // TIM1_SMCR |= 0x50;// 从模式选择// 从模式选择为触发复位模式TIM1_SelectSlaveMode(TIM1_SLAVEMODE_RESET);  // TIM1_SMCR |= 0x04;// 输入捕获/比较输出使能//【经过实际测试,以下使能代码可以注释掉,但是为了安心还是加上去】TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);TIM1_CCxCmd(TIM1_CHANNEL_2, ENABLE);
}/*** 开始 PWM 捕获*/
void TIM1_PWMI_Start()
{// 清空俘获中断标志TIM1_ClearITPendingBit(TIM1_IT_CC1);TIM1_ClearFlag(TIM1_FLAG_CC1);// 启用中断函数:俘获比较通道CH1中断TIM1_ITConfig(TIM1_IT_CC1, ENABLE);// 开定时器//【经过实际测试,定时器就算未开启,上面的 TIM1_IT_CC1 中断仍正常进入,但是获取的计数器值不确定】TIM1_Cmd(ENABLE);
}/*** 终止 PWM 捕获*/
void TIM1_PWMI_Stop()
{// 关闭中断函数:俘获比较通道CH1中断TIM1_ITConfig(TIM1_IT_CC1, DISABLE);// 关闭定时器TIM1_Cmd(DISABLE);
}/*** 获取 TIM1 CH1 捕获的 PWM 频率** @return integer  频率*/
u16 TIM1_PWMI_GetFreq()
{return GV_Tim1PwmiFreq;
}/*** 获取 TIM1 CH1 捕获的 PWM 正占空比** @param short number  PCB上的编号*/
double TIM1_PWMI_GetDuty()
{return GV_Tim1PwmiDuty;
}
// stm8s_it.cINTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
{// 初始化u16 icValueB, icValueC;// 中断:PWM 捕获//【经过实际测试】复位触发模式的第一个上升沿不会触发中断,第一个下降沿和第二个上升沿会触发中断//        实际编码过程中,我们只需要关注第二个上升沿中断就可以了,其他动作STM8库函数会自动处理。if( TIM1_GetITStatus(TIM1_IT_CC1) != RESET ){// B 点:第一个下降沿的计数器值(TIM1 CH2)// C 点:第二个上升沿的计数器值(TIM1 CH1)icValueB = TIM1_GetCapture2();icValueC = TIM1_GetCapture1();// 计算频率和周期// 这里的 1000000 是基于初始化函数中的系统时钟设置(16预分频 = 1000000)// 这里的 100.0 小数点表示将表达式 icValueB*100.0/icValueC 的过程和结果以浮点数来进行GV_Tim1PwmiFreq = 1000000/icValueC;GV_Tim1PwmiDuty = icValueB*100.0/icValueC;// 清除中断标志位TIM1_ClearITPendingBit(TIM1_IT_CC1);    TIM1_ClearFlag(TIM1_FLAG_CC1);}
}

上述代码中用到的PWM采集原理请参考《【思修STM8 39 讲】PWM 输入捕获之占空比测量(寄存器版)》

备注:仅 TIM1-CH1 和 CH2 两个通道支持复位触发模式;CH3 和 CH4 不支持复位触发模式,也不支持 TIM1_PWMIConfig(...) 进行配置,需要直接利用 TIM1_ICInit(...) 函数进行配置,PWM 的频率和占空比采集代码和上述也有不同,具体参见《【STM8】PWM 捕获实战:占空比和频率(TIM2)》。所以一个项目内如果需要需要同时开启 TIM1-CH1 和 CH3 输入捕获,那么就不能用 复位触发模式 了,否则两种方案的采集代码会冲突(因为复位触发模式会将计数器值设置为0,那么就会冲突到CH3的采集)。

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

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

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

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

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

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

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

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

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

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

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

  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. BCH网络成功发布第一个商业级别的Token
  2. 精通Server Core系列之一 ---Server Core简介
  3. shell命令卸载mysql_centos8中的MySQL卸载和安装
  4. rbac权限管理 php,thinkPHP3.2使用RBAC实现权限管理的实现
  5. .net 操作xml
  6. 向上造型和向下造型_盆景造型大全——造型教程
  7. JQuery--使用autocomplete控件进行自己主动输入完毕(相当于模糊查询)
  8. mysql explain分析
  9. javaweb(04) xml
  10. R2: 已解释和未解释的方差
  11. vue父组件引用子组件方法显示undefined问题原因及解决方法
  12. CVPR2021 | TrivialAugment:不用调优的SOTA数据增强策略
  13. 在lua中优雅的操作日期和时间
  14. 电商OTA:如何评估社区产品?
  15. 3D游戏从入门到精通-2 -5
  16. 关于 Win10 截图 截屏 原生截图工具 基础使用
  17. JVM(2):垃圾收集器与gc
  18. Qt-网易云音乐界面实现-9 照片墙功能
  19. 脚本安装爱普生790K打印机安装完成之后销毁程序(其他版本打印机更换inf文件即可)
  20. SPEC MPI 安装运行

热门文章

  1. Paint 常用方法记录 +
  2. Android与GNU体系
  3. 小米 android 8.1手机,小米又一款手机获得安卓8.1系统更新!
  4. python计算机视觉--全景图像拼接
  5. SR(Segment Routing)不是MPLS的优化和升级
  6. 十款在线图表制作服务
  7. 王道计算机网络 第一章 计算机网络
  8. URL中“#” “?” “”号的作用
  9. JSFL批量删除fla文件中超出某个宽度的原件
  10. Linux下的CPU性能瓶颈分析案例