小窥STM32内部时钟

在电子设计竞赛中,我们有时候希望能够对机器人云台发射机构的摩擦轮进行测速,一是为了摩擦轮斜坡启动不至于启动电流过大,二是为了防止摩擦轮在发射子弹过程中转速受到拨弹的影响以致转速波动。

在初期,我们的方案有两个,一是使用AS5048编码器测量转速,二是使用霍尔传感器测量转速。在对两个方案进行代码验证时,由于AS5048在国内的使用较少,资料很少,硬着头皮看它的英文资料,发现AS5048实际上是绝对式编码器,并不适于测量转速如此之快的摩擦轮,但是鉴于STM32F4的强大(高频处理能力),最后还是使用两次平均的方法求取出了摩擦轮的转速,关于AS5048的相关测速方法以及代码有机会再说。

接着好好谈一下我们所使用的霍尔传感器测速。在深入了解后发现,霍尔传感器测速实际上有两种方法,一是测频法,二是测周法

所谓测频法,即,使用两个定时器,例如TIM2与TIM3,其中,TIM2用于捕捉霍尔传感器的下降沿,并在捕获中断中对下降沿计数,TIM3用于计一段固定的时间,如此便可以做到测量一定时间内得到的脉冲个数。设TIM3计时时间为T,摩擦轮上安装的磁铁个数为N,得到的脉冲个数为P,则可知摩擦轮转速为(P*60)/(N*T)。

所谓测周法,即,仅使用一个定时器,如TIM2,并使用TIM2输入捕获霍尔传感器的下降沿输出,但是此时我们并非对下降沿计数,而是直接计算两次输入捕获之间的时间,而这个时间即转动1/N圈所使用的时间,如此也可得到转速,且仅仅使用了一个定时器。但是,在写测周法的代码时,我意识到了一件比较重要的事情,那就是系统时钟的频率会直接影响测周法的准确性。

小窥STM32内部时钟_第1张图片

这里需要补充一些关于系统时钟的重要信息。通过阅读《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倍

小窥STM32内部时钟_第2张图片

还有一点需要格外留意,一般来说,输入捕获的计数值越大越好,在通用定时器中,TIM2和TIM5均是32位定时器,应当尽量使用这两个计时器进行测速。如,我们初始化TIM5时钟为TIM5_CH2_Cap_Init(0xFFFFFFFF,42-1),简单计算可知计数0xFFFFFFFF需要的时间大约要4000多秒,对于测量大多数信号频率绰绰有余。而如果使用16位定时器,其最大计数值为0xFFFF,计数时间则大大缩减,大约只有66ms,一般是不适于用于输入捕获的。

通过了解上述知识点,就可以在使用测周法测速时获得准确的脉冲周期,精确地获得速度并进行反馈控制了。

综合而言,测频法仅适合于测试频率较高的信号,能够在固定时间内给出速度值,而测周法则对于低频高频信号都有较高的适用性,但是其测量速度的速度是受所测脉冲控制的。在MCU资源较为稀缺的情况下,使用测周法更加合适。

你可能感兴趣的:(嵌入式)