stm32定时器方式精确输出指定脉冲个数

这篇具有很好参考价值的文章主要介绍了stm32定时器方式精确输出指定脉冲个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本例使用芯片为 STM32f407zg
使用标准库编程

输出指定脉冲个数的PWM方法主要有两种:计数器中断方式和定时器同步方式。
项目输出可控双脉冲pwm波形,可根据需要控制输出脉冲个数,查阅网上资料大部分为HAL库配置,自己实际第一次编程有些一头雾水,后查阅官方帮助手册和参考手册,配置出项目,故在此纪录。

1、计数器中断方式

原理:

程序定义两个定时器,定时器1负责计数,开启定时器1比较中断和溢出更新中断,在达到给定的比较值时产生中断,进入中断开启定时器2输出PWM波(设置占空比),在达到溢出值时产生更新中断,停止定时器2的PWM输出(占空比0),从而达到稳定输出脉冲个数。结果如图
stm32输出固定数量脉冲,stm32,单片机,嵌入式硬件

主要程序:

定时器1:

 TIM_TimeBaseInitTypeDef  TIM_TimeStructure;
    TIM_OCInitTypeDef   TIM_OCStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选择优先级分组2。
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    //引脚复用
   GPIO_PinAFConfig(GPIOF, GPIO_PinSource6, GPIO_AF_TIM10);
   GPIO_Init(GPIOF,&GPIO_InitStructure); 

    //时基单元
    RCC_APB2PeriphClockCmd(Major_TIM_CLK,ENABLE);
    TIM_TimeStructure.TIM_Period = TIM_Time-1;
    TIM_TimeStructure.TIM_Prescaler = Major_TIM_Prescaler;
    TIM_TimeStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM10,&TIM_TimeStructure);


    //占空比设置
    TIM_OCStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
    TIM_OCStructure.TIM_Pulse = TIM_duty*TIM_Time;
    TIM_OCStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OC1Init(TIM10, &TIM_OCStructure); 

    TIM_OC1PreloadConfig(TIM10, TIM_OCPreload_Enable);//使能预装载值处理器
    TIM_ARRPreloadConfig(TIM10, ENABLE);//使能ARPE位
    TIM_ClearFlag(TIM10, TIM_FLAG_Update);//清除中断标志位 
    TIM_ITConfig(TIM10,TIM_FLAG_Update,ENABLE); //开启中断
    TIM_ITConfig(TIM10,TIM_FLAG_CC1,ENABLE);
    
    TIM_Cmd(TIM10,ENABLE);

以定时器10为计数器,在比较值和更新值分别进入中断,比较值中断负责开启定时器2PWM,更新值中断负责关闭。

定时器2:

    TIM_TimeBaseInitTypeDef  TIM_TimeStructure;
    TIM_OCInitTypeDef   TIM_OCStructure;
    GPIO_InitTypeDef  GPIO_InitStructure;    //定义IO口模式,并初始化IO口
    
    RCC_APB2PeriphClockCmd(Main_TIM_CLK,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_TIM9);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    TIM_TimeStructure.TIM_Period = Main_Time-1;
    TIM_TimeStructure.TIM_Prescaler = Main_TIM_Prescaler;
    TIM_TimeStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM9,&TIM_TimeStructure);

    TIM_OCStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OCStructure.TIM_Pulse = Main_Time*0.5;
    //TIM_OCStructure.TIM_Pulse = 100;
    TIM_OC1Init(TIM9,&TIM_OCStructure); 
  
    TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);//使能预装载值处理器
    TIM_ARRPreloadConfig(TIM9, ENABLE);//使能ARPE位

    TIM_Cmd(TIM9,ENABLE);

中断服务函数:

void TIM1_UP_TIM10_IRQHandler(void)  
{
    if(TIM_GetITStatus(TIM10,TIM_FLAG_Update)!=RESET)
    {
        TIM_ClearITPendingBit(TIM10, TIM_FLAG_Update); //清除中断标志位
        TIM_SetCompare1(TIM9,50);
    }
    if (TIM_GetITStatus(TIM10, TIM_FLAG_CC1)!=RESET)
    {
        TIM_ClearITPendingBit(TIM10, TIM_FLAG_CC1); 
      TIM_SetCompare1(TIM9,0);
    }
        
} 

