stm32f407 输入捕获两路方波

合集下载

STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获

STM32Cube学习之八:输入捕获假设已经安装好STM32CubeMX和STM32CubeF4支持包。

Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。

Step2. 在Pinout界面下配置晶振输入引脚。

配置TIM2使用内部时钟源,CH1作为输入捕获通道,默认映射到PA0引脚。

配置TIM3使用内部时钟,CH1~CH4为PWM输出通道,默认映射引脚分别为PA6,PA7,PB0,PB1。

配置TIM4使用内部时钟,CH1,CH2为PWM输出通道,映射引脚分别为PD12,PD13。

配置串口,作为信息输出接口。

Step3.在Clock Configuration界面配置时钟源。

使用外部8M晶振作PLL时钟输入,并使用PLL输出作为系统时钟。

为了后面的计算方便,将系统时钟配置成160MHz。

Step4.配置外设参数。

在configuration界面中点击TIM2/ TIM3/ TIM4按钮,可以进入参数配置界面。

TIM2:在Parameter Settings页配置预分频系数为7,其计数时钟就是80MHz/(7+1)=10MHz。

计数周期(自动加载值),转换为十六进制形式,输入32bit最大值0xFFFFFFFF。

注意,TIM2的自动加载寄存器ARR和各个通道的捕获/比较寄存器CCRx都是32bit的。

在NVIC页面使能捕获/比较中断。

在GPIO页面设置捕获输入引脚下拉电阻,设置成上拉也可以,主要是为了使在没有信号输入时在输入引脚上得到稳定的电平。

TIM3:在Parameter页配置预分频系数为7,计数周期(自动加载值)为9999。

其溢出频率就是80MHz/(7+1)/(9999+1)=1kHz,这就是TIM3各通道输出的PWM信号的频率。

各通道输出PWM的占空比参数如上图红框标注,其他参数使用默认值。

按照图中参数,CH1~CH4输出的PWM周期都是1ms,而高电平时间分别是123.4us,234.5us,567.8us,678.9us。

简述stm32f407单片机产生pwm波的原理。

简述stm32f407单片机产生pwm波的原理。

STM32F407单片机产生PWM波的原理是通过利用定时器实现的。

具体来说,PWM(Pulse Width Modulation)脉冲宽度调制是一种利用微处理器的数字输出来对模拟电路进行控制的技术。

在STM32F407单片机中,PWM是通过编程控制输出方波的频率和占空比(高低电平的比例)来实现的。

其中,定时器用于控制PWM的周期,而比较寄存器则用于控制PWM的高低电平比例。

首先,设置定时器的计数周期和预分频器,以确定PWM的周期。

然后,设置比较寄存器的值,以确定PWM的高低电平比例。

当定时器的计数值达到比较寄存器的值时,输出电平会翻转,从而产生PWM波形。

此外,STM32F407单片机还支持多路PWM输出,可以通过配置不同的定时器和比较寄存器来实现。

同时,PWM的输出还可以通过GPIO口输出,以实现与其他电路的交互和通信。

需要注意的是,在使用STM32F407单片机产生PWM波时,需要了解其硬件结构和软件编程方法,以确保正确配置和使用PWM功能。

STM32F407运用总结

STM32F407运用总结

STM32运用总结主要分为IO口,定时器的PWM和QEI,中断,ADC,DAC和DMA介绍。

在STM32的运用中第一步一般是使能相应模块的时钟,然后配置IO 口,最后配置相应的寄存器。

1.IO口STM32的IO口非常多,而且与其它外设模块通常是复用的。

在不同的外设中IO口的设置是不一样的。

这一部分介绍普通的数值IO口。

IO口有A-G共7组,每组16口。

1.IO口在时钟总线AHB1上,使能对应端口的时钟。

在寄存器RCC->AHB1ENR中。

2.配置IO口的模式,普通的IO口配置为普通的输入输出模式。

配置IO口是悬空还是上拉或者下拉。

