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信号的周期和脉宽。
通常情况下,可以通过测量两个上升沿之间的时间间隔来计算周期,通过测量一个上升沿和一个下降沿之间的时间间隔来计算脉宽。
在计算过程中,还需要考虑定时器的精度和溢出情况,避免计时器溢出导致数据错误。
- 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。