stm32f407 输入捕获两路方波
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波的原理是通过利用定时器实现的。
具体来说,PWM(Pulse Width Modulation)脉冲宽度调制是一种利用微处理器的数字输出来对模拟电路进行控制的技术。
在STM32F407单片机中,PWM是通过编程控制输出方波的频率和占空比(高低电平的比例)来实现的。
其中,定时器用于控制PWM的周期,而比较寄存器则用于控制PWM的高低电平比例。
首先,设置定时器的计数周期和预分频器,以确定PWM的周期。
然后,设置比较寄存器的值,以确定PWM的高低电平比例。
当定时器的计数值达到比较寄存器的值时,输出电平会翻转,从而产生PWM波形。
此外,STM32F407单片机还支持多路PWM输出,可以通过配置不同的定时器和比较寄存器来实现。
同时,PWM的输出还可以通过GPIO口输出,以实现与其他电路的交互和通信。
需要注意的是,在使用STM32F407单片机产生PWM波时,需要了解其硬件结构和软件编程方法,以确保正确配置和使用PWM功能。
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输入捕获模式
在输入捕获模式下,定时器将统计外部信号的上升沿或下降沿出现的
时间,并将统计结果保存在相关的寄存器中。
用户可以根据需要选择统计
上升沿还是下降沿,并可以选择计数溢出时是否复位计数器。
1.选择定时器和通道:根据实际需求选择合适的定时器和通道。
一般
来说,每个定时器都有多个通道可以配置为输入捕获模式。
2.配置定时器:根据测量的要求配置定时器的工作模式、计数方向和
预分频系数等。
定时器的配置将影响捕获的精度和测量范围。
3.配置输入捕获:选择捕获触发源,可以选择外部信号引脚或其他定
时器的输出作为触发源。
配置捕获触发源时还可以选择捕获的边沿类型
(上升沿或下降沿)和是否复位计数器。
4.开启定时器:配置完成后,通过使能相关的定时器和通道将输入捕
获模式启用。
5.捕获外部信号:当捕获触发源产生触发信号时,定时器将开始计数,当捕获到外部信号的边沿时,定时器会自动将计数值保存在指定的寄存器中。
6.读取测量结果:根据所选择的定时器和通道,从相关的寄存器中读
取测量结果,可以通过计算得到所需的参数,比如周期、脉宽等。
输入捕获模式在很多应用中都是非常常见且重要的。
例如在测量旋转
编码器的位置和速度时,可以使用输入捕获模式来捕获编码器的A相和B
相信号,并通过计算来确定位置和速度。
此外,输入捕获模式还可以用于
测量外部信号的频率、测量脉冲信号的宽度等。
总之,STM32输入捕获模式是一种功能强大且灵活的功能,能够帮助用户实现对外部信号的精确测量和控制。
通过合理配置和使用,可以满足各种不同的应用需求。
理解STM32定时器中的输入捕获滤波器
理解STM32定时器中的输入捕获滤波器关于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(SAMPLI NG) = f(DTS) / 2 = 18MHz, N = 6,此时高于3M Hz的信号将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。
看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下:问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么?带着这两个问题,我们来分析一下,下面以TIM3为例:首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图TIM3_C H1(PA.6) ----> TI1(外部信号) -------> 输入滤波器I C1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1从上面的过程可以知道,1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。
2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和IC1是同一个信号。
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通用定时器输入捕获
通用定时器输入捕获通用定时器作为输入捕获的使用。
我们用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
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输出。
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。
STM32输入捕获模式
输入捕获模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\I nputCapture在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。
当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
PWM输入模式库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\P WM_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信号。
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为复用功能。
stm32f407教程
stm32f407教程STM32F407是一款32位的ARM Cortex-M4微控制器,由意法半导体(STMicroelectronics)公司推出。
它具有高性能的处理能力和低功耗的特点,因此被广泛应用于很多领域,包括工业自动化、消费电子、通信设备等。
本文将对STM32F407进行介绍,并讲解其使用方法和应用。
首先,我们来了解一下STM32F407的硬件特性。
STM32F407微控制器的主要特点包括:1.2V到3.6V的工作电压,具有16384字节的FLASH存储器和192KB的SRAM,频率高达168MHz,内置了多功能的I/O接口,支持各种外设的连接,如UART、SPI、I2C等。
接下来,我们将介绍STM32F407的软件开发工具。
针对STM32F407微控制器,意法半导体公司提供了一套完整的软件开发环境,包括STM32CubeMX和MDK-ARM两个工具。
STM32CubeMX是一个基于图形界面的配置工具,可以帮助用户生成初始化代码和配置驱动程序,从而简化开发过程。
而MDK-ARM是一款非常流行的集成开发环境,可以用于编写、编译和调试STM32F407的应用程序。
在软件开发过程中,用户可以选择使用C/C++语言进行编程。
STM32F407支持嵌入式实时操作系统(RTOS),如FreeRTOS和RTX等,可以帮助用户实现多任务处理和调度。
此外,用户还可以使用STM32Cube提供的丰富的软件库进行快速开发,如HAL库和LL库等。
除了软件开发环境和编程语言,了解STM32F407的外设驱动也是非常重要的。
STM32F407具有丰富的外设,如GPIO、定时器、PWM、ADC、DAC等。
这些外设可以用来控制和获取各种不同类型的信号,从而实现各种功能,如LED控制、蜂鸣器控制、电机驱动等。
最后,我们将简要介绍一些STM32F407的应用领域。
STM32F407微控制器非常适用于工业自动化领域,可以用来控制各种不同类型的传感器和执行器,实现各种功能,如温度监控、信号采集、机器控制等。
STM32(十八)输入捕获应用
STM32(⼗⼋)输⼊捕获应⽤
输⼊捕获⼀般应⽤在两个⽅⾯:
脉冲跳变沿时间测量
PWM输⼊测量
1、测量频率
当捕获通道TIx.上出现上升沿时,发⽣第⼀次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,⽽且还会进⼊捕获中断,在中断服务程序中记录⼀-次捕获(可以⽤⼀个标志变量来记录),并把捕获寄存器中的值读取到valuel 中。
当出现第⼆次上升沿时,发⽣第⼆次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进⼊捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。
利⽤value3和valuel的差值我们就可以算出信号的周期(频率)。
2、测量脉宽
当捕获通道TIx.上出现上升沿时,发⽣第⼀次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,⽽且还会进⼊捕获中断,在中断服务程序中记录⼀次捕获(可以⽤⼀个标志变量来记录),并把捕获寄存器中的值读取到valuel 中。
然后把捕获边沿改变为下降沿捕获,⽬的是捕获后⾯的下降沿。
当下降沿到来的时候,发⽣第⼆次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进⼊捕获中断,在捕获中断中,把捕获寄存器的值读取到value3 中,并清除捕获记录标志。
然后把捕获边沿设置为上升沿捕获。
在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间⽐较长,定时器就会发⽣溢出,溢出的时候会产⽣更新中断,我们可以在中断⾥⾯对溢出进⾏记录处理。
基于STM32F407的AOTF光谱仪双通道信号检测系统
基于STM32F407的AOTF光谱仪双通道信号检测系统刘祥;曾立波;吴琼水【摘要】The useful light signals detected by the infrared detector of near infrared spectrometer based on AOTF were much smaller than the noise of the light source, and it was easily submerged in strong noise when detected. In order to improve the noise?signal ratio of signal detection system,it was in view of the weak light signal detected by AOTFnear?infrared spectrometer and based on correlation detection principle, STM32F407 was taken as the control core and the lock?in amplifier circuit was taken as the circuit core,a new dual channel signal detection system was designed.At the same time,a new light source modula?tion circuit was designed to communicate and modulate the light source so as to facilitate the detection of post?phase locking.After the system test,the system has high detection accuracy,and can obtain the idea mass diffuse reflection spectrum,and has high system stability. It can be used in AOTFnear?infrared spectrometer.%基于声光可调谐器件(AOTF)原理设计的近红外光谱仪的光电探测器检测到的有用光信号远远小于光源的噪声信号,在检测时容易被淹没在强噪声中.为了提高信号检测系统的信噪比,针对AOTF近红外光谱仪待测的微弱光信号,基于相关检测原理,以STM32F407为控制核心,以锁相放大电路为电路核心,设计了新型双通道信号检测系统.同时设计新型光源调制电路对光源进行交流调制,便于后级锁相检测.经过系统测试验证,该系统检测精度高、可以获得高质量的物质漫反射光谱图、系统稳定性高,可以应用在AOTF近红外光谱仪器中.【期刊名称】《仪表技术与传感器》【年(卷),期】2018(000)004【总页数】5页(P76-80)【关键词】AOTF近红外光谱仪;相关检测;锁相放大电路;双通道信号检测系统;光源调制电路【作者】刘祥;曾立波;吴琼水【作者单位】武汉大学电子信息学院,湖北武汉 430079;武汉大学电子信息学院,湖北武汉 430079;武汉大学电子信息学院,湖北武汉 430079【正文语种】中文【中图分类】TN980 引言近红外光谱分析是利用近红外谱区包含的物质信息对物质进行定性定量分析的一种技术,广泛应用在农业、纺织业、制药业、生物医学等各个领域[1]。
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输入捕获的问题
关于STM32F407输入捕获的问题由于ST给出了库函数,要想实现输入捕获很简单,可是对于寄存器层面的操作网上少之又少,关于寄存器配置,讲的最多的就是小船的,很感谢小船。
小船只给出了通用定时器的寄存器简介,并没有给出具体的例程,本人近日无事故调试了一下寄存器层面的配置。
功能:Timer2实现输入捕获对于Timer的操作平时用的最多的就是定时器,PWM,对于其输入捕获功能也是第一次用。
直接上代码:void Timer2_Cap_Init(u16 arr,u16 psc){NVIC_InitTypeDef NVIC_InitStructure;上面这行代码的作用主要在意定义中断结构体。
RCC->APB1ENR|=(1<<0); //Timer2时钟使能RCC->AHB1ENR |=(1<<0); //使能portA时钟这两行的作用相信都明白,维持控制器工作的主要就是时钟,这点和大自然一样,时间是唯一度量。
GPIOA->MODER |= 0X00000002;//pa设置为复用模式STM32F4的GPIO模式寄存器与STM32F3的不同,F4的只要不是用于GPIO那一般都得设置为复用功能,此处需要特别慎重。
问题一般都出在这里,当你设置为复用功能后,由于IO的映射关系,一个IO口上可能同时映射好几个功能,你需要指定到底是什么功能,下面这句就是指定GPIOA.0复用功能为Timer2_CH1。
GPIOA->AFR[0]|=0X00000001; //复用功能选择AF1 TIMER2_CH1由于GPIO结构体里面定义的AFR寄存器为GPIOA->AFR[2],而芯片手册里给出的是GPIOA->AFRL和GPIOA->AFRH,此处特别容易产生错误,当你写GPIOA->AFRL时会报错(找不到GPIOA->AFRL),可是仔细看会发现GPIOA->AFRL对应的寄存器起始地址为:0x20,stm32f4××.h里面定义的AFR寄存器为GPIO->AFR[2],所以此处GPIO->AFR[0]对应的为GPIO->AFRL。
STM32中采用DMA实现方波的产生和捕获
STM32中采用DMA实现方波的产生和捕获1 STM32微控制器介绍STM32系列微控制器是ST公司基于Cortex-M3内核的高集成度的微控制器。
它在性能、价格、功耗和实时性方面树立了一个新的标杆,集成了Cortex-M3内核,以及双ADC、多用途的通用时钟TIMx、RTC、I2C、SPI、UART、CAN、DMA、USB等丰富的外设。
其功耗在全速72MHz所有模块都打开时也仅仅为36 mA,在低功耗模式下其功耗仅为2μA。
2 DMA和TIMx简介STM32系列微控制器均含有DMA和通用时钟TIMx模块。
其低端型号中仅包含DMA1,支持7个通道;高端型号还包括DMA2,支持5个通道。
它的每个通道可任意指定工作模式,如内存到内存、内存到外设或外设到内存等。
当涉及到外设时,一般是由外设来触发DMA的一次传输,如串口收到数据的标志位可触发DMA。
DMA的每次传输都分为4个阶段:申请仲裁、地址计算、总线存取和应答。
除总线存取阶段,其他3个阶段都只需要一个系统周期,并且不占用总线,可在DMA控制器内部并发地执行。
总线存取阶段,每个字(4字节)的传输需要3个系统周期。
DMA和CPU工作在交替方式下,不会相互阻塞。
DMA各个通道可独立设置优先级,当访问同一资源时高优先级通道先获得资源。
DMA的使用比较简单,每路DMA仅包括4个寄存器,用于指定DMA的工作模式、源地址、目标地址和传输次数。
ST公司提供了很好的驱动库,简化了外设的使用,方便阅读和移植。
本文采用库函数来展示功能。
其通用时钟是很有特色的外围模块,可实现多种复杂的功能。
时钟模块内部主要包含一个计数器和4个通道的比较/捕获寄存器。
时钟可工作在捕获或比较模式。
在捕获模式下,若有对应的触发信号,计数器的值会保存到比较/捕获寄存器,并触发中断或DMA;在比较模式下,若计数器的值与比较/捕获寄存器的值相等,则对外输出预选设定好的信号,如高电平、低电平或电平反转等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); //清除中断标志位}。