使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune
CTune介绍:
EFR32 器件配备了一个可配置的内部电容器组,用于加载外部晶振以实现正确操作和频率校准。我们通常把这个电容组的可配置值称为CTune。
CTUNE值在高频晶振(HFXO)的启动阶段应用。以下等式给出了电容的配置值和实际值之间的关系:
Ctune = Cpar + CTUNE<8:0> * 40fF,
Cpar表示寄生电容,寄生电容的值取决于电路板类型、布局、温度和晶体类型。内部电容大小与频率成反比,电容值越大,HFXO 频率越低。
CTune的设置会影响芯片的HFXO(frequency crystal oscillator)时钟,无线射频也使用HFXO时钟,因此调节CTune也是调节无线电链路的质量,不正确的CTune设置可能会导致两个设备之间的无线电链路断开。
CTune校准值可以存储在设备的非易失性存储器中。在客户定制板上,应始终执行校准操作。可以对每块板进行校准,但需要更长的时间。一种优选的方法是针对每个设计测量10-20块板的HFXO频率,并计算出一个可用于所有设备的平均CTune值通过这种方式,可以获得足够好的校准值。
使用 RAILTEST设置CTune
校准过程
在使用 RAILEST 编程的设备上按顺序发出以下命令,以便在初始化校准后重置:
rx 0
setPower 1
getCTune
setCTune <0x[hex-value] or [decimal value]>
setTxTone 1
RAILTEST 以rx 模式启动设备,因为功放电源只能在RAIL_RF_STATE_IDLE状态下更改,因此设备首先应切换到IDLE模式。可以使用 getCTune命令读取实际的CTune变量。通过 setCTune 命令改写该值。配置完成后,setTxTone 1 命令将无线电设置为使用载波信号的发射模式。
HFXO自动启动和CTune 配置
CMU_HFXOAutostartEnable() 可在从EM2/3唤醒后启用自动启动。如果在最后两个参数中的任何一个为true的情况下调用这个API,它会阻止HFXO的重新启动,从而阻止CTune值的更改。蓝牙堆栈中默认启用了此功能。
测量
测量是使用频谱分析仪和868MHz的EFR32MG14射频板 (BRD4169A) 完成的。建议使用传导射频连接进行这些校准。建议在测量期间使用低功率输出,以避免由于功率放大器的电流消耗引起的温度升高导致的校准漂移。
频谱分析仪的频率跨度(Span)应设置为不超过100 kHz,分辨率带宽较低,以便能够测量由晶体频率调整引入的微小频率变化。
最佳 CTune 值
通过迭代方法找到最佳 CTune 值。 将频谱仪标记设置为所需的频率并更改CTune值,直到无线电以该频率发射。
频率漂移
发射功率越高,最佳值就越难找到,因为芯片升温会影响晶体的谐振频率。 下图是频谱仪在"max hold"模式下在使用较高传输功率的2分钟内拍摄的。 结果表明,频率漂移约为0.5KHz,这可能导致校准不准确。
文章图片
安装并导入python的pynput模块检测键盘事件,serial模块控制串口数据收发:
from pynput import keyboard
import serial
import time
import threadingtxser = serial.Serial("COM1",115200,5)
ctuneValue = https://www.it610.com/article/0x67def ReadEchoData():
global ctuneValue while True:
Rx_Buffer = txser.read(txser.in_waiting).decode("gbk")
if len(Rx_Buffer) > 6:
print(Rx_Buffer)CtunePosition = Rx_Buffer.find("{{(getCtune)}{CTUNEXIANA:0x")
if CtunePosition > 0:
CtunePosition = CtunePosition + 25
print("CTUNE Value")
newStr = Rx_Buffer[36:41]
print(newStr)
ctuneValue = https://www.it610.com/article/int(newStr,16)
print(ctuneValue)def IncCtuneValue():
global ctuneValue
ctuneValue = ctuneValue + 16
txser.write(b"settxtone 0\r\n")
time.sleep(0.1)
txser.write(b"rx 0\r\n")
time.sleep(0.1)
txser.write(b"setCtune 0x%x \r\n" %ctuneValue)
time.sleep(0.1)
txser.write(b"settxtone 1\r\n")
time.sleep(0.1)
return
【笔记|使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune】使用pynput模块检测键盘事件并做出相应处理:
def on_press(key):
try:
print('alphanumeric key {0} pressed'.format(key.char))
except AttributeError:
print('special key {0} pressed'.format(key))
if key == keyboard.Key.space: InitTx();
if key == keyboard.Key.up: IncCtuneValue();
if key == keyboard.Key.down: DecCtuneValue();
if key == keyboard.Key.left: AddCtuneValue();
if key == keyboard.Key.right: ReduceCtuneValue();
if key == keyboard.Key.enter: PrKeyValue(key);
if __name__ == "__main__":
''' Start the app if this file is executed'''
while True:
with keyboard.Listener(
on_press = on_press,
on_release = on_release) as listener:
listener.join()
推荐阅读
- opencv 绘图及交互(python)
- 程序人生|程序员高考卷曝光,你能得多少分()
- 笔记|C语言---初识指针(2)
- 笔记|C语言程序设计----初识C语言与程序设计(一)简答
- 笔记|C语言程序设计----初识C语言与程序设计
- Python 中的函数式编程三大法宝(mapfilterreduce)
- Python|Python 对数据集进行归一化处理并存储为 mat 格式的文件
- python|mmsegmentation教程1:自定义数据集、config文件修改、训练教程
- 【kaggle|【Kaggle教程】Pandas