在步进电机控制时,经常会遇到需要输出指定个数的脉冲来实现精确控制。本篇文章将介绍怎样使用定时器输出指定个数的PWM脉冲。

硬件环境:STM32F103C8T6

软件环境:STM32CubeMX v6.1.1

HAL库:STM32CubeF1 Firmware Package V1.8.3

产生固定个数脉冲的方法也有很多,这里介绍两种常用的方法。

1.中断计数方式

这种方式比较简单,定时器配置为PWM输出模式,在PWM中断中计数,当达到设定的个数后,停止PWM输出。这里以定时器1为例进行介绍,配置如下:

TIM1的通道2配置为PWM输出,分频系数、计数周期、脉宽等根据需要输出的PWM频率进行配置。需要打开定时器的捕获比较中断(TIM1高级定时器的中断是分开的,普通定时器只有一个中断)。

完成后生成代码。添加自己的程序。

首先定义一个全局变量,用于控制输出脉冲个数。

uint16_t PwmNum;

需要输出脉冲时,给该变量赋值,并启动PWM中断输出。

PwmNum = 10;HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_2);

编写中断回调函数,判断PWM输出次数达到设定值时,停止PWM输出。

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){static uint16_t cnt = 0;cnt++;if(cnt == PwmNum){cnt = 0;HAL_TIM_PWM_Stop_IT(&htim1,TIM_CHANNEL_2);}}

编译运行程序,可以看到,输出了10个PWM脉冲,说明程序正确。

2.主从定时器门控方式

中断计数的方式实现起来很简单,但也存在明显的缺点。当PWM频率较高时,频繁的中断将影响程序运行的效率。遇到这种情况就需要采用主从定时器门控的方式来实现。所谓主从模式就是将主定时器作为触发源,触发从定时器来工作。

STM32CubeMX配置

主定时器为TIM1,通道2配置为PWM输出,使能主从模式,触发事件选择为更新事件,不需要开启中断。

从定时器为TIM2,从模式选择为门控模式,触发源选择ITR0,开启定时器2中断。

触发源的选择需要查看数据手册中进行选择,TIM2为从定时器、TIM1为主定时器时选择ITR0。

程序编写

配置完成后生成代码,编写自己的程序。

__HAL_TIM_SET_AUTORELOAD(&htim2,5-1); //设置要输出的PWM脉冲数 5个HAL_TIM_Base_Start_IT(&htim2);             //启动从定时器HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);  //启动主定时器PWM输出

编写定时器2中断回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim == &htim2){if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_CC2) != RESET)  //判断是否触发中断{__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_CC2);      //清除中断标志HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);   //关闭主定时器HAL_TIM_Base_Stop_IT(&htim2);         //关闭从定时器}}}

完成后编译程序下载测试,可以看到输出了5个频率为10KHz的PWM脉冲,与程序中一致。

3.总结

两种方式都可以产生指定个数的PWM脉冲,各有优缺点。中断计数的方式实现简单,但不适合频率较高的PWM应用。主从定时的方式占用CPU资源少,但是占用了两个定时器。用户需要根据实际需求选择用哪种方式。

推荐阅读:

欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