以上两步分别在寄存器GPIOx->MODER和GPIOx-> PUPDR(x=A,B,C,D,E,F,G)3.其中配置为输出模式时还要设置速度和相应的输出方式,开漏或者推挽,以上两步分别在寄存器GPIOx-> OSPEEDR和GPIOx->OTYPER(x=A,B,C,D,E,F,G)。

4.设置IO口的高低电平。

在寄存器GPIOx->BSRRH中置相应的位为1就是将相应的位置0,在寄存器GPIOx->BSRRL中置相应的位为1就是将相应的位置1.另外还可以设置GPIOx_ODR寄存器来设置输出电平以及读取GPIOx_IDR寄存器来获取输入电平。

2.PWMSTM32的定时器也非常之多,用到的主要是两个部分:用定时器产生PWM和定时触发ADC,这里一部分介绍PWM。

(高级定时器的配置和这差不多,由于在STM32F103里面已经尝试过在STM32F407里面就没有再写)1.配置IO口。

我们说过STM32的外设模块主要是和IO口复用的,因此在使用外设模块时首先配置好相应的IO口。

比如使用A口的PA1作为定时器Timer2的PWM输出。

则应按照如下的步骤来配置PA1。

1)使能A口的时钟。

在寄存器RCC->AHB1ENR中。

2)配置PA1为复用功能。

STM32输入捕获模式

STM32输入捕获模式

STM32输入捕获模式
在输入捕获模式下,定时器将统计外部信号的上升沿或下降沿出现的
时间,并将统计结果保存在相关的寄存器中。

用户可以根据需要选择统计
上升沿还是下降沿,并可以选择计数溢出时是否复位计数器。

1.选择定时器和通道:根据实际需求选择合适的定时器和通道。

一般
来说,每个定时器都有多个通道可以配置为输入捕获模式。

2.配置定时器:根据测量的要求配置定时器的工作模式、计数方向和
预分频系数等。

定时器的配置将影响捕获的精度和测量范围。

3.配置输入捕获:选择捕获触发源,可以选择外部信号引脚或其他定
时器的输出作为触发源。

配置捕获触发源时还可以选择捕获的边沿类型
(上升沿或下降沿)和是否复位计数器。

4.开启定时器:配置完成后,通过使能相关的定时器和通道将输入捕
获模式启用。

5.捕获外部信号:当捕获触发源产生触发信号时,定时器将开始计数,当捕获到外部信号的边沿时,定时器会自动将计数值保存在指定的寄存器中。

6.读取测量结果:根据所选择的定时器和通道,从相关的寄存器中读
取测量结果,可以通过计算得到所需的参数,比如周期、脉宽等。

输入捕获模式在很多应用中都是非常常见且重要的。

例如在测量旋转
编码器的位置和速度时,可以使用输入捕获模式来捕获编码器的A相和B
相信号,并通过计算来确定位置和速度。

此外,输入捕获模式还可以用于
测量外部信号的频率、测量脉冲信号的宽度等。

总之,STM32输入捕获模式是一种功能强大且灵活的功能,能够帮助用户实现对外部信号的精确测量和控制。

通过合理配置和使用,可以满足各种不同的应用需求。

理解STM32定时器中的输入捕获滤波器

理解STM32定时器中的输入捕获滤波器

理解STM‎32定时器‎中的输入捕‎获滤波器关于STM‎32定时器‎中的输入捕‎获滤波器的‎功能描述,在中文参考‎手册中描述‎如下:我不理解官‎方的说明,在网上搜了‎老半天,基本都是下‎面这几句话‎:1)当滤波器连‎续采样到N‎次个有效电‎平时,认为一次有‎效的输入电‎平。

2)该数字滤波‎器实际上是‎个事件计数‎器,它记录到N‎个事件后会‎产生一个输‎出的跳变。

例如:当f(CK_IN‎T) = 72MHz‎, CKD[1:0] = 01时,选择f(DTS) = f(CK_IN‎T)/2 = 36MHz‎;而ETF[3:0] = 0100,则采样频率‎f(SAMPL‎I NG) = f(DTS) / 2 = 18MHz‎, N = 6,此时高于3‎M Hz的信‎号将被这个滤‎波器滤除,这样就有效‎地屏蔽了高‎于3MHz‎的干扰。

