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
|
"""
Convert data length to radio TX/RX energy.
Contains classes for some embedded CPUs/MCUs. Given a configuration, each
class can convert a cycle count to an energy consumption.
"""
import numpy as np
def get_class(radio_name: str):
"""Return model class for radio_name."""
if radio_name == 'CC1200tx':
return CC1200tx
if radio_name == 'NRF24L01dtx':
return NRF24L01dtx
def _param_list_to_dict(device, param_list):
param_dict = dict()
for i, parameter in enumerate(sorted(device.parameters.keys())):
param_dict[parameter] = param_list[i]
return param_dict
class CC1200tx:
"""CC1200 TX energy based on aemr measurements."""
name = 'CC1200tx'
parameters = {
'symbolrate' : [6, 12, 25, 50, 100, 200, 250], # ksps
'txbytes' : [],
'txpower' : [10, 20, 30, 40, 47], # dBm = f(txpower)
}
default_params = {
'symbolrate' : 100,
'txpower' : 47,
}
def get_energy(params):
if type(params) != dict:
return CC1200tx.get_energy(_param_list_to_dict(CC1200tx, params))
power = 8.18053941e+04
power -= 1.24208376e+03 * np.sqrt(params['symbolrate'])
power -= 5.73742779e+02 * np.log(params['txbytes'])
power += 1.76945886e+01 * (params['txpower'])**2
power += 2.33469617e+02 * np.sqrt(params['symbolrate']) * np.log(params['txbytes'])
power -= 6.99137635e-01 * np.sqrt(params['symbolrate']) * (params['txpower'])**2
power -= 3.31365158e-01 * np.log(params['txbytes']) * (params['txpower'])**2
power += 1.32784945e-01 * np.sqrt(params['symbolrate']) * np.log(params['txbytes']) * (params['txpower'])**2
duration = 3.65513500e+02
duration += 8.01016526e+04 * 1/(params['symbolrate'])
duration -= 7.06364515e-03 * params['txbytes']
duration += 8.00029860e+03 * 1/(params['symbolrate']) * params['txbytes']
return power * 1e-6 * duration * 1e-6
class NRF24L01dtx:
"""nRF24L01+ TX energy based on datasheet values (probably unerestimated)"""
name = 'NRF24L01'
parameters = {
'symbolrate' : [250, 1000, 2000], # kbps
'txbytes' : [],
'txpower' : [-18, -12, -6, 0], # dBm
'voltage' : [1.9, 3.6],
}
default_params = {
'symbolrate' : 1000,
'txpower' : -6,
'voltage' : 3,
}
# 130 us RX settling: 8.9 mE
# 130 us TX settling: 8 mA
def get_energy(params):
if type(params) != dict:
return NRF24L01dtx.get_energy(_param_list_to_dict(NRF24L01dtx, params))
header_bytes = 7
# TX settling: 130 us @ 8 mA
energy = 8e-3 * params['voltage'] * 130e-6
if params['txpower'] == -18:
current = 7e-3
elif params['txpower'] == -12:
current = 7.5e-3
elif params['txpower'] == -6:
current = 9e-3
elif params['txpower'] == 0:
current = 11.3e-3
energy += current * params['voltage'] * ((header_bytes + params['txbytes']) * 8 / (params['symbolrate'] * 1e3))
return energy
|