使用Python自动调节EFR32的高频晶振(HFXO)电容器组-CTune

使用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自动调节EFR32的高频晶振(HFXO)电容器组-CTune_第1张图片

安装并导入python的pynput模块检测键盘事件,serial模块控制串口数据收发:

from pynput import keyboard
import serial
import time
import threading

txser = serial.Serial("COM1",115200,5)
ctuneValue = 0x67
  
def 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 = 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

使用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()

你可能感兴趣的:(笔记,Python,单片机,嵌入式硬件)