PWM输入捕获-测频率
PWM输入捕获学习笔记
2016.4.17PWM 输入 ◆ STM32 输入捕获工作过程(通道1为例)一句话总结工作过程:通过检测TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
● 步骤1:设置输入捕获滤波器(TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1))位 7:4 IC1F :输入捕获 1 滤波器 (Input capture 1 filter)此位域可定义 TI1 输入的采样频率和适用于 TI1 的数字滤波器带宽。
数字滤波器由事件计数器组成,每 N 个事件才视为一个有效边沿:0000:无滤波器,按 fDTS 频率进行采样1000:fSAMPLING=fDTS/8, N=60001: fSAMPLING=fCK_INTN=21001: fSAMPLING=fDTS/8, N=80010: fSAMPLING=fCK_INTN=41010: fSAMPLING=fDTS/16, N=50011: fSAMPLING=fCK_INTN=81011: fSAMPLING=fDTS/16, N=60100: fSAMPLING=fDTS/2N=61100:fSAMPLING=fDTS/16,N=80101: fSAMPLING=fDTS/2N=8 1101: fSAMPLING=fDTS/32,N=50110: fSAMPLING=fDTS/4N=6 1110: fSAMPLING=fDTS/32, N=6 0111: fSAMPLING=fDTS/4N=8 1111: fSAMPLING=fDTS/32, N=8注意:在当前硅版本中,当ICxF[3:0]= 1、 2 或 3 时,将用CK_INT 代替公式中的f DTS。
●步骤2:设置输入捕获极性 (TIMx 捕获/比较使能寄存器(TIMx_CCER))CC1 通道配置为输出:0: OC1 高电平有效1: OC1 低电平有效CC1 通道配置为输入:该位选择是IC1还是IC1的反相信号作为触发或捕获信号00:非反相/上升沿触发10:保留,不使用此配置。
基于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输入模式捕捉4路PWM的周期和占空比
PWM输入模式捕捉4路PWM的周期和占空比PWM(Pulse Width Modulation,脉宽调制)输入模式是指将PWM信号通过输入端口接收,并对其周期和占空比进行捕捉和测量的功能。
在PWM输入模式下,通常可以选择4路PWM输入捕捉模式,即可以同时对4个PWM信号的周期和占空比进行测量。
首先,对于周期的测量,可以通过输入捕捉寄存器(ICR)来实现。
当PWM信号的边沿触发输入捕捉事件时,输入捕捉寄存器会记录当前计数器的值,从而获取到PWM信号的周期。
通过记录两个连续输入捕捉事件的时间差,即可计算出周期。
其次,对于占空比的测量,可以通过输入捕捉寄存器(ICR)和捕捉/比较寄存器(CCR)来实现。
当PWM信号的上升沿触发输入捕捉事件时,输入捕捉寄存器会记录当前计数器的值;当PWM信号的下降沿触发输入捕捉事件时,捕捉/比较寄存器会记录当前计数器的值。
通过获取这两个值的差,即可计算出PWM信号的高电平时间,并通过除以周期得到占空比。
需要注意的是,在进行PWM输入捕捉时,需要先配置相应的引脚为输入模式,并使能输入捕捉功能。
具体配置过程可以参考具体的MCU开发手册或者技术文档。
总结起来,PWM输入模式可以实现对4路PWM信号的周期和占空比的测量,通过配置相关寄存器可以获取PWM信号的周期和占空比,以满足不同的应用需求。
PWM输入模式捕捉4路PWM的周期和占空比
④While(1){}
主程序那三个打印语句我就不讲了,这个都不会,那么你就该补补了。
三、四路PWM程序讲解
TIM3定时器引脚映射到了PC6 PC7 PC8 PC9上了。
四、PWM输入捕捉程序讲解:
①void TIM4_PWMINPUT_INIT(u16 arr,u16 psc)
这个函数我在源码里面已经注释的很清楚了,有几个点需要大家注意
②TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);
这个是选择有效的输入端 ,我这里TIM_TS_TI2FP2选择的PB7,注意:只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。
③TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
2) 原理也讲过了,那么下面就是实战了
一、操作步骤:
①将我的源码从论坛里面下载下来
②用杜邦线将PB7和PC6连接起来
③将编译完成的hex文件下载到开发板
④打开串口调试助手波特率选9600
⑤按下开发板的复位键,OK那么你就能看到串口的打印信息。
⑥用杜邦线依次将PB7和PC7、PB7和PC8、PB7和PC9连接起来,看串口打印不同占空比和相同周期的信息。
这个是配置为PWM输入主从复位模式,就是每次输入端有效电平变化的时候定时器计数器就会硬件上置0
中断函数讲解
第8课-FTM的PWM、输入捕获、正交解码
[跟我学OSKinetis]第8课-FTM的PWM、输入捕获、正交解码Posted on 2013 年11 月18 日 by lpldcnFTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码。
英文全称是FlexTimer Module,你可以理解为高级定时器模块、易用定时器模块等等。
不仅仅在Kinetis 32位处理器中,FTM是个常用的模块,在飞思卡尔的8位处理器中,他也是个常用的模块,只不过名字叫TPM。
FTM会用了,飞思卡尔的其他单片机的FTM、TPM你就都会用了。
在OSKinetis固件库中,我们可以用FTM模块来实现PWM、输入捕获和正交解码等常用功能,借用库函数实现功能不难,难的是理解这些功能怎么用、什么原理才是最重要的,下面我们一一介绍这3个功能。
当然看完本文你就能用寄存器编写FTM的各个功能吗,呵呵,不可能的!否则要那1000多页的技术文档干什么用,但是我希望本文能起到抛砖引玉的功能,在你会用库函数的基础上,对他的内部机制有一个了解。
介绍几个小伙伴(FTM寄存器)要想搞清楚FTM模块,首先我们要介绍几个重要的寄存器给大家,他们就像小伙伴一样,好好利用可以帮大忙呢。
∙FTMx_CNT小朋友(计数器寄存器),他负责喊号(计数)。
∙FTMx_SC小朋友(状态和控制寄存器),他负责……寄存器名字面意思,具体说就是决定CNT小朋友的喊号的快慢(计数频率,包括时钟源的选择和分频系数)。
他还负责其他一些杂事,比如计数溢出、中断使能等等。
∙FTMx_MOD小朋友(模数寄存器),他负责记住一个数字,当CNT小朋友喊道这个数字的时候,他就提醒相关人员干一些事情,比如产生溢出中断标志,比如让CNT重新开始喊号。
∙FTMx_CNTIN小朋友(计数器初始值寄存器),他告诉CNT小朋友哪哪个数开始喊。
∙其中x代表不同的FTM模块的标号,比如MK60D系列单片机,有3个FTM 模块,x就为0~2。
电动机控制中的PWM和测频在C8051中的实现
电动机控制中的PWM和测频在C8051中的实现任玉才李富超(大连海事大学大连 116026)摘要:本文详述了通过C8051单片机的可编程计数器列阵PCA来实现电动机控制中的PWM和测频。
本系统具有广阔的发展前景。
关键词:电动机控制 PWM 测频 C8051 PCAPWM and Measure-Frequency of Motor Based on C8051Ren Yucai; Li Fuchao ( Dalian Maritime University , Dalian 116026 , China)Abstract:This paper particularize the fulfillment of PWM and measure-frequency in motor control by the PCA(Programmable Counter Alignment) of C8051 single-chip microcomputer. This system has a wide development prospection.Keywords:motor control ;PWM;measure-frequency; C8051; PCA1概述 在有刷和无刷直流电动机的控制中,需要使用脉宽调制(PWM)技术,通过调节PWM信号的占空比来实现调速。
因此,PWM波发生器在直流电动机的控制中是不可缺少的。
此外,电动机控制中还经常需要对输出的频率信号进行测频,实现测频的最简单的方法是使用捕捉功能。
C8051单片机的可编程计数器列阵PCA有PWM功能和捕捉功能。
本文将通过介绍PCA功能来说明C8051单片机的PWM和捕捉功能的使用。
图 1 可编程计数器列阵PCA原理图_________________ 收稿日期:2004-03-192 PCA专用定时器/计数器与捕捉/比较模块可编程计数器列阵PCA包含1个16位的定时器/计数器和5个捕捉/比较模块,如图1所示。
PWM输入捕获-测频率
stm32的PWM输入捕获模式一、概念理解PWM输入捕获模式是输入捕获模式的特例,自己理解如下1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。
且IC1 IC2一组,IC3 IC4一组。
并且可是设置管脚和寄存器的对应关系。
2. 同一个TIx输入映射了两个ICx信号。
3. 这两个ICx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)7. 由此可以计算出PWM的时钟周期和占空比了frequency=f(TIM时钟频率)/n。
duty cycle=(高电平计数个数/n),若m为高电平计数个数,则duty cycle=m/n若m为低电平计数个数,则duty cycle=(n-m)/n注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率= TIM时钟频率/65535。
二、程序设计与分析1. 程序概述:选择TIM3作为PWM输入捕获。
IC2设置为上升沿,并设置为有效的触发输入信号。
所以IC2的捕获寄存器捕获PWM周期,IC1的捕获寄存器捕获PWM的高电平周期。
2.程序代码如下:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//GPIO配置PIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//NVIC配置NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道选择TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//输入预分频。
蓝桥杯pwm输入捕获
蓝桥杯pwm输入捕获全文共四篇示例,供读者参考第一篇示例:蓝桥杯是中国面向大学生的著名程序设计大赛,旨在培养学生的算法设计能力和编程实践能力,提高他们在计算机领域的综合素质。
在蓝桥杯比赛中,程序员们经常会遇到各种挑战性的问题,其中涉及到硬件编程的问题也是比较常见的。
蓝桥杯pwm输入捕获就是一个相对复杂的问题,需要程序员对硬件模块进行深入理解和编程实现。
PWM(脉宽调制)是一种用于控制电子设备的技术,可以通过改变脉冲信号的宽度来控制电路的工作状态。
在嵌入式系统中,PWM技术被广泛应用于控制各种电机、灯光等设备,实现精确的控制和调节。
而输入捕获则是一种用于处理外部信号的技术,可以捕获外部信号的特定事件,并记录下对应的时间信息。
蓝桥杯pwm输入捕获问题就是要求参赛选手在给定的硬件平台上实现一个PWM输入捕获模块,能够准确捕获外部PWM信号的周期和脉宽,并输出相应的时间信息。
这个问题涉及到硬件设计、中断处理、定时器配置等多方面的知识,对参赛选手的综合能力提出了很高的要求。
为了解决蓝桥杯pwm输入捕获问题,首先需要对硬件平台进行深入了解。
通常情况下,硬件平台会提供一个PWM模块和一个定时器模块,参赛选手需要对这两个模块进行正确的配置和初始化。
具体来说,需要设置PWM模块的工作模式、频率和占空比,以及定时器模块的计时精度和中断触发条件等。
在硬件配置完成后,还需要编写相应的中断处理函数来处理输入捕获事件。
当外部PWM信号到达时,会触发定时器的中断并调用相应的中断处理函数,将捕获到的时间信息记录下来。
为了保证数据的准确性,还需要考虑中断嵌套、中断优先级和数据保护等问题,确保数据不会丢失或出现错误。
除了硬件配置和中断处理,还需要编写相应的算法来计算PWM信号的周期和脉宽。
通常情况下,可以通过测量两个上升沿之间的时间间隔来计算周期,通过测量一个上升沿和一个下降沿之间的时间间隔来计算脉宽。
在计算过程中,还需要考虑定时器的精度和溢出情况,避免计时器溢出导致数据错误。
pwm输入捕获红外线的原理
pwm输入捕获红外线的原理
PWM(脉冲宽度调制)输入捕获红外线的原理是利用红外线传感
器接收到的红外线信号的变化来改变PWM信号的占空比,从而实现
对红外线信号的捕获和测量。
首先,红外线传感器接收到红外线信号后会产生相应的电信号。
这个电信号的变化会被转换成数字信号,然后通过微控制器或者单
片机的输入捕获功能来捕获这个信号的变化。
在输入捕获模式下,
微控制器或者单片机可以测量PWM信号的高电平或低电平持续的时间,从而计算出红外线信号的频率或者占空比。
接着,根据捕获到的PWM信号的变化,可以得出红外线信号的
频率和占空比。
这些数据可以用来判断红外线信号的强度、距离、
遮挡程度等信息。
通过对PWM信号的捕获和分析,可以实现对红外
线信号的精确测量和控制。
此外,PWM输入捕获红外线的原理也可以应用在红外线遥控器、红外线测距模块、红外线传感器等领域,实现对红外线信号的接收
和处理。
总之,PWM输入捕获红外线的原理是利用红外线传感器接收到的信号来改变PWM信号的占空比,通过微控制器或者单片机的输入捕获功能来捕获和分析这个变化,从而实现对红外线信号的测量和控制。
stm32 pwm输入捕捉模式学习笔记
stm32 pwm输入捕捉模式学习笔记(本文来自:android_chunhui的博客)PWM输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。
你可以开启捕获中断然后在中断处理函数中读出保存的计数值。
主要用于读取pwm的频率和占空比。
与输入捕获不同的是PWM输入模式时,用到两个通道(一般用TIMx_CH1或TIMx_CH2),只给其中一个通道分配gpio时钟即可,另一个在内部使用。
给一个通道分配gpio时钟后,需要设置另一个为从机且复位模式。
(例如使用ch2,ch1就得设置成从机模式)。
当一个输入信号(TI1或TI2)来临时,主通道捕获上升沿,从机捕获下降沿。
假设pwm从低电平开始触发,当上升沿来临时,两个通道TIM_CNT均复位开始计数,下一个下降沿来临,从机读取TIM_CNT中的值,记为CCR1,下一个上升沿来临,主通道读取TIM_CNT的值,记为CCR2。
所以CCR2/f,为pwm周期,倒数即频率。
CCR1/CCR2就是占空比。
下面是pwm捕获模式下的配置:void Tim2_PWMIC_Init(void){TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //***通道选择,通道一为从机TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入预分频。
(stm32f103学习总结)—输入捕获模式
(stm32f103学习总结)—输⼊捕获模式⼀、输⼊捕获介绍 在定时器中断实验章节中我们介绍了通⽤定时器具有多种功能,输⼊捕获就是其中⼀种。
STM32F1 除了基本定时器 TIM6和 TIM7,其他定时器都具有输⼊捕获功能。
输⼊捕获可以对输⼊的信号的上升沿,下降沿或者双边沿进⾏捕获,通常⽤于测量输⼊信号的脉宽、测量 PWM 输⼊信号的频率及占空⽐。
输⼊捕获的⼯作原理⽐较简单,在输⼊捕获模式下,当相应的 ICx 信号检测到跳变沿后,将使⽤捕获/⽐较寄存器(TIMx_CCRx)来锁存计数器的值。
简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发⽣跳变(⽐如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/⽐较寄存(TIMx_CCRx)⾥⾯,完成⼀次捕获。
同时还可以配置捕获时是否触发中断/DMA 等。
下⾯我们以输⼊捕获测量脉宽为例,通过⼀个简图来介绍输⼊捕获的⼯作原理,如图所⽰: 从上图可以看出,t1-t2 时间就是我们需要测量的⾼电平时间,假如定时器⼯作在向上计数模式,测量⽅法是:⾸先设置定时器通道 x 为上升沿捕获,这样在 t1 时刻,就会捕获到当前的 CNT 值,然后⽴即清零 CNT,并设置通道 x 为下降沿捕获,这样到 t2 时刻,⼜会发⽣捕获事件,得到此时的 CNT 值,记为 CCRx2。
根据定时器的计数频率,我们就可以算出 t1-t2 的时间,从⽽得到⾼电平脉宽。
在 t1-t2 时间内可能会出现 N 次定时器溢出,因此我们还需要对定时器溢出进⾏处理,防⽌因⾼电平时间过长发⽣溢出导致测量数据不准。
CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即⾼电平持续时间。
⼆、输⼊捕获配置步骤(1)使能定时器及端⼝时钟,并设置引脚复⽤器映射和引脚模式等 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;(2)初始化定时器参数,包含⾃动重装值,分频系数,计数⽅式等 TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);(3)设置通⽤定时器的输⼊捕获参数,开启输⼊捕获功能 TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);(4)开启捕获和定时器溢出(更新)中断 TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)(5)设置定时器中断优先级,使能定时器中断通道 NVIC初始化库函数是 NVIC_Init()(6)使能定时器 TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);(7)编写定时器中断服务函数 void TIM5_IRQHandle()三、代码举例所要实现的功能是:使⽤TIM5的CH1检测输⼊信号⾼电平脉宽,将检测的⾼电平脉宽时间通过printf函数打印出来,同时让D1指⽰灯不断闪烁表⽰系统正常运⾏。
PWM输入捕获频率
PWM输入捕获频率学习笔记陈宏敏2013-5-251、PWM:脉冲宽度调制,英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
2、STM32的定时器除了TIM6和TIM7。
其他的定时器都可以用来产生PWM输出。
其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。
而通用定时器也能同时产生多达4路的PWM输出,这样STM32最多可以同时产生30路PWM输出!等下我用TIM2的CH2产生一路PWM输出和PWM输入。
3、要使STM32的通用定时器TIMx产生PWM输出,我们会用到3个寄存器,来控制PWM。
这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
(注意,还有个TIMx的ARR寄存器是用来控制pwm的输出频率)。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CCMR2。
TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和CH4。
其次是捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。
最后是捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个输通道CH1~4。
4个寄存器都差不多,说的简单一点,这个寄存器就是用来设置pwm的占空比。
4、具体看STM芯片手册。
TIMx_ARR寄存器的值怎么样来确定PWM的频率?TIM_Period(即是TIMx_ARR寄存器的值)的大小实际上表示的是需要经过TIM_Period次计数后才会发生一次更新或中断。
接下来需要设置时钟预分频数TIM_Prescaler,这里有个公式,我们举例来说明:例如系统频率是72MHz,TIM_Prescaler=71,那么PWM的时钟频率是72MHz/(71+1)=1MHz。
第8课-ftm的pwm、输入捕捉、正交解码
[跟我学OSKinetis]第8课-FTM的PWM、输入捕捉、正交解码Posted on 2021 年11 月18 日 by lpldcnFTM是一个神奇的模块,他能输出PWM,能输入捕捉,能输出比较还能正交解码。
英文全称是FlexTimer Module,你可以理解为高级按时器模块、易用按时器模块等等。
不单单在Kinetis 32位处置器中,FTM是个常常利用的模块,在飞思卡尔的8位处置器中,他也是个常常利用的模块,只不过名字叫TPM。
FTM会用了,飞思卡尔的其他单片机的FTM、TPM你就都会用了。
在OSKinetis固件库中,咱们可以用FTM模块来实现PWM、输入捕捉和正交解码等常常利用功能,借用库函数实现功能不难,难的是理解这些功能怎么用、什么原理才是最重要的,下面咱们一一介绍这3个功能。
固然看完本文你就可以用寄放器编写FTM的各个功能吗,呵呵,不可能的!不然要那1000多页的技术文档干什么用,可是我希望本文能起到抛砖引玉的功能,在你会用库函数的基础上,对他的内部机制有一个了解。
介绍几个小伙伴(FTM寄放器)要想弄清楚FTM模块,首先咱们要介绍几个重要的寄放器给大家,他们就像小伙伴一样,好好利用可以帮大忙呢。
FTMx_CNT小朋友(计数器寄放器),他负责喊号(计数)。
FTMx_SC小朋友(状态和控制寄放器),他负责……寄放器名字面意思,具体说就是决定CNT小朋友的喊号的快慢(计数频率,包括时钟源的选择和分频系数)。
他还负责其他一些杂事,比如计数溢出、中断使能等等。
FTMx_MOD小朋友(模数寄放器),他负责记住一个数字,当CNT 小朋友喊道这个数字的时候,他就提示相关人员干一些事情,比如产生溢出中断标志,比如让CNT从头开始喊号。
FTMx_CNTIN小朋友(计数器初始值寄放器),他告知CNT小朋友哪哪个数开始喊。
其中x代表不同的FTM模块的标号,比如MK60D系列单片机,有3个FTM模块,x就为0~2。
PWM输入捕获(只使用一路定时器通道)
PWM输入捕获(只使用一路定时器通道)PWM(Pulse Width Modulation)输入捕获是一种用于测量外部信号的技术,它基于定时器的工作原理。
在PWM输入捕获中,只使用一路定时器通道来实现信号测量。
下面将详细介绍PWM输入捕获的原理和实现方法。
一、PWM输入捕获原理PWM输入捕获的基本原理是通过测量定时器通道引脚上的高电平脉冲的宽度来计算外部信号的周期和占空比。
通常,定时器会以固定的频率进行计数,并将计数值存储在特定的寄存器中。
当检测到外部信号的上升沿时,定时器开始计数,当检测到下降沿时,定时器停止计数。
停止计数后,可以通过读取定时器寄存器的值获取外部信号的宽度。
通过测量多个周期的宽度,可以计算出信号的周期和占空比。
二、PWM输入捕获的实现方法以下是一种使用单通道定时器实现PWM输入捕获的步骤:1.配置定时器模式和通道首先,需要将定时器配置为输入捕获模式和单通道工作模式。
可以根据具体的硬件平台和需求选择适合的定时器和通道。
2.配置定时器时钟和频率根据需要,设置定时器的时钟源和频率。
定时器的频率应与外部信号的频率匹配或适当倍频。
这样可以确保定时器的计数能够准确地测量外部信号的周期和宽度。
3.配置输入捕获触发源选择合适的外部引脚作为输入捕获触发源,并将其连接到定时器的通道引脚。
通常,触发源可以是外部信号上的上升沿或下降沿。
4.配置中断和寄存器启用定时器的输入捕获中断,并设置适当的中断优先级。
还需要配置定时器寄存器以存储捕获到的计数值。
5.中断服务函数当定时器捕获到外部信号时,会触发定时器的输入捕获中断。
可以编写相应的中断服务函数来处理捕获事件。
在中断服务函数中,可以读取定时器寄存器的值,并进行相应的后续计算和处理。
6.数据处理和应用获取到外部信号的周期和占空比后,可以进行相应的数据处理和应用。
例如,可以将测量结果用于控制系统的反馈控制、信号发生器、信号分析等应用。
7.循环测量根据需要,可以设置定时器为重复测量模式,以定期测量外部信号的周期和占空比。
hal库单定时器pwm输入捕获
hal库单定时器pwm输入捕获【原创版】目录1.介绍 HAL 库单定时器 PWM 输入捕获2.HAL 库单定时器 PWM 输入捕获的工作原理3.HAL 库单定时器 PWM 输入捕获的应用实例4.总结正文一、介绍 HAL 库单定时器 PWM 输入捕获HAL 库是硬件抽象层(Hardware Abstraction Layer)的简称,它是一种软件接口,用于简化嵌入式系统中硬件设备的操作。
在嵌入式系统中,定时器和 PWM(脉冲宽度调制)输入捕获是常见的功能。
本文将介绍如何使用 HAL 库实现单定时器 PWM 输入捕获。
二、HAL 库单定时器 PWM 输入捕获的工作原理1.PWM 原理简介脉冲宽度调制(PWM)是一种模拟控制技术,通过改变脉冲的宽度来控制电机、伺服等设备的转速、位置等参数。
PWM 信号是周期性变化的脉冲信号,其占空比可以表示为高电平持续时间与整个周期的比值。
2.HAL 库单定时器 PWM 输入捕获原理HAL 库提供了一种简化的方式来实现 PWM 输入捕获,用户只需配置好定时器相关参数,HAL 库将自动完成 PWM 输入捕获的操作。
具体原理如下:(1)配置定时器:首先,用户需要根据需求配置好定时器的相关参数,例如:时钟源、计数器模式、预分频等。
(2)启动定时器:配置好定时器参数后,用户需要启动定时器。
此时,定时器开始工作,并将 PWM 输入信号捕获到一个缓存寄存器中。
(3)读取捕获值:定时器捕获到 PWM 信号后,用户可以通过读取缓存寄存器的值来得到 PWM 信号的占空比。
三、HAL 库单定时器 PWM 输入捕获的应用实例以下是一个使用 HAL 库实现单定时器 PWM 输入捕获的简单实例:1.首先,初始化 HAL 库并配置好定时器相关参数。
2.启动定时器,开始捕获 PWM 输入信号。
3.读取缓存寄存器中的值,得到 PWM 信号的占空比。
4.根据占空比计算电机、伺服等设备的状态,实现对其控制。
PWM输入捕获
PWM输入捕获#include "stm32f10x_lib.h"#include "sys.h"#include "delay.h" //延时子函数#include "usart.h"u16 IC1Value;u16 IC2Value;u16 DutyCycle;u16 Frequency;void PWM_Init(u16 arr,u16 psc);void Capture_Init(u16 arr,u16 psc);int main(void){Stm32_Clock_Init(9); //系统时钟设置delay_init(72);//延时函数初始化uart_init(72,9600);PWM_Init(1000,72-1); //不分频。
PWM频率=72000/1440=5Khz Capture_Init(2000,72-1);while(1){Frequency = 1000000/IC1Value;DutyCycle = (IC2Value*100)/IC1Value;//占空比=(IC2Value/IC1Value)*100; printf("Frequency = %d\r\n",Frequency);printf("DutyCycle = %d\r\n",DutyCycle);printf("suqingxiao\r\n");}}//PWM输出初始化//arr:自动重装值//psc:时钟预分频数void PWM_Init(u16 arr,u16 psc){//此部分需手动修改IO口设置RCC->APB2ENR|=1<<0; //RCC->APB1ENR|=1<<2; //TIM4 时钟使能RCC->APB2ENR|=1<<3; //使能PORTB时钟GPIOB->CRL&=0XF0FFFFFF;//PB6 输出GPIOB->CRL|=0X0B000000;//复用功能输出GPIOB->ODR|=1<<6;//PB6 上拉TIM4->ARR=arr;//设定计数器自动重装值TIM4->PSC=psc;//预分频器不分频TIM4->CCMR1|=7<<4; //CH1 PWM2模式TIM4->CCMR1|=1<<3; //CH1 预装载使能TIM4->CCER|=1<<0; //OC1 输出使能TIM4->CR1=0x0080; //ARPE使能TIM4->CR1|=0x01; //使能定时器3TIM4->CCR1 = 500; //占空比初值=1440*50% =720 }void Capture_Init(u16 arr,u16 psc){//此部分需手动修改IO口设置RCC->APB2ENR|=1<<0; //RCC->APB1ENR|=1<<0; //TIM2 时钟使能RCC->APB2ENR|=1<<2; //使能PORTA时钟TIM2->ARR=arr; //设定计数器自动重装值//刚好1msTIM2->PSC=psc; //预分频器,GPIOA->CRL&=0XFFFFFFF0;//PA0 输出GPIOA->CRL|=0X00000004;//复用功能输出GPIOA->ODR|=1<<0;//PA0 上拉TIM2->SMCR|=0x00D4;//TIM2->SMCR|= 1<<5; //MSM=1 主/从模式//TIM2->SMCR|= 5<<4; //TS=101 触发选择//TIM2->SMCR|= 4<<0; //SMS=100 复位模式TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端TIM2->CCMR1|=3<<4; //IC1F=0011配置输入滤波器TIM2->CCER|=0<<1; //CC1P=0 选择有效转换边沿上升沿有效TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中TIM2->CCMR1|=2<<8;//CC2S=10 选择输入端TIM2->CCER|=1<<5; //CC2P=1 选择有交转换边沿下降沿有效TIM2->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中TIM2->DIER|=1<<1; //允许更新捕获中断TIM2->CR1|=0x01; //使能定时器2MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2}//定时器2中断服务程序void TIM2_IRQHandler(void){IC1Value = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位IC2Value = TIM2->CCR2;//读取CCR1也可以清CC2IF标志位TIM2->SR&=~(1<<1);//清除中断标志位}。
pwm输入捕获原理
pwm输入捕获原理PWM(Pulse Width Modulation)是一种通过改变信号的占空比来控制电压或电流的技术。
PWM输入捕获是指通过输入电路捕获并测量PWM信号的参数,如周期、占空比、频率等。
本文将详细阐述PWM输入捕获的工作原理。
首先,PWM信号是由高电平(高电压)和低电平(低电压)组成的周期性信号。
PWM输入捕获的原理就是利用外部硬件电路将这个周期性信号转换成时间间隔或频率。
常用的PWM输入捕获方法有两种:硬件计数器捕获和输入捕获/定时器(IC/Timer)捕获。
1.硬件计数器捕获硬件计数器捕获是指利用计数器来测量PWM信号的周期、占空比或频率。
计数器是一个递增计数的寄存器,在设定的时间基准下进行计数。
当捕获到一个PWM脉冲时,计数器的值就会被保存下来,然后根据这些值计算出具体的PWM参数。
具体步骤如下:1)初始化计数器,设置计数器的初始值为0。
2)设置计数器的时钟源和计数模式。
3)当捕获到一个PWM脉冲时,计数器停止计数,保存当前计数器的值。
4)根据计数器的值计算出PWM信号的参数,如周期、占空比或频率。
2. 输入捕获/定时器(IC/Timer)捕获输入捕获/定时器(IC/Timer)捕获是一种更高级的PWM输入捕获方法,它可以非常精确地测量PWM信号的参数。
这种方法利用了定时器和输入捕获模块来实现。
具体步骤如下:1)初始化定时器和输入捕获模块,设置定时器的时钟源和计数模式。
2)当捕获到一个PWM脉冲时,输入捕获模块记录下捕获脉冲的上升沿或下降沿的时间戳。
3)根据时间戳计算出PWM信号的参数,如周期、占空比或频率。
PWM输入捕获在实际应用中具有广泛的用途。
例如,它可用于测量电机的转速、计算电力质量参数、实现遥控器功能等。
由于能够精确地测量PWM信号的参数,因此PWM输入捕获常常被应用于需要高精度控制的系统中。
需要注意的是,在进行PWM输入捕获时,应根据实际需求选择合适的捕获模式、设置合适的输入电路和调整定时器的参数。
AVR PWM、输入捕捉
6、10位快速PWM脉宽调制波的应用
快速PWM模式可用于产生高频的PWM波形。快速PWM模 式与其他PWM模式的不同之处是其单边斜坡工作方式,计数器 从BOTTOM计到TOP,然后立即回到BOTTOM重新开始。对于 普通的的比较输出模式,输出地引脚OCnx在TCNTn与OCRnx匹 配时置位,在TOP时清零;对于反向比较输出模式,OCRnx的 动作正好相反。由于使用了单边斜坡模式,快速PWM模式的工 作频率比使用双边斜坡的相位修正PWM模式高一倍。此高频操 作特性使得快速PWM模式十分适合于功率调节、整流和DAC应 用。
7、相位频率修正的PWM脉宽调制波的应用
相位与频率修正PWM模式,简称相频修正模式,可以产生高 精度的、相位与频率都准确的PWM波形。在频率不变的情况下与 相位修正模式类似,相频修正PWM模式基于双斜边操作。计数器 重复的从BOTTOM计到TOP,然后又从TOP倒退回BOTTOM。在 一般的比较输出模式下,当计数器往TOP计数时若TCNTn与 OCRnx匹配,OCnx将被置低,而在计数器往BOTTOM计数时 TCNTn与OCRnx匹配,OCnx将被置高。工作于反向输出比较时 则正好相反。与但斜坡操作相比,双斜坡操作可获得的最大频率 要小。但其对称性十分适合于电机控制。
图中:T是PWM波的周期;T1是高电平的脉宽;VCC是高电平 值。当该PWM波通过一个积分器(低通滤波器)后,可以得到 其输出的平均电压为:V=VCC*T1/T式中:T1/T称为PWM波的 占空比。控制调节和改变T1的宽度,即可改变PWM的占空比, 得到不同的平均电压输出。因此,在实际应用中,常利用PWM 波的输出实现D/A转换,调节电压或电流控制改变电机的转速, 实现变频控制等功能。
1、本课重点
PWM脉宽调制波 基于比较匹配输出的脉冲宽度调制PWM 输入捕捉功能 其它功能的简单介绍 10位快速PWM脉宽调制波的应用 相位频率修正的PWM脉宽调制波的应用 输入捕捉功能的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32的PWM输入捕获模式
一、概念理解
PWM输入捕获模式是输入捕获模式的特例,自己理解如下
1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。
且IC1 IC2一组,IC3 IC4一组。
并且可是设置管脚和寄存器的对应关系。
2. 同一个TIx输入映射了两个ICx信号。
3. 这两个ICx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)
7. 由此可以计算出PWM的时钟周期和占空比了
frequency=f(TIM时钟频率)/n。
duty cycle=(高电平计数个数/n),
若m为高电平计数个数,则duty cycle=m/n
若m为低电平计数个数,则duty cycle=(n-m)/n
注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率= TIM时钟频率/65535。
二、程序设计与分析
1. 程序概述:选择TIM3作为PWM输入捕获。
IC2设置为上升沿,并设置为有效的触发输入信号。
所以IC2的捕获寄存器捕获PWM周期,
IC1的捕获寄存器捕获PWM的高电平周期。
2.程序代码如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//时钟配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//GPIO配置
PIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//NVIC配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道选择
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//输入预分频。
意思是控制在多少个输入周期做一次捕获,如果
//输入的信号频率没有变,测得的周期也不会变。
比如选择4分频,
则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,
//可以减少软件被不断中断的次数。
TIM_ICInitStructure.TIM_ICFilter = 0x0;//滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);//根据参数配置TIM外设信息
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//选择IC2为始终触发源
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
TIM_SelectMasterSlaveMode(TIM3,
TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
TIM_Cmd(TIM3, ENABLE);//启动TIM2
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);//打开中断
中断处理函数
void TIM3_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);//清楚TIM 的中断待处理位
IC2Value = TIM_GetCapture2(TIM3);//读取IC2捕获寄存器的值,即为PWM周期的计数值
if (IC2Value != 0)
{
DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value;//读取IC1捕获寄存器的值,并计算占空比
Frequency = 72000000 / IC2Value;//计算PWM频率。
}
else
{
DutyCycle = 0;
Frequency = 0;
}
注(一):若想改变测量的PWM频率范围,可将TIM时钟频率做分频处理
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//周期0~FFFF TIM_TimeBaseStructure.TIM_Prescaler = 5;//时钟分频,分频数为5+1即6分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化
注注(二):定时器TIM的倍频器X1或X2。
在APB分频为1时,倍频值为1,否则为2。