1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# Author: Dylan Muller
# Copyright (c) 2025
# All rights reserved.
#
# - Commercial/IP use prohibited.
# - Attribution required.
# See License.txt
# Script for RMS power calibration
# using the Rigol DSA815.
import serial
import socket
import time
import math
from setup import *
from device import *
rms_power_count = []
rms_power_dbm = []
rms_power_gradient_count = []
rms_power_threshold = []
rms_power_intercept = []
drain_increment = 0
drain_counter = 0
steps = int(2*SETUP_CAL_POINTS)
def dsa815_get_power(sa_socket):
sa_socket.send(':CALCulate:MARKer1:Y?\r\n'.encode('utf-8'))
power_dbm = float(sa_socket.recv(1024).strip().decode('utf-8'))
return power_dbm
def print_response(data):
for i in data:
print(i)
# Initialize connections
sa_socket = socket.create_connection((SETUP_DSA815_IP, SETUP_DSA815_PORT))
sys_serial = serial.Serial(port=SETUP_SERIAL_PORT, baudrate=SETUP_SERIAL_BAUD, timeout=SETUP_SERIAL_TIMEOUT)
print("BATCH START")
print ("EXEC SYSTEM RESET")
response = sys_reset(sys_serial)
print(response)
time.sleep(SETUP_RESET_TIMEOUT)
sys_serial.flushInput()
print("EXEC GATE PROBE")
response = sys_gate_probe(sys_serial)
print_response(response)
print("EXEC TX MODE")
response = sys_si4468_tx(sys_serial)
print(response)
print("DATA ACQUISITION START")
for i in range(steps):
if (i > SETUP_CAL_POINTS ):
drain_increment = SETUP_DRAIN_INC_CORASE
else:
drain_increment = SETUP_DRAIN_INC_FINE
sys_drain_set(drain_counter)
fw_power_count = sys_read_power(sys_serial)
time.sleep(SETUP_LOOP_DELAY)
fw_power_dbm = dsa815_get_power(sa_socket)
print(drain_counter, fw_power_count, fw_power_dbm)
rms_power_count.append(float(fw_power_count))
rms_power_dbm.append(float(fw_power_dbm))
drain_counter += drain_increment
print("EXEC RX MODE")
response = sys_si4468_rx(sys_serial)
print(response)
print("DATA ACQUISITION END")
for i in range(0, steps, 2):
num_power_gradient = float(rms_power_count[i + 1] - rms_power_count[i])
den_power_gradient = float(rms_power_dbm[i + 1] - rms_power_dbm[i])
power_gradient = num_power_gradient / den_power_gradient
power_gradient_count = int(math.ceil((power_gradient * 10)))
power_intercept = float(rms_power_dbm[i + 1] - (float(1/power_gradient)*rms_power_count[i + 1]))
power_intercept = int(float(round(power_intercept, 2) * 100))
rms_power_gradient_count.append(power_gradient_count)
rms_power_intercept.append(power_intercept)
rms_power_threshold.append(int(rms_power_count[i + 1]))
c_power_gradient = "{ " + ", ".join(map(str, rms_power_gradient_count)) + " };"
c_power_intercept = "{ " + ", ".join(map(str, rms_power_intercept)) + " };"
c_power_threshold = "{ " + ", ".join(map(str, rms_power_threshold)) + " };"
print("C DUMP START")
print("const uint16_t fw_pwr_gradient[] = " + c_power_gradient)
print("const int16_t fw_pwr_intercept[] = " + c_power_intercept)
print("const uint16_t fw_pwr_threshold[] = " + c_power_threshold)
print("C DUMP END")
print("BATCH END")
|