linux 定时器中断脉冲计数,STM32定时器产生指定个数脉冲相关推荐

  1. 定时器中断程序 c语言,定时器中断函数的使用

    1.定时器与延时的区别 大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效 ...

  2. STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)

    目录 定时器 8个定时器 定时器功能 定时器中断 常用通用定时器的寄存器 定时器中断实验目的: 定时器库函数及步骤 实验程序讲解 PWM 简介 STM32 PWM工作过程 PWM模式1 与 PWM模式 ...

  3. 初学STM32之定时器中断

    初学STM32之定时器中断 一.定时器概述 1.定时器的分类 STM32F10x系列总共最多有8个定时器分为高级定时器,通用定时器和基本定时器.三种定时器的主要区别如下图所示: 本文章仅介绍通用定时器 ...

  4. STM32定时器中断实验-学习笔记

    目录 目录 目录 通用定时器简介 寄存器 控制寄存器 (TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄存器(TIMx_PSC) TIMx_CNT 寄存器 自动重装载寄存器( ...

  5. STM32定时器中断

    目录 一.关于STM32定时器中断 1.定时器分类 2.通用定时器的功能特点 3.定时器中断的触发 4.定时时钟计算方法 二.CubeMX初始化配置 1.芯片选型(我们这里运用的STM32F103C8 ...

  6. stm32定时器中断配置及使用

    stm32定时器中断配置及使用 定时器中断就是:可以周期性的执行某些功能,而不受main函数的影响. 我们以通用定时器time3为例说明 1.首先配置时钟源为内部时钟,分频和充装载值根据自己需要填入, ...

  7. 【STM32】定时器中断原理及操作

    目录 时钟的选择及分频 定时器中断有关的寄存器 定时器中断有关的库函数 1.时钟使能函数:RCC_APB1PeriphClockCmd 2.定时器初始化函数:TIM_TimeBaseInit 3.定时 ...

  8. stm32定时器与定时器中断

    1.定时器种类 注:主要使用通用定时器 2.通用计时器特点描述 说明:四个通道互不影响 3.定时器中断触发条件 4.定时器计数模式 分为向上,向下,向上向下模式 5.通用定时器作用用途 测量输入输出波 ...

  9. STM32定时器中断进去了出不来不能执行主函数

    最近用STM32F103做点东西,设置了定时器中断,出现了定时器一直在正常工作但是主函数不能运行的情况,检查时发现标志位清除是在进入定时器中断函数的一开始就执行清除,查询资料发现有时会出现一些情况导致 ...

  10. STM32的定时器2 定时器中断

    目录 定时器的时钟选择 选择时钟源 定时器的寄存器 当前值寄存器CNT 预分频寄存器PSC 自动重装载寄存器ARR 控制寄存器CR1 ​中断使能寄存器DIER 定时器操作步骤 1. 使能定时器时钟 2 ...

最新文章

  1. 分组表管理之保存分组表数据
  2. java jpanel方法,Java JPanel.putClientProperty方法代码示例
  3. 运行时权限+读取系统联系人
  4. 微众WeCross 跨链平台(4)异构链互联协议HIP
  5. sqlite常见使用总结
  6. Golang 推荐的命名规范
  7. Map 的Properties集合存储IO流对象
  8. Flask爱家租房--发布新房源(保存房屋基本信息)
  9. 大端字节序与小端字节序的转换
  10. [转载] python中字符串编码形式及其所占字节
  11. hp服务器装xp系统,教你惠普笔记本一键装xp系统的方法
  12. Java:应用Observer接口实现Observer模式
  13. 垃圾分类:人机搭配,干活不累
  14. mysql 表 页 行_Mysql之InnoDB行格式、数据页结构
  15. CentOS6安装Cisco模拟器Dynamips
  16. 手机组态软件 APP监控台达PLC C#全套源代码
  17. 用友汽车IPO过会:拟募资5.6亿 高瓴刚参与母公司定增
  18. 日期:将格林尼治时间(GMT)转化为北京时间
  19. 第一种可以用手机远程实时观看的网络摄像机,还带云台,报警,双向语音
  20. 深拷贝和浅拷贝的几种方法

热门文章

  1. Node.js入门:文件查找机制
  2. 日常琐事的记录,每周六晚做一次总结整理
  3. 通过apache对页面进行压缩和页面缓存来提升性能
  4. c#Struts框架理念和自制Struts框架下 复杂版(2009-06-10)
  5. 用javascript操作xml
  6. JMM同步规范和Volatile重点概要
  7. Vue的生命周期和钩子函数
  8. 微信小程序开发 -- 获取当前页面路径
  9. Unit1 Homework
  10. Mac下启动AndroidStudio失败