单片机时钟与PWM频率的精度
单片机时钟与PWM频率的精度
本文讨论了单片机的频率与PWM频率精度之间的关系。通过理论分析和实际测试,研究了如何通过调整STM32F103单片机的系统时钟频率来获得最接近32766Hz的PWM信号。
PWM频率
一、前言
在竞赛车模室外计时模块的设计中,使用了基于手表晶体的选频放大电路。经过实际测量发现,这种音叉晶体选频电路的谐振特性所对应的增益中心频率为32766Hz,但信号源所产生的信号频率却比这个频率高。因此,需要研究单片机系统时钟频率在多大时,可以产生最接近32766Hz的PWM信号。
二、理论分析
这是STM32F103单片机系统时钟配置框图。外部8MHz的晶体震荡信号,通过分频之后输入到后面的锁相环,再经过倍频之后,可以获得4MHz到64MHz的系统时钟。如果晶体震荡信号不分频,最大可以得到72MHz的系统时钟。这样,系统时钟就会有17种不同的频率。如果以32.766kHz为中心频率,可以得到PWM实际输出频率。这样,便可以得到每一种系统频率下的PWM与中心频率之间的误差。
通过Python代码计算不同系统时钟频率下的PWM误差:
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2024-08-27
#
# Note:
#============================================================
from headm import *
fdim = [4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,72]
err = []
fpwm = 32766
for f in fdim:
ff = int(f*1e6/fpwm+0.5)
fff = int(f*1e6/ff)
epwm = fpwm-fff
printff(f, ff, fpwm, epwm)
err.append(epwm)
plt.plot(fdim, err, lw=3)
plt.xlabel("Fsys(Mhz)")
plt.ylabel("Err(Hz)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
计算结果显示,在系统时钟为52MHz的时候,经过分频之后所得到的PWM的频率和32.766kHz的误差可以达到0Hz。
图1.2.1 不同的系统频率和PWM频率和中心频率之间的误差
三、实际测量结果
在实际电路板上进行测试时,由于所使用的8MHz的晶体本身也有一定的误差,所以实际测试的PWM频率和理论值之间存在大约4Hz的差异。原本系统频率在56MHz时PWM频率与32.766kHz误差最小。但实际上,系统频率在44MHz时,误差最小。
下面是不同系统时钟频率下的测试数据:
系统时钟 | TIM1分频数量 | PWM理论数值 | PWM实测频率 | 中心频率误差 |
---|---|---|---|---|
4 | 122 | 32786 | 32790 | 24 |
8 | 244 | 32786 | 32790 | 24 |
12 | 366 | 32786 | 32790 | 24 |
16 | 488 | 32786 | 32790 | 24 |
20 | 610 | 32786 | 32790 | 24 |
24 | 732 | 32786 | 32790 | 24 |
28 | 855 | 32748 | 32752 | -14 |
32 | 977 | 32753 | 32756 | -10 |
36 | 1099 | 32757 | 32760 | -6 |
40 | 1221 | 32760 | 32763 | -3 |
44 | 1343 | 32762 | 32765.9 | 0.1 |
48 | 1465 | 32764 | 32768 | 2 |
52 | 1587 | 32766 | 32769.7 | 3.3 |
56 | 1709 | 32767 | 32771 | 4 |
60 | 1831 | 32768 | 32772.4 | 6.4 |
64 | 1953 | 32770 | 32773.6 | 7.6 |
72 | 2197 | 32771 | 32775.4 | 9.4 |
总结
通过实际测试发现,在单片机系统时钟频率为44MHz时误差最小。通过修正之后,所产生的PWM频率非常接近于32.766kHz,在使用音叉晶体选频电路中,的确所获得的选频放大信号最大。这也可以在一定程度上减少驱动无线线圈的功率。频率调准了,也提高了接收模块的灵敏度。
AT32F单片机
雅特力单片机的频率是可以从4MHz到120MHz每隔1MHz变化一次。下面是计算的每隔频率对应的PWM频率误差。
图2.1.1 AT32F单片机所产生的频率误差
图2.1.2 AT32单片机从80到120MHz对应的PWM频率误差