2、定时器同步方式

原理:

stm32定时器从内部就连接到一起,可以查询芯片参考手册获取主从定时器分配信息。如图查询结果:
stm32输出固定数量脉冲,stm32,单片机,嵌入式硬件
本例中设置TIM9为从定时器,TIM10为主定时器,采用门控方式输出
因此设置TIM9为ITR2模式,TIM_SlaveMode_Gated门控
通过定时器 10 的输出比较来使能定时器 9。 仅当定时器 10的 OC1REF 为高电平时,定时器 9 才根据分频后的内部时钟进行计数。
如图所示:
stm32输出固定数量脉冲,stm32,单片机,嵌入式硬件
stm32输出固定数量脉冲,stm32,单片机,嵌入式硬件
其中第一中为复位,第二中为门控,这两种较为常用

主要程序:

主定时器:

static void TIM10_TimeConfig(u16 TIM_Time,double TIM_duty)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeStructure;
    TIM_OCInitTypeDef   TIM_OCStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    //引脚复用
   GPIO_PinAFConfig(GPIOF, GPIO_PinSource6, GPIO_AF_TIM10);
   GPIO_Init(GPIOF,&GPIO_InitStructure); 

    //时基单元
    RCC_APB2PeriphClockCmd(Major_TIM_CLK,ENABLE);
    TIM_TimeStructure.TIM_Period = TIM_Time-1;
    TIM_TimeStructure.TIM_Prescaler = Major_TIM_Prescaler;
    TIM_TimeStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM10,&TIM_TimeStructure);


    //占空比设置
    TIM_OCStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
    TIM_OCStructure.TIM_Pulse = TIM_duty*TIM_Time;
    TIM_OCStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OC1Init(TIM10, &TIM_OCStructure); 

    TIM_OC1PreloadConfig(TIM10, TIM_OCPreload_Enable);//使能预装载值处理器
    TIM_ARRPreloadConfig(TIM10, ENABLE);//使能ARPE位
    TIM_ITConfig(TIM10,TIM_FLAG_CC1,ENABLE);

    //定时器主模式设置
    TIM_SelectMasterSlaveMode(TIM10, TIM_MasterSlaveMode_Enable);//开启 Master/Slave 模式 
    TIM_SelectOutputTrigger(TIM10,TIM_TRGOSource_Update);

    TIM_Cmd(TIM10,ENABLE);
    
}

从定时器:

static void TIM9_TimeConfig(u16 Main_Time)
{
    //时基单元
    TIM_TimeBaseInitTypeDef  TIM_TimeStructure;
    TIM_OCInitTypeDef   TIM_OCStructure;
    GPIO_InitTypeDef  GPIO_InitStructure;    //定义IO口模式,并初始化IO口
    RCC_APB2PeriphClockCmd(Main_TIM_CLK,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_TIM9);
   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    TIM_TimeStructure.TIM_Period = Main_Time-1;
    TIM_TimeStructure.TIM_Prescaler = Main_TIM_Prescaler;
    TIM_TimeStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM9,&TIM_TimeStructure);

    TIM_OCStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OCStructure.TIM_Pulse = Main_Time*0.5;
    //TIM_OCStructure.TIM_Pulse = 100;
    TIM_OC1Init(TIM9,&TIM_OCStructure); 

    //定时器从模式设置
    TIM_SelectSlaveMode(TIM9, TIM_SlaveMode_Gated);//允许Slave 模式
    TIM_SelectInputTrigger(TIM9, TIM_TS_ITR2);

    TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);//使能预装载值处理器
    TIM_ARRPreloadConfig(TIM9, ENABLE);//使能ARPE位

    TIM_Cmd(TIM9,ENABLE);
}

