在电子设计竞赛中,我们有时候希望能够对机器人云台发射机构的摩擦轮进行测速,一是为了摩擦轮斜坡启动不至于启动电流过大,二是为了防止摩擦轮在发射子弹过程中转速受到拨弹的影响以致转速波动。
在初期,我们的方案有两个,一是使用AS5048编码器测量转速,二是使用霍尔传感器测量转速。在对两个方案进行代码验证时,由于AS5048在国内的使用较少,资料很少,硬着头皮看它的英文资料,发现AS5048实际上是绝对式编码器,并不适于测量转速如此之快的摩擦轮,但是鉴于STM32F4的强大(高频处理能力),最后还是使用两次平均的方法求取出了摩擦轮的转速,关于AS5048的相关测速方法以及代码有机会再说。
接着好好谈一下我们所使用的霍尔传感器测速。在深入了解后发现,霍尔传感器测速实际上有两种方法,一是测频法,二是测周法。
所谓测频法,即,使用两个定时器,例如TIM2与TIM3,其中,TIM2用于捕捉霍尔传感器的下降沿,并在捕获中断中对下降沿计数,TIM3用于计一段固定的时间,如此便可以做到测量一定时间内得到的脉冲个数。设TIM3计时时间为T,摩擦轮上安装的磁铁个数为N,得到的脉冲个数为P,则可知摩擦轮转速为(P*60)/(N*T)。
所谓测周法,即,仅使用一个定时器,如TIM2,并使用TIM2输入捕获霍尔传感器的下降沿输出,但是此时我们并非对下降沿计数,而是直接计算两次输入捕获之间的时间,而这个时间即转动1/N圈所使用的时间,如此也可得到转速,且仅仅使用了一个定时器。但是,在写测周法的代码时,我意识到了一件比较重要的事情,那就是系统时钟的频率会直接影响测周法的准确性。
这里需要补充一些关于系统时钟的重要信息。通过阅读《STM32F4开发指南-库函数版本》P108可知,“STM32F4有两个PLL,第一个是主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟,其第一个输出PLLP用于生成高速的系统时钟(最高168MHz),第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟;第二个是专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能”,我们在输入捕获时使用的是TIMx所使用的时钟,这个时钟实际上是从上述主PLL时钟的第一个输出分频后得到的。那么问题来了,主时钟的频率是多少?TIMx的分频系数又是多少?只有确定了这两个量,才能正确初始化我们的输入捕获函数。
同样根据《STM32F4开发指南-库函数版本》P108可以得到主PLL生成的第一个输出高速时钟PLLP的计算公式PLL=E*N/(M*P),其中E为外部晶振频率,N为倍频器倍频系数,M与P均为分频器分频系数(其具体位置参见《STM32F4开发指南-库函数版本》P108的STM32系统时钟图)。在代码层面,E为外部晶振频率,参照核心板原理图即可得到,而N、M、P均可在system_stm32f4xx.c文件中看到。这个文件中还提供了F4各类MCU的总线分频系数,如APB1 Prescaler,APB2 Prescaler等等,均可查找到并进行修改。
了解以上这些的必要性在于,由于学习者一般使用的是正点原子提供的STM32F407核心板,其外部晶振频率为8MHz,另外三个系数分别为M=8,N=336,P=2。代入上述计算公式得到主PLL时钟为168MHz,而APB1的分频系数为2。但是,我们要进行代码移植时,则不可避免地会遇到这些值都发生改变的情况。如大疆公司提供的STM32F427板子,其外部晶振频率为12MHz,为了保证之前在F407的代码依旧可以使用,我们就要使得通过一定的代码设置,使得计算出来的主PLL仍为168MHz,简单地设置为,将system_stm32f4xx.c文件中第316行的PLL_M值设为12,第335行PLL_N值设为336,代入主PLL计算公式可知计算结果为168MHz。这个值一般即系统时钟的频率。如此便可以轻松地将F407的代码直接移植到F427身上。需要注意,F407与F427的各总线对于主PLL的分频系数也是不同的,所以在初始化时钟使,需要格外留意。如,经过以上设置,F407的APB1分频系数为4,而F401则为2,这在有关时钟的各类初始化中都非常需要留意,除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。
还有一点需要格外留意,一般来说,输入捕获的计数值越大越好,在通用定时器中,TIM2和TIM5均是32位定时器,应当尽量使用这两个计时器进行测速。如,我们初始化TIM5时钟为TIM5_CH2_Cap_Init(0xFFFFFFFF,42-1),简单计算可知计数0xFFFFFFFF需要的时间大约要4000多秒,对于测量大多数信号频率绰绰有余。而如果使用16位定时器,其最大计数值为0xFFFF,计数时间则大大缩减,大约只有66ms,一般是不适于用于输入捕获的。
通过了解上述知识点,就可以在使用测周法测速时获得准确的脉冲周期,精确地获得速度并进行反馈控制了。
综合而言,测频法仅适合于测试频率较高的信号,能够在固定时间内给出速度值,而测周法则对于低频高频信号都有较高的适用性,但是其测量速度的速度是受所测脉冲控制的。在MCU资源较为稀缺的情况下,使用测周法更加合适。
关键字:STM32 内部时钟
引用地址:
小窥STM32内部时钟
推荐阅读最新更新时间:2024-03-16 16:07
STM32笔记之二十:四步,从IAR4移植到IAR5
起因:一直用豆皮的小容量单片机,同学需要使用DA,所以换大容量。炳哥哥推荐调试大容量换IAR5,经过此高人指点,总结移植步骤如下。 步骤0,准备原版程序库,也就是说需要移植的程序是2.03则准备官方原版2.03库。 步骤一:把原版库里面project下的EWARMv5下所有文件拷贝到需要移植的IAR4程序文件夹里,覆盖所有同名文件 步骤二:用IAR5打开覆盖好的工程,删除FWLib和user下的所有文件,并重新加入这些文件。因为eww文件被覆盖后,这些文件的位置会错误。 步骤三:重新整理系统寻找的文件夹位置ProjectOption C/C++ CompilerPreprocessorAdditional include d
[单片机]
【STM32】CubeMX+HAL 点亮LED
1. 配置STM32CubeMX 【1.1】打开软件: 【1.2】 在 STM32CubeMX 的主界面中,点击 “New Project” 功能框中的 “ACCESS TO MCU SELECTOR” 功能按钮,从 MCU 开始新的工程。 【1.3】 在弹出对话框的 “MCU/MPU Selector” 选项卡中,首先,在左侧搜索框中输入该工 程需要使用的芯片型号 “STM32F407VE” ,然后,用鼠标在右下方的芯片列表中选择具体的 芯片型号,接着点击右上角的“Start Project” 按钮,开始工程的各项配置。 【1.4】 工程配置的主界面有四个菜单:Pinout & Configuration、Clock
[单片机]
STM32增强型微控制器访问NAND Flash学习笔记
一、了解NAND Flash 简单的理解就是,NORFlash具有随机存取和随字节执行写操作的能力,即可以访问到存储器内部的任意一个字节,且具有读取速度快等特点,它占据1MB—16MB闪存的大部分市场,根据其读取数据速度快的特点主要应用在代码存储;而NAND Flash以“页”为单位进行对数据的读写操作,且具有写入和擦除速度快等特点,它应用在8MB—256MB的产品中,根据其特点主要应用在数据存储上。 以型号HY27UF081G2A的NAND Flash芯片为例,其总线宽度为8bit,总内存大小为1Gbit(即128MB),共分为1024块(Block),每块又分为64页(Page),每页共2KB(main memo
[单片机]
STM32访问外部存储器-NOR-Flash
今天调试了一天STM32程序走了很多弯路,还好最后完全走通,调试过程中的一些经验总结如下: 1、不要完全相信编译器,很多时候可能你只是少了一个分号或者括号,编译器可能给你报一大堆不相关的错误,这时候如果想着一个个去改的话显然找不到正确答案。因此为了保险起见原先编译成功的程序在改动的时候,每改动一次就对相应的文件编译一次,这样可以避免一下子改动很多最后一编译出现很多错误不好定位。第一步编译只是编译当前文件,只有在build的时候才会对所有改动的文件重新编译,因此等到build的时候发现错误很多时候并不能很好定位。 2、加入功能时要注意改动几个地方;首先是/stm32f10x_conf.h中相应的头文件有没有去掉注释,这一点很
[单片机]
stm32 中断号和中断处理函数建立关系
stm32的中断号根据不同内核和型号,ST公司给的官方库中对相应的中断号进行了设置,我们用到哪一个外设的且要用到相应的中断功能时,在stm32fxxx.h中定义对应的型号的中断号。若要调用相关的中断功能,在NVIC中配置相关的中断优先级和中断号。STM32会内部会根据配置的中断号在启动文件中寻找相应的中断函数的相应的入口函数例如在配置串口的中断接收打赢函数时,在NVIC的配置中配置串口1的中断函数中设置的中断号为如下: USART1_IRQn = 27, /*USART1 Interrupt*/ #define DEBUG_USART_IRQ USART1_IRQn /* 配置中断源 */ N
[单片机]
STM32微控制器应用于Pebble智能手表
意法半导体(STMicroelectronics,简称ST)的STM32微控制器被Pebble智能手表所采用,用于控制这款创新的兼容iPhone手机和安卓智能手机的穿戴式产品。
Pebble智能手表通过蓝牙无缝连接到iPhone和安卓智能手机,当有来电、电子邮件和短信时,可通过静音振动通知用户。Pebble智能手表内置实时性能和能效俱佳的STM32 F2微控制器,使手表在功能性和电池使用寿命之间实现完美平衡,为用户提供全定制功能,配备精美的表盘下载和实用的联网应用软件。
Pebble创始人、首席执行官Eric Migicovsky表示:“Pebble穿戴式产品的用户想要一个这样的手表,它能够无缝连接其它设备,连续运行几
[单片机]
STM32通用定时器的输入捕获(实例:输入捕获)
通用定时器输入捕获概述 输入捕获的工作原理 在通用定时器框图中,主要涉及到最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、左下部分(输入捕获)这三个部分。这里主要讲解一下左下部分(输入捕获),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6、TIM7,其他的定时器都有输入捕获的功能。下面以一个简单的脉冲输入为例,简单地讲述一下输入捕获用于测量脉冲宽度的工作原理: 先设置输入捕获为上升沿检测,记录发生上升沿时TIMx_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来的时候
[单片机]
STM32的IIC库函数使用误区
HAL库里有很多的IIC的库函数,比如 HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t
[单片机]