看了这些说‎法,我还是不理‎解这个数字‎滤波器到底‎是如何工作‎的,问题如下:问题1:当滤波器连‎续采样到N‎次个有效电‎平时,是输出这个‎电平?还是输出一‎个跳变?问题2:当滤波器没‎有连续采样‎到N次个有‎效电平时,输出是的什‎么?带着这两个‎问题,我们来分析‎一下,下面以TI‎M3为例:首先可以肯‎定输入捕获‎过程如下:详细信息见‎参考手册中‎的14.2节,通用定时器‎框图TIM3_‎C H1(PA.6) ----> TI1(外部信号) -------> 输入滤波器‎I C1F[3:0] -----> IC1(滤波器输出‎信号) -------> 输入捕获预‎分频器IC‎1PSC[1:0] ----> 捕获/比较1寄存‎器CCR1‎从上面的过‎程可以知道‎,1)发生输入捕‎获所需要的‎跳变沿是由‎滤波器输出‎产生的。

2)滤波器和预‎分频器可软‎件编程,如果IC1‎F[3:0] = 0x0,则滤波器全‎通,即TI1 和IC1是同‎一个信号。

STM32F4_TIM输入波形捕获(脉冲频率)

STM32F4_TIM输入波形捕获(脉冲频率)

本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。

在引脚上刚好相反:一个输入、一个输出。

本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。

间隔一定时间读取频率并通过串口打印出来。

当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。

笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。

(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚)先看一下实例的实验现象:关于本文的更多详情请往下看。

Ⅱ、实例工程下载笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号:关注微信,回复“修改型号”)。

STM32F4_TIM输入波形捕获(脉冲频率)实例:https:///cB6XrSi6rK3TP 访问密码STM32F4资料:https:///cR2pxqF5x2d9c 访问密码53e7Ⅲ、原理描述笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。

前面的文章已经将“时基部分”的一些基础知识讲述过了,“时基部分”的功能是比较有用的,它除了可以用来延时(定时)之外,它还可以拿来触发其他一些功能,如:触发DA转换、AD采集等。

上一篇文章讲述的就是图中比较输出部分,比较输出部分功能相对比较简单。

该文主要讲述“输入捕获”部分,这部分输入的通道1与2、通道3与4可以相互协作。

该文只使用了TIM5的通道3,捕获输入信号频率。

stm32f407通用定时器输入捕获

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)。

(完整版)STM32F407运用总结.docx

(完整版)STM32F407运用总结.docx

STM32 运用总结主要分为IO 口,定时器的PWM 和 QEI ,中断, ADC , DAC 和 DMA介绍。

在STM32 的运用中第一步一般是使能相应模块的时钟,然后配置IO 口,最后配置相应的寄存器。

1. IO 口STM32 的 IO 口非常多,而且与其它外设模块通常是复用的。

在不同的外设中设置是不一样的。

这一部分介绍普通的数值IO 口。

IO 口有 A -G 共 7 组,每组IO 口的16 口。

1. IO口在时钟总线AHB1上,使能对应端口的时钟。

在寄存器RCC->AHB1ENR中。

2.配置 IO 口的模式,普通的 IO 口配置为普通的输入输出模式。

配置IO口是悬空还是上拉或者下拉。

以上两步分别在寄存器GPIOx ->MODER 和 GPIOx -> PUPDR(x=A,B,C,D,E,F,G )3.其中配置为输出模式时还要设置速度和相应的输出方式,开漏或者推挽,以上两步分别在寄存器GPIOx -> OSPEEDR 和 GPIOx ->OTYPER (x=A,B,C,D,E,F,G )。

4.设置 IO 口的高低电平。

在寄存器GPIOx - >BSRRH 中置相应的位为 1 就是将相应的位置 0,在寄存器GPIOx ->BSRRL 中置相应的位为 1 就是将相应的位置 1.另外还可以设置GPIOx_ODR 寄存器来设置输出电平以及读取GPIOx_IDR 寄存器来获取输入电平。

2.PWMSTM32 的定时器也非常之多,用到的主要是两个部分:用定时器产生PWM 和定时触发 ADC ,这里一部分介绍PWM 。

(高级定时器的配置和这差不多,由于在STM32F103里面已经尝试过在STM32F407 里面就没有再写)1.配置 IO 口。

我们说过 STM32 的外设模块主要是和 IO 口复用的,因此在使用外设模块时首先配置好相应的 IO 口。

比如使用 A 口的 PA1 作为定时器 Timer2 的 PWM输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

stm32f407 输入捕获两路方波,测下降沿时间间隔2017年08月07日18:49:23 muyepiao1阅读数:1303 标签:stm32f407输入捕获
记录调试过程:
实现方法:用TIM3,TIM4设置为输入捕获(下降沿触发),使能捕获中断,更新事件中断。

有时候两个下降沿间隔时间太久,超过溢出值,所以要开更新中断。

更新中断手册上有讲:
“●发生如下事件时生成中断/DMA 请求:
—更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
—触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
—输入捕获
—输出比较

·(计数器溢出,UDIS =0 ) --- (生成更新事件)--- 生成(更新中断或者DMA 请求)
( URS =0 )
·计数器溢出,生成更新事件,(UDIS =1,禁止更新事件,所以此处还需UDIS =0)
·URS用来设置跟新请求源,就是用来选择哪些行为可以生成更新中断。

此处URS=0;
·开始看手册时,不理解更新事件,其实不懂的时候,应该多看几遍手册,以下为手册原话:
发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR寄存器中的UIF位)置1(取
决于URS位):
●预分频器的缓冲区中将重新装载预装载值(TIMx_PSC寄存器的内容)
●自动重载影子寄存器将以预装载值进行更新
·影子寄存器存在的意义在于同步。

具体可以百度。

在上是初始化设置要注意的地方。

捕获的过程描述,手册有讲,以下为来自手册:
在输入捕获模式下,当相应的ICx 信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx) 来锁存计数器的值。

发生捕获事件时,会将相应的CCXIF 标志(TIMx_SR 寄存器)置1,并可发送中断或DMA 请求(如果已使能)。

如果发生捕获事件时CCxIF 标志已处于高位,则会将重复捕获标志CCxOF(TIMx_SR 寄存器)置1。

可通过软件向CCxIF 写入0 来给
CCxIF 清零,或读取存储在TIMx_CCRx 寄存器中的已捕获数据。

向CCxOF 写入0 后会将
其清零。

要在重复捕获前,读取捕获值。

由于我的输入信号是连续方波信号。

重新开始一次捕获前,一定要清除中断标志位,防止误入中断。

中断处理后,要记得清标志。

清除状态寄存器
以下为TIM3初始化代码。

//捕获功能
void InitBuhuo(void)
{ TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* TIM4 clock enable *///apb1 42mhz max
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//开启定时器时钟
/* GPIOA clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//开启PA6 io口时钟
/* TIM3 chennel1 configuration : PA.6 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //配置io口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; /* 选择复用功能
*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /* 下拉电阻使能
*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect TIM pin to AF */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);
//分频,得到定时器计算频率
//TIM_TimeBaseStructure.TIM_Prescaler=(84 -1); //定时器分频 Fenpin_Xishu = 84 1MHZ 1us
TIM_TimeBaseStructure.TIM_Prescaler=0; // 不分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period= (0xffff); //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化定时器
//初始化TIM3输入捕获参数
TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
// TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
//上升沿捕获
TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //捕获下降沿
TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,
不分频
TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器不滤波
TIM_ICInit(TIM3, &TIM3_ICInitStructure);
/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//开中断前,清中断标志位
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位//允许中断更新中断捕获中断
TIM_ITConfig(TIM3, TIM_IT_Update|TIM_IT_CC1, ENABLE);
// /* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);
}void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件 {
}
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是否发生更新事件 {
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位}。

相关文档
最新文档