结果图:stm32输出固定数量脉冲,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-586768.html

到了这里,关于stm32定时器方式精确输出指定脉冲个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【正点原子STM32连载】第二十一章 高级定时器输出指定个数PWM实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章将介绍使用APM32E103高级定时器输出指定个数的PWM。通过本章的学习,读者将学习到高级定时器重

    2024年02月21日
    浏览(46)
  • STM32系统滴答定时器SysTick实现精确ms和us延时

    时间记录:2023/12/11 一、时间的计算 STM32F103C8T6单片机为例,系统时钟为72MHz,则一个时钟周期为(1/72M)秒,即1/72us 二、寄存器介绍 (1)CTRL控制及状态寄存器 位段 名称 描述 16 COUNTFLAG 当计数到0时,该位置为1,当读取该位时,自动清零 2 CLKSOURCE 值为0时选择外部时钟源,值为

    2024年01月24日
    浏览(37)
  • 定时器详解 -- 定时器中断、PWM输出 --stm32

    STM32F103系列芯片拥有多种定时器,包括基本定时器、通用定时器和高级定时器,每种定时器都具有一些特定的功能。 向上计数:计数器从0计数到自动重装载值(ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数:计数器从自动重装载值(ARR)开始向下计数

    2024年02月11日
    浏览(51)
  • STM32定时器输出PWM脉冲

    一、什么是PWM脉冲? PWM (Pulse Width Modulation) 脉冲宽度调制,通常应用于惯性系统中,( 不是不能即停的设备,因为如果设备不具有关心,那么运动是断断续续的,不具有连续性 ),通过脉宽调节输出不同的波形作用域受控对象。 二、 PWM中三个重要的参数 1.频率=1/Ts ;这个很

    2024年02月15日
    浏览(44)
  • STM32TIM定时器PWM输出比较(适用于通用,高级定时器)

    在定时器中我们最常用的功能就是输出PWM,大多是用在电机控制方面,目前网络上相关资料也有很多,但是,很多不利于我们“现搜现用”我这里不是说我写的有多好,而是你搜索到此类文章时大部分是急于解决目前的问题,一段相关代码和讲解就行,当然不是学习背后的原

    2024年01月25日
    浏览(46)
  • STM32——高级定时器输出比较模式实验

    1,配置定时器基础工作参数 HAL_TIM_OC_Init() 2,定时器PWM输出MSP初始化 HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等 3,配置PWM模式/比较值等 HAL_TIM_OC_ConfigChannel() 4,使能通道预装载 __HAL_TIM_ENABLE_OCxPRELOAD() 5,使能输出、主输出、计数器 HAL_TIM_OC_Start() 6,修改捕获/比较寄存器的值 _HAL

    2024年02月02日
    浏览(43)
  • 【江科大】STM32:(超级详细)定时器输出比较

    输出比较单元 名词解释 IC input capture 输入捕获 OC outpucompare 输出比较 CC capture compare 输入捕获和输出比较的单元 OC(Output Compare)输出比较 :用来输出PWM波形 特点 输出比较可以通过比较CNT(计数器)与CCR(捕获/比较)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作

    2024年01月23日
    浏览(38)
  • STM32F1定时器-PWM输出

    STM32 PWM工作过程 ARR寄存器决定PWM周期,CCR寄存器决定占空比 通道1为例 的PWM输出电路图 CCR1:捕获比较(值)寄存器(x =1,2,3,4):设置比较值。 CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】 或者PWM模式2【111】 CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平

    2024年02月09日
    浏览(73)
  • STM32:TIM定时器输出比较(OC)

    一、输出比较简介 1、输出比较 OC(Output Comapre)输出比较 输出比较可以通过比较CNT(时基单元)和CCR(捕获单元)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率的占空比的PWM波形(CC是捕获/比较的意思,R是Register,寄存器的意思),这个捕获

    2024年02月05日
    浏览(47)
  • STM32使用CubeMx配置定时器输出PWM

            项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。         本文档的行文结构如下,首先,说明实际需

    2024年02月03日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包