stm32的定时器输入捕获与输出比较
stm32定时器原理
stm32定时器原理STM32定时器是一种非常重要的硬件模块,能够实现精确的时间控制和周期性操作。
本文将介绍STM32定时器的原理,包括定时器的基本功能、定时器的分频器、定时器的计数器、定时器的中断、定时器的输出比较和定时器的输入捕获等。
首先介绍定时器的基本功能,STM32定时器可以产生一个特定的周期性信号,在一定的时间间隔内产生触发事件,例如控制LED闪烁、蜂鸣器发声等等。
此外,定时器还可以通过设定特定的计数值来实现定时功能,如延时、计时器等等。
其次介绍定时器的分频器,STM32定时器的分频器可以设置定时器的工作频率,通常是通过将系统时钟分频来实现。
分频器的设置可以通过修改寄存器的值来实现,通常是通过设置预分频器和分频器来实现。
接着介绍定时器的计数器,STM32定时器的计数器是用来记录分频器的计数值,通过相应的计数值来确定定时器的工作周期。
定时器的计数器可以在特定的条件下自动重置或停止,以实现特定的计时或延时功能。
然后介绍定时器的中断,STM32定时器的中断可以在定时器计数器达到特定的值时触发,然后执行中断服务程序。
在中断服务程序中可以实现特定的操作,例如控制IO口状态、改变定时器的工作频率等。
接下来介绍定时器的输出比较,STM32定时器的输出比较可以将定时器的输出信号与预设的比较值进行比较,以实现特定的操作。
例如可以控制LED的亮度、PWM信号、电机控制等等。
最后介绍定时器的输入捕获,STM32定时器的输入捕获可以在外部信号产生时捕获定时器的计数值,可以用于测量脉冲宽度、频率等等。
定时器的输入捕获通常需要设置定时器的捕获模式和捕获通道等参数。
综上所述,STM32定时器是一种非常重要的硬件模块,应用广泛,我们需要充分理解其原理和应用,以实现精确的时间控制和周期性操作。
stm32 timer 用法
stm32 timer 用法摘要:1.引言2.STM32定时器简介3.STM32定时器工作原理4.STM32定时器配置与使用5.STM32定时器应用实例6.总结正文:1.引言STM32是一款广泛应用于嵌入式系统的微控制器,拥有丰富的外设资源。
其中,定时器(Timer)是STM32外设中非常关键的部分,它在系统时钟、输入捕捉、输出比较、PWM等功能中起着举足轻重的作用。
本文将详细介绍STM32定时器的用法。
2.STM32定时器简介STM32定时器主要包括基本定时器(Basic Timer)、高级定时器(Advanced Timer)和看门狗定时器(Watchdog Timer)。
其中,基本定时器主要用于系统时钟的生成和控制;高级定时器具有更多的功能,如输入捕捉、输出比较、PWM等;看门狗定时器用于检测系统的运行状态,防止系统崩溃。
3.STM32定时器工作原理STM32定时器的工作原理主要基于计数器、预分频器和比较器。
计数器用于记录定时器滴答(Tick)的数量;预分频器用于控制定时器滴答频率;比较器用于产生定时器溢出信号。
当定时器溢出时,定时器硬件会自动产生中断,通过编程可以设置相应的中断处理程序,实现特定功能。
4.STM32定时器配置与使用配置STM32定时器主要包括以下步骤:(1)使能定时器:通过设置相应寄存器位,使能定时器;(2)配置定时器工作模式:根据需求选择定时器工作模式,如计数模式、PWM模式等;(3)配置定时器时钟源:选择定时器时钟源,如内部时钟、外部时钟等;(4)配置定时器预分频器:设置定时器预分频器值,以满足定时器滴答频率要求;(5)配置比较器:设置比较器值,以产生定时器溢出信号;(6)配置中断:根据需求配置定时器中断,如使能中断、设置优先级等。
5.STM32定时器应用实例以下是一个简单的STM32定时器应用实例:使用STM32F103C8T6微控制器实现一个LED闪烁的程序。
(1)配置定时器:使能定时器TIM2,设置工作模式为计数模式,时钟源为内部时钟,预分频器值为72000,比较器值为65536。
基于STM32CubeMX配置PWM输出和输入捕获
基于STM32CubeMX配置PWM输出和输⼊捕获PWM输出和输⼊捕获1、试验⽬标 1.输出2路PWM脉冲信号 2.捕获1路PWM脉冲信号 本次试验会使⽤到2个定时器,⼀个⾼级定时器⽤于脉冲捕获,⼀个普通定时器⽤于PWM脉冲输出。
2、准备材料 1. STM32F103C8 2. STM32CubeMX2、STM32CubeMX配置 2.1时钟树 系统时钟为72M,APB1 和APB2 的定时器时钟都为72MHZ。
2.2 PWM输出配置 PWM的输出配置⽐较简单,这⾥我们使⽤到了TIM2普通定时器控制输出,具体参数如下图。
在 Parameter Settings 页配置预分频系数为 72-1,计数周期(⾃动加载值)为 10000-1,定时器溢出频率,即PWM的周期,就是72MHz/(71+1)/(9999+1) = 100Hz 2.3 PWM输⼊捕获配置 PWM捕获,本次试验使⽤到了STM32F103C8的⾼级定时器TIM1。
配置如下图。
中断配置勾线这⾥,因为我们需要使⽤中断回调函数来计算频率占空⽐。
2.4 配置中断分组和中断使能2.5串⼝输出2.6⽣成⼯程 这⾥选择分离C.h⽂件,IDE 根据⾃⼰的环境选择,这⾥我使⽤的GUN编译⽅式的IDE所以选择了SW4SEM32。
以上CubeMX的PWM配置就完成了。
配置完毕后,⽣成⼯程打开。
下⾯我们来分析代码和如何使⽤。
3、代码实现 3.1 tim.c 该代码主要配置了Tim1 和Tim2 的相关配置,为什么要这么配置,在接下来的第4⼤点会详细说明。
这⾥主要了解HAL_TIM_IC_CaptureCallback 捕获中断回调函数这⾥函数主要处理计算占空⽐和频率。
/********************************************************************************* @file tim.c* @brief This file provides code for the configuration* of the TIM instances.******************************************************************************* @attention** <h2><center>© Copyright (c) 2021 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* /licenses/BSD-3-Clause********************************************************************************//* Includes ------------------------------------------------------------------*/#include "tim.h"/* USER CODE BEGIN 0 *//// 计算占空⽐时使⽤__IO uint16_t IC2Value = 0;__IO uint16_t IC1Value = 0;__IO float DutyCycle = 0;__IO float Frequency = 0;/* USER CODE END 0 */TIM_HandleTypeDef htim1; // ⾼级定时器捕获PWMTIM_HandleTypeDef htim2; // 普通定时器输出PWM/* TIM1 init function */void MX_TIM1_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_SlaveConfigTypeDef sSlaveConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};htim1.Instance = TIM1;htim1.Init.Prescaler = 72-1;htim1.Init.CounterMode = TIM_COUNTERMODE_UP; /* 计数⽅式上计数 */htim1.Init.Period = 65535; /* 计数器更新上限值 */htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* 采样时钟分频 */htim1.Init.RepetitionCounter = 0; /* 重装值=0 */htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* ⾃动装载值软件使能 */ if (HAL_TIM_Base_Init(&htim1) != HAL_OK) /* 初始定时器 */{Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; /* 内部时钟源 */if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_Init(&htim1) != HAL_OK){Error_Handler();}///选择从模式: 复位模式sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; /* 选择定时器输⼊触发: TI1FP1 */ sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sSlaveConfig.TriggerFilter = 0;if (HAL_TIM_SlaveConfigSynchro(&htim1, &sSlaveConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){Error_Handler();}///IC1捕获上升沿触发 TI1FP1sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}///IC2捕获下降沿捕获 TI1FP2sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}}/* TIM2 init function */void MX_TIM2_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfigOC = {0};htim2.Instance = TIM2;/** htim2.Init.Prescaler 分频计算* 定时器时钟源TIMxCLK = 2 * PCLK1* PCLK1 = HCLK / 2* => TIMxCLK = HCLK/2 = SystemCoreClock / 2 *2=72MHz (APB1)* 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=10KHz* */htim2.Init.Prescaler = 72-1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP; /* 计数⽅式上升沿有效 */htim2.Init.Period = 10000-1; /* 累计 TIM_Period个后产⽣⼀个更新或者中断当定时器从0计数到10000,即为10000次,为⼀个定时周期*/ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; /* 内部时钟源 */if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}if (HAL_TIM_PWM_Init(&htim2) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}///PWM模式配置sConfigOC.OCMode = TIM_OCMODE_PWM1; /* 配置为PWM模式1*/sConfigOC.Pulse = 5000; /* 默认占空⽐为50%*/sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; /* 当定时器计数值⼩于CCR1_Val时为⾼电平*/sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) /* 配置PWM通道*/{Error_Handler();}if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}HAL_TIM_MspPostInit(&htim2); /* 外置GPIO初始化 */}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle){GPIO_InitTypeDef GPIO_InitStruct = {0};if(tim_baseHandle->Instance==TIM1){/* USER CODE BEGIN TIM1_MspInit 0 *//* USER CODE END TIM1_MspInit 0 *//* TIM1 clock enable */__HAL_RCC_TIM1_CLK_ENABLE(); /*定时器时钟使能*/__HAL_RCC_GPIOA_CLK_ENABLE(); /*GPIO时钟使能*//**TIM1 GPIO ConfigurationPA8 ------> TIM1_CH1*/GPIO_InitStruct.Pin = GPIO_PIN_8; /* 36脚的F103 不能改变引脚编号*/GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /* 输⼊模式*/GPIO_InitStruct.Pull = GPIO_NOPULL; /* ⽆上下拉*/HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* TIM1 interrupt Init */HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0); /* 配置中断分组*/HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); /* 使能中断*//* USER CODE BEGIN TIM1_MspInit 1 *//* USER CODE END TIM1_MspInit 1 */}else if(tim_baseHandle->Instance==TIM2){/* USER CODE BEGIN TIM2_MspInit 0 *//* USER CODE END TIM2_MspInit 0 *//* TIM2 clock enable */__HAL_RCC_TIM2_CLK_ENABLE();/* USER CODE BEGIN TIM2_MspInit 1 *//* USER CODE END TIM2_MspInit 1 */}}void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle){GPIO_InitTypeDef GPIO_InitStruct = {0};if(timHandle->Instance==TIM2){/* USER CODE BEGIN TIM2_MspPostInit 0 *//* USER CODE END TIM2_MspPostInit 0 */__HAL_RCC_GPIOA_CLK_ENABLE();/**TIM2 GPIO ConfigurationPA0-WKUP ------> TIM2_CH1PA1 ------> TIM2_CH2*/GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; /* 这⾥定义了2路PMW输出⽤PA0 和PA1*/ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN TIM2_MspPostInit 1 *//* USER CODE END TIM2_MspPostInit 1 */}}void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle){if(tim_baseHandle->Instance==TIM1){/* USER CODE BEGIN TIM1_MspDeInit 0 *//* USER CODE END TIM1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_TIM1_CLK_DISABLE();/**TIM1 GPIO ConfigurationPA8 ------> TIM1_CH1*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8);/* TIM1 interrupt Deinit */HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);/* USER CODE BEGIN TIM1_MspDeInit 1 *//* USER CODE END TIM1_MspDeInit 1 */}else if(tim_baseHandle->Instance==TIM2){/* USER CODE BEGIN TIM2_MspDeInit 0 *//* USER CODE END TIM2_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_TIM2_CLK_DISABLE();/* USER CODE BEGIN TIM2_MspDeInit 1 *//* USER CODE END TIM2_MspDeInit 1 */}}/* USER CODE BEGIN 1 *//*** @brief Conversion complete callback in non blocking mode 捕获回调函数* @param htim : hadc handle* @retval None*/void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){/* 获取输⼊捕获值 */IC1Value = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);IC2Value = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_2);if (IC1Value != 0){/* 占空⽐计算 */DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);/* 频率计算 */Frequency = 72000000/72/(float)(IC1Value+1);}else{DutyCycle = 0;Frequency = 0;}}}/* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/3.2 main.c ⽤于计算的变量//计算占空⽐时的全局表变量extern __IO uint16_t IC2Value;extern __IO uint16_t IC1Value;extern __IO float DutyCycle;extern __IO float Frequency; 使能和输出PWM/// 使能捕获/⽐较2中断请求HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);/// 开始输出PWMHAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); 打印调试输出while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printSwo("IC1Value =",IC1Value,LINE_FEED_EN);printSwo("IC2Value =",IC2Value,LINE_FEED_EN);printSwo("占空⽐:",DutyCycle,LINE_FEED_EN);printSwo("频率:",Frequency,LINE_FEED_EN);HAL_Delay(500);}3.3 输出结果短接任意⼀路输出 PA0与PA8 PWM输出与捕获,或 PA1与PA8 PWM输出与捕获。
关于定时器的单脉冲输出模式应用
关于定时器的单脉冲输出模式应用
单脉冲输出模式是定时器比较输出应用中的一种特殊情况或者特殊应用,是一种特殊的PWM输出模式。
既然这么说,要想了解单脉冲模式话题,我们就有必要先对比较输出功能,尤其是PWM输出模式有所了解。
比较输出【Compare Output】功能:定时器通过对预设的比较值与计数器的值做匹配比较之后,依据比较结果结合相应的输出模式从而实现各类输出。
如PWM输出、电平翻转、单脉冲输出、强制输出等。
一般来讲,STM32的通用定时期和高级定时器都具有输入捕获、比较输出功能,不同的定时器可能通道数量上有差异。
这里提到的比较值就是指放在CCR寄存器中的值,计数器的值当然就是CNT寄存器的值。
一般来讲,在计数过程中,CNT寄存器的值往往是连续动态变化并呈现周期性,其变化规律跟我们设置的计数器的计数模式有关,比如向上计数模式、向下计数模式或者中心对齐计数模式等。
这里的比较结果无非三种情况:
图[1]
①CCR = CNT ②CCR > CNT ③CCR
图[2]
结合上表我们不难看出:
强制输出模式;无视比较结果,直接根据配置指令输出相应电平;
匹配输出模式:只关注CCR=CNT值的时候,做相应电平的输出;
PWM输出模式:根据CCR是小于CNT还是CCR不小于CNT的比较结果做不同的输出;[各种模式输出特性细节可以看看上面表格】
比较输出的大致流程以及几个术语【OCxREF 、OCx 、输出极性】
图[3]
上面提到的输出信号,其中多次提到有效信号,无效信号,是指比较输出控制器输出的信。
STM32高级定时器、通用定时器TIMx、基本定时器TIM6和TIM7的区别
STM32高级定时器、通用定时器TIMx、基本定时器
TIM6和TIM7的区别
TIM1 和TIM8 定时器的功能包括:●16 位向上、向下、向上/下自动装载计数器●16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535 之间的任意数值●多达4 个独立通道:─输入捕获─输出比较─PWM 生成(边缘或中间对齐模式) ─单脉冲模式输出●死区时间可编程的互补输出●使用外部信号控制定时器和定时器互联的同步电路●允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器●刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态●如下事件发生时产生中断/DMA:─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─输入捕获─输出比较─刹车信号输入●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理TIMx 主要功能通用TIMx (TIM2、TIM3、TIM4 和TIM5)定时器功能包括:●16 位向上、向下、向上/向下自动装载计数器●16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536 之间的任意数值●4 个独立通道:─输入捕获─输出比较─PWM 生成(边缘或中间对齐模式) ─单脉冲模式输出●使用外部信号控制定时器和定时器互连的同步电路●如下事件发生时产生中断/DMA:─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─输入捕获─输出比较●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理TIM6 和TIM7 定时器的主要功能包括:。
stm32的tim计算脉冲频率低频溢出问题
stm32的tim计算脉冲频率低频溢出问题(实用版)目录1.引言2.STM32 的 TIM 功能介绍3.计算脉冲频率的方法4.低频溢出问题的出现5.解决低频溢出问题的方法6.总结正文1.引言随着科技的发展,单片机技术也在不断进步。
STM32 作为一款性能优异的单片机,在各个领域都有广泛应用。
其中,定时器(TIM)是 STM32 中一个重要的功能模块,可以实现对输入信号的捕获和计数,进而计算脉冲频率。
然而,在实际应用中,可能会遇到低频溢出问题,影响脉冲频率的准确计算。
本文将针对这一问题进行分析,并提出相应的解决方案。
2.STM32 的 TIM 功能介绍STM32 的 TIM 功能主要包括输入捕获、输出比较和 PWM 控制等。
其中,输入捕获功能可以实现对输入信号的实时监测,并根据设定的阈值产生相应的中断或触发事件。
通过使用 TIM 输入捕获功能,可以实现对脉冲信号的频率和占空比的测量。
3.计算脉冲频率的方法在 STM32 中,可以通过 TIM 输入捕获功能计算脉冲频率。
具体步骤如下:1) 配置 TIM 通道,使它能够捕获输入信号。
2) 设置 TIM 通道的触发条件,例如:双触发或单触发。
3) 在 TIM 中断服务函数中,读取捕获到的脉冲次数。
4) 根据捕获到的脉冲次数和捕获间隔时间,计算脉冲频率。
4.低频溢出问题的出现在计算脉冲频率时,可能会遇到低频溢出问题。
这是因为当输入信号的频率过低时,TIM 计数器可能无法在规定时间内完成计数,导致脉冲频率计算不准确。
这种情况下,TIM 计数器可能会出现溢出,影响脉冲频率的测量结果。
5.解决低频溢出问题的方法为了解决低频溢出问题,可以采取以下措施:1) 调整 TIM 计数器的时钟源,选择一个频率更高的时钟源,以提高计数速度。
2) 延长 TIM 计数器的计数时间,以便在低频信号下也能完成计数。
3) 增加 TIM 通道的数量,以便同时捕获多个脉冲信号,提高信号检测的准确性。
STM32定时器定时时间配置总结
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
STM32F4通用定时器详细讲解
15 TIM3捕获/比较寄存器3 (TIM3_CCR3)
16 TIM3捕获/比较寄存器4 (TIM3_CCR4)
1 Timer3用来做定时中断
与之相关的时基单元寄存器有
10 TIM3计数器(TIM3_CNT)
11 TIM3预分频器(TIM3_PSC)
1TIM3控制寄存器1 (TIM3_CR1)
ቤተ መጻሕፍቲ ባይዱ作用:1使能自动重载TIM3_ARR
2定时器的计数器递增或递减计数。
3事件更新。
4计数器使能
2TIM3控制寄存器2 (TIM3_CR2)
3TIM3从模式控制寄存器(TIM3_SMCR)
4TIM3DMA/中断使能寄存器(TIM3_DIER)
作用:1:使能事件更新中断
定时器时钟上文已经讲了,由于Timer3挂在APB1总线上
故Timer3进入中断的周期为(CK_PSC+1)*(TIM3_ARR+1)/84000000秒
频率为84000000/[(CK_PSC+1)*(TIM3_ARR+1)] Hz
利用官方库函数实现每500ms进入中断,改变LED灯的电平,程序如下
3:外部时钟模式2:外部触发输入TIMx_ETR,仅适用于TIM2、TIM3、TIM4,TIM3,对应着PD2引脚
4:内部触发输入:一个定时器触发另一个定时器。
时钟源可以通过TIMx_SMCR相关位进行设置。这里我们使用内部时钟。
定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK,故当APBx_Prescaler不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK,定时器时钟等于HCLK。
stm32 计数器模式——输出比较模式强置输出模式PWM输入模式输入捕获模式
输入捕获模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\InputCaptur e在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。
当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
PWM输入模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input该模式是输入捕获模式的一个特例例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)●选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。
●选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿有效)。
●选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。
●选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。
●选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。
●配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。
●使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。
由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。
通用定时器的定时与比较输出(PWM)
通⽤定时器的定时与⽐较输出(PWM)定时器的基本组成STM32的定时器1、基本定时器基本定时器:TIM6 和 TIM7基本定时器基本上只有定时功能。
基本定时器TIM6和TIM7各包含⼀个16位⾃动装载计数器,由各⾃的可编程预分频器驱动。
预分频器分频之后的 “计数频率” ,给计数器提供时钟,计数器从0开始计数,计数到重装值时,从0再次开始计数。
通⽤定时器通⽤定时器:TIM2、3、4、5在定时的功能上,输⼊捕获、输出⽐较输⼊捕获:可以⽤来检测IO上电平变化之间的时间间隔。
输出⽐较:可以⽤来控制IO输出电平⾼低的时间。
PWM、⽤来进⾏编码器的检测⾼级控制定时器⾼级控制定时器:TIM1、TIM8定时功能、输⼊捕获、输出⽐较、死区时间的控制、互补PWM输出⼀般我们会⽤于的电机控制:电桥电路电机STM32F103R8 ⾼级控制定时器:1个; 通⽤定时器:3个STM32通⽤定时器---定时通⽤定时器简介时钟源:外部时钟:输⼊通道上来的电平内部触发输⼊:将另⼀个定时器的作为当前定时器时钟输⼊分频值:可以多少分频:1-65536 216计数器的计数范围216重装载值的范围216向上计数:从0,1,2,3,4 ......装载值 (触发中断)向下计数:装载值.......4,3,2,1,0 (触发中断)时钟源的选择内部时钟如果禁⽌了从模式控制器(TIMx_SMCR寄存器的SMS=000),则CEN、 DIR是事实上的控制位,并且只能被软件修改。
只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。
所以说,只要不开启从模式,使能CEN位,时钟源就是内部时钟源;也就是72MHz。
stm32f103C8的通⽤定时器时钟AHB的时钟选择是72MHz,APB1的分频是2分频,APB1的时钟是36MHz。
APB1的分频是2分频,所以TIMx_CLK的时钟源频率是 36*2 = 72MHz。
分频系数的设置预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
STM32通用定时器
STM32的定时器功能很强大,学习起来也很费劲儿.其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER做个剖析。
实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用……TIMER主要是由三部分组成:1、时基单元。
2、输入捕获。
3、输出比较。
还有两种模式控制功能:从模式控制和主模式控制。
一、框图让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了…为了方便的看图,我对里面出现的名词和符号做个注解:TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输入ETRP:分频后的外部触发输入 ETRF:滤波后的外部触发输入ITRx:内部触发x(由另外的定时器触发)TI1F_ED:TI1的边沿检测器。
TI1FP1/2:滤波后定时器1/2的输入TRGI:触发输入 TRGO:触发输出CK_PSC:应该叫分频器时钟输入CK_CNT:定时器时钟。
(定时周期的计算就靠它)TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号xICx:输入比较x ICxPS:分频后的ICxOCx:输出捕获x OCxREF:输出参考信号关于框图还有以下几点要注意:1、影子寄存器。
有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);(详细请参考版主博客/STM32/401461/message.aspx)2、输入滤波机制在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率Fdts来采样N次进行滤波的。
stm32脉冲计数原理
stm32脉冲计数原理一、背景介绍STM32是一款基于ARM Cortex-M内核的32位微控制器,具有高性能和低功耗的特点,广泛应用于工业自动化、智能家居、医疗设备等领域。
脉冲计数是STM32中常用的功能之一,可以用于计算旋转速度、测量距离等。
二、脉冲计数原理脉冲计数是通过对输入信号进行计数来实现的。
在STM32中,可以通过定时器模块来实现脉冲计数功能。
定时器模块包括TIM1-TIM17共17个定时器,在不同的应用场景下可以选择不同的定时器。
三、定时器工作原理定时器是STM32中一个非常重要的外设,它主要用于产生精确的时间延迟和周期性触发事件。
在脉冲计数中,我们主要使用定时器的输入捕获和输出比较功能。
输入捕获:当一个外部信号到达定时器输入引脚时,可以通过设置输入捕获模式来记录当前定时器计数值,并将其保存在寄存器中。
这样就可以实现对信号频率和周期的测量。
输出比较:当定时器计数值与预设值相等时,可以通过设置输出比较模式来触发一个输出信号。
这样就可以实现对信号占空比的测量。
四、脉冲计数实现步骤1. 配置GPIO引脚为定时器输入模式,并连接外部信号源。
2. 配置定时器为输入捕获模式,并设置计数器的时钟源和分频系数。
3. 在中断服务函数中,读取捕获寄存器的值,并进行计算,得出脉冲数量或频率等参数。
4. 根据需要,可以将脉冲数量或频率等参数通过串口或其他方式输出。
五、注意事项1. 在使用定时器时,需要根据具体应用场景选择合适的定时器和工作模式。
2. 在配置GPIO引脚和定时器时,需要仔细查阅STM32的相关手册和数据表,确保配置正确。
3. 在中断服务函数中,需要注意处理溢出情况以及多次触发的问题。
六、总结STM32的脉冲计数功能是一种非常实用的功能,在工业自动化、智能家居等领域有广泛应用。
了解其原理和实现方法对于开发人员来说非常重要。
在使用过程中需要注意各种细节问题,确保系统稳定可靠。
stm32定时器定时器中断PWM输出输入捕获
stm32定时器定时器中断PWM输出输⼊捕获STM32F4 的通⽤定时器包含⼀个 16 位或 32 位⾃动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。
STM32F4 的通⽤定时器可以被⽤于:测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和 PWM)等。
使⽤定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在⼏个微秒到⼏个毫秒间调整。
STM32F4 的每个通⽤定时器都是完全独⽴的,没有互相共享的任何资源。
STM3 的通⽤ TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下⾃动装载计数器(TIMx_CNT),注意: TIM9~TIM14 只⽀持向上(递增)计数⽅式。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
3) 4 个独⽴通道(TIMx_CH1~4, TIM9~TIM14 最多 2 个通道),这些通道可以⽤来作为:A.输⼊捕获B.输出⽐较C. PWM ⽣成(边缘或中间对齐模式) ,注意: TIM9~TIM14 不⽀持中间对齐模式D.单脉冲模式输出4)可使⽤外部信号(TIMx_ETR)控制定时器和定时器互连(可以⽤ 1 个定时器控制另外⼀个定时器)的同步电路。
5)如下事件发⽣时产⽣中断/DMA(TIM9~TIM14 不⽀持 DMA):A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)B.触发事件(计数器启动、停⽌、初始化或者由内部/外部触发计数)C.输⼊捕获D.输出⽐较E.⽀持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不⽀持)F.触发输⼊作为外部时钟或者按周期的电流管理(TIM9~TIM14 不⽀持)下⾯我们介绍⼀下与我们这章的实验密切相关的⼏个通⽤定时器的寄存器(以下均以 TIM2~TIM5 的寄存器介绍, TIM9~TIM14 的略有区别,具体请看《STM32F4xx 中⽂参考⼿册》对应章节)。
深入理解STM32定时器中的输入捕获滤波器
我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话: 1)当滤波器连续采样到 N 次个有效电平时,认为一次有效的输入电平。 2)该数字滤波器实际上是个事件计数器,它记录到 N 个事件后会产生一个输出 的跳变。 例如:当 f(CK_INT) = 72MHz, CKD[1:0] = 01 时,选择 f(DTS) = f(CK_INT)/2 = 36MHz; 而 ETF[3:0] = 0100,则采样频率 f(SAMPLING) = f(DTS) / 2 = 18MHz, N = 6, 此时高于 3MHz 的信号 将被这个滤波器滤除,这样就有效地屏蔽了高于 3MHz 的干扰。 看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下: 问题 1:当滤波器连续采样到 N 次个有效电平时,是输出这个电平?还是输出一 个跳变? 问题 2:当滤波器没有连续采样到 N 次个有效电平时,输出是的什么? 带着这两个问题,我们来分析一下,下面以 TIM3 为例: 首先可以肯定输入捕获过程如下:详细信息见参考手册中的 14.2 节,通用定时 器框图 TIM3_CH1(PA.6) ----> TI1( 外部 信号 ) -------> 输; IC1( 滤波器输出信号 ) -------> 输入捕获 预 分频器 IC1PSC[1:0] ----> 捕获/比较 1 寄存器 CCR1 从上面的过程可以知道, 1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。 2)滤波器和预分频器可软件编程,如果 IC1F[3:0] = 0x0,则滤波器全通,即 TI1 和 IC1 是同一个信号。 借助这两点分析,我假设的滤波器的工作原理是: 问题 1 猜测答案: 当滤波器连续采样到 N 次个有效电平时, 就输出这个有效电平。 问题 2 猜测答案: 当滤波器没有连续采样到 N 次个有效电平时, 再从 0 开始计数, 输出一直保持上一次输出的有效电平。例如:滤波器上一次输出是高电平,本次 连续采样到 N-1 个高低平, 但第 N 是个低电平,那么滤波器仍然保持上次输出的 高电平,并重新开始计数,记录 1 次低电平,如果在其后采样的 N-1 个也是低电 平,此时滤波才输出低电平,于是一个下降沿才出现在 IC1 上。 举例:如果我们产生一个 f = 1MHz 的占空比为 50%的方波信号,滤波器的采样 频率 f(SAMPLING) = 18MHz,那么如果滤波器要想监测的 1MHz 信号,并且滤除 高频干扰,则理论上 N <= 9 , 即 f(SAMPLING) / N >= 2 * f,这让我想起了《信号与系统》中的“奈圭斯 特采样频率”。
STM32定时器输出比较模式
STM32定时器输出比较模式
一、原理
1.设置定时器的分频系数和计数器自动重装载值,确定定时器的计数
范围和计数频率。
2.设置定时器的比较寄存器的值,确定触发事件的时间点。
3.当定时器计数器的值等于比较寄存器的值时,触发比较事件。
4.在比较事件发生时,可以执行一些操作,比如改变输出引脚的电平
状态、产生特定的输出波形、中断处理等。
二、使用方法
1.在STM32芯片的库函数中,需要先初始化相关的定时器和GPIO引脚。
2.设置定时器的分频系数和计数器自动重装载值,确定定时器的计数
范围和计数频率。
3.设置比较寄存器的值,确定触发事件的时间点。
4.配置比较输出通道的模式和极性,确定输出信号的电平状态。
5.编写比较事件的中断处理函数,实现在比较事件发生时的操作。
6.启动定时器计数器,使定时器开始计数。
三、常见应用
1.生成PWM波形:可以通过比较寄存器的值和定时器计数器的值,确
定PWM的周期和占空比,从而生成不同的PWM波形用于控制电机、LED等。
2.声音发生器:可以通过定时器输出比较模式产生不同频率的方波,从而实现声音发生器。
3.定时中断:可以通过比较寄存器的值和定时器计数器的值,实现定时中断。
4.输入捕获:可以通过比较寄存器的值和定时器计数器的值,进行输入捕获,用于测量外部信号的频率、占空比等。
STM32库开发实战指南-M4:32- TIM—高级定时器
2{3if(TIM_GetITStatus(BASIC_TIM,TIM_IT_Update)!=RESET){4LED1_TOGGLE;5TIM_ClearITPendingBit(BASIC_TIM,TIM_IT_Update);6}7}我们在TIM_Mode_Config函数启动了定时器更新中断,在发生中断时,中断服务函数就得到运行。
在服务函数内我们先调用定时器中断标志读取函数TIM_GetITStatus获取当前定时器中断位状态,确定产生中断后才运行RGB彩灯翻转动作,并使用定时器标志位清除函数TIM_ClearITPendingBit清除中断标志位。
主函数代码清单31-6主函数1int main(void)2{34LED_GPIO_Config();56/*初始化基本定时器定时,1s产生一次中断*/7TIMx_Configuration();89while(1){10}11}实验用到RGB彩灯,需要对其初始化配置。
LED_GPIO_Config函数是定义在bsp_led.c文件的完成RGB彩灯GPIO初始化配置的程序。
TIMx_Configuration函数是定义在bsp_basic_tim.c文件的一个函数,它只是简单的先后调用TIMx_NVIC_Configuration和TIM_Mode_Config两个函数完成NVIC配置和基本定时器模式配置。
31.5.3下载验证保证开发板相关硬件连接正确,把编译好的程序下载到开发板。
开始RGB彩灯是暗的,等一会RGB彩灯变为红色,再等一会又暗了,如此反复。
如果我们使用表钟与RGB彩灯闪烁对比,可以发现它是每0.5s改变一次RGB彩灯状态的。
31.6每课一问1.计算基本定时器一次最长定时时间,如果需要使用基本定时器产生100s周期事件有什么办法实现?2.修改实验程序,在保使其每0.5s翻转一次LED1的同时在每10s翻转LED2。
第32章TIM—高级定时器本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。
stm32定时器原理
stm32定时器原理STM32定时器是一种用于计时和计数的重要功能模块,广泛应用于各种嵌入式系统中。
本文将介绍STM32定时器的原理及其应用。
一、STM32定时器的基本原理STM32定时器是基于计数器的工作原理,通过内部时钟源的驱动,实现对计数器的计数和定时功能。
STM32定时器主要有以下几个核心组件:1.1 时钟源:STM32定时器可以选择多种时钟源,如内部时钟、外部时钟或外部时钟源经过分频后的时钟。
时钟源的选择取决于应用的需要和系统的设计。
1.2 预分频器:预分频器用于将时钟源的频率进行分频,以获得更低的计数频率。
预分频器的分频系数可以通过配置来设置,从而满足不同的计数需求。
1.3 自动重装载寄存器(ARR):ARR用于设置定时器的计数周期,即定时器从0开始计数到ARR的值时就会触发中断或产生某种事件。
通过设置ARR的值,可以实现不同的定时功能。
1.4 计数器:计数器是STM32定时器的核心部件,用于进行实际的计数操作。
计数器的位数根据不同型号的STM32芯片而有所不同,常见的有16位和32位两种。
1.5 输出比较单元(OCU):OCU用于产生定时器的输出信号。
可以通过配置OCU的工作模式、比较值和输出极性等参数,实现各种不同的输出功能。
二、STM32定时器的应用STM32定时器广泛应用于各种嵌入式系统中,常见的应用场景包括:2.1 定时中断:通过设置定时器的ARR值和使能中断,可以实现定时中断功能,用于周期性地执行某些任务或操作。
例如,可以利用定时中断来定时采样、定时发送数据或定时更新显示等。
2.2 脉冲计数:通过配置STM32定时器的输入捕获单元(ICU),可以实现对外部脉冲信号的计数。
这在一些需要测量脉冲频率或脉冲宽度的应用中非常有用,如测速仪、计时器等。
2.3 PWM输出:通过配置STM32定时器的输出比较单元,可以实现PWM信号的输出。
PWM信号广泛应用于电机控制、LED调光、音量控制等场景,具有调节精度高、功耗低的特点。
STM32F407通用定时器输入捕获
通用定时器输入捕获通用定时器作为输入捕获的使用。
我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_UP按键输入高电平),通过串口来打印高电平脉宽时间。
输入捕获模式可以用来测量脉冲宽度或者测量频率。
我们以测量脉宽为例,用一个简图来说明输入捕获的原理:如图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2时间,就是我们需要测量的高电平时间。
测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2。
这样,根据定时器的计数频率,我们就可以算出t1~t2的时间,从而得到高电平脉宽。
在t1~t2之间,可能产生N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。
如图所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1的时间长度,即高电平持续时间。
STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。
STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
同时还可以配置捕获时是否触发中断/DMA等。
这里我们用TIM5_CH1来捕获高电平脉宽。
=============================================================================== ====捕获/比较通道(例如:通道 1 输入阶段)=============================================================================== ====接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的x=5)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32的定时器输入捕获与输出比较(2015-09-28 09:26:24)转载▼分类:stm32标签:it明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。
外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。
时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。
输出比较:定时器中计数寄存器在初始化完后会自动的计数。
从bottom计数到top。
并且有不同的工作模式。
另外还有个比较寄存器。
一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。
然后根据不同的工作模式计数寄存器将清零或者计数到top值。
1、朋友,可以解释一下输入捕获的工作原理不?计数寄存器的初值,是自己写进去的吗?我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。
对不?timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不?那输出比较的原理你可以帮我介绍一下不?比较单元的值是人为设进去的吧?上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了”设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?定时器1的输出比较模式怎么用。
利用这个功能输出一个1KHZ,占空比为10%的程序怎么写啊?求高人指点调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。
我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。
然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。
理论上应该是行的通的。
刚开始俺使用的是TIM2的123通道,TIM4的2通道来进行频率的测量。
由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了(刚好4个通道了)。
请看一开始的程序,以TIM2的1,3通道为例子(2通道设置方法一样):TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP; //配置为输入捕获模式TIM_ICInitStructure.TIM_Channel =TIM_Channel_1; //选择通道1TIM_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(TIM2, &TIM_ICInitStructure); //TIM2通道1配置完毕TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; //配置为输入捕获模式TIM_ICInitStructure.TIM_Channel =TIM_Channel_3; //选择通道3TIM_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(TIM2, &TIM_ICInitStructure); //TIM2通道3配置完毕以上是输入捕获配置还需要做的工作就是(参考stm32参考手册的TIM的结构框图):TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主从模式选择这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。
这就是3 通道上的数据不停跳动的原因,要想得到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。
有以上可以得到:stm32的TIM2的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到:通道1TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIMx->CRR1的值即为信号的周期通道2:TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIMx->CRR2的值即为信号的周期STM32的定时器外设功能强大得超出了想像力,STM32一共有8个都为16位的定时器。
其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器。
这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,都是专门为工控领域量身订做的。
基本定时器:具备最基本的定时功能,下面是它的结构:我们来看看它的启动代码:void TIM2_Configuration(void){ 基本定时器TIM2的定时配置的结构体(包含定时器配置的所有元素例如:TIM_Period= 计数值)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;设置TIM2_CLK为72MHZ(即TIM2外设挂在APB1上,把它的时钟打开。
)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);设置计数值位1000TIM_TimeBaseStructure.TIM_Period=1000;将TIM2_CLK为72MHZ除以72 = 1MHZ为定时器的计数频率TIM_TimeBaseStructure.TIM_Prescaler= 71;这个TIM_ClockDivision是设置时钟分割,这里不分割还是1MHZ的计数频率TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3) TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;将配置好的设置放进stm32f10x-tim.c的库文件中TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);清除标志位TIM_ClearFlag(TIM2,TIM_FLAG_Update);使能TIM2中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);使能TIM2外设TIM_Cmd(TIM2,ENABLE);}通用定时器:就比基本定时器复杂得多了。
除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。
我们来详细讲解:如何生成PWM脉冲通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。
这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT 为向上计数,而重载寄存器TIMx_ARR(相当于库函数写法的TIM_Period的值N)被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。