- use polynomial curve fitting for mapping power to digits

git-svn-id: http://moon:8086/svn/projects/HendiControl@231 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
2019-04-04 22:20:20 +00:00
parent 268ad6a34a
commit 22d0a901ac
+13 -39
View File
@@ -3,6 +3,7 @@
import time
import serial
import sys
import numpy as np
class HendiCtrl():
def __init__(self, port, baudrate):
@@ -24,21 +25,16 @@ class HendiCtrl():
"pwr_digits_min" : 4092,
"pwr_digits_max" : 670
}
self.curve = {
'powers' : [ 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500],
'digits' : [4092, 3840, 3700, 3440, 3300, 3060, 3000, 2930, 2860, 2780, 2640, 2510, 2430, 2360, 2190, 2130, 2030, 1980, 1880, 1730, 1630, 1560, 1480, 1400, 1240, 1150, 1150, 1080, 920, 740, 670],
'poly' : [-7.6500e-14, 8.2218e-10, -3.4125e-06, 6.8421e-03, -7.6098e+00, 6.5858e+03]
}
powers = [ 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300,3400, 3500]
digits = [4092, 3840, 3700, 3440, 3300, 3060, 3000, 2930, 2860, 2780, 2640, 2510, 2430, 2360, 2190, 2130, 2030, 1980, 1880, 1730, 1630, 1560, 1480, 1400, 1240, 1150, 1150, 1080, 920, 740, 670]
self.poly_w2d = np.polyfit(powers, digits, 5)
self.poly_d2w = np.polyfit(digits, powers, 5)
def toDigits(self, pwr):
poly = self.curve['poly']
def toDigits(self, power_watts):
return np.polyval(self.poly_w2d, float(power_watts))
N = len(poly)
for n in range(0, N):
digits = poly[N-1-n] * pwr**n
return digits
def toWatts(self, power_digits):
return np.polyval(self.poly_d2w, float(power_digits))
def reset(self):
self.ser.dtr = True
@@ -155,39 +151,16 @@ class HendiCtrl():
return self.cmd("S?")
def setPowerWatts(self, power_watts):
pwr_watts_min = self.caps['pwr_watts_min']
pwr_watts_max = self.caps['pwr_watts_max']
pwr_digits_min = self.caps['pwr_digits_min']
pwr_digits_max = self.caps['pwr_digits_max']
pwr_watts_step = self.caps['pwr_watts_step']
pwr_watts_range = pwr_watts_max - pwr_watts_min
pwr_digits_range = pwr_digits_max - pwr_digits_min
digits_per_watt = pwr_digits_range/pwr_watts_range
pwr_digits = pwr_digits_min + digits_per_watt * (power_watts - pwr_watts_min) + 0.5
max_digits = max(pwr_digits_max, pwr_digits_min)
min_digits = min(pwr_digits_max, pwr_digits_min)
pwr_digits = int(self.toDigits(power_watts))
pwr_digits = int(min(max_digits, max(min_digits, pwr_digits)))
self.setPowerDigits(self.toDigits(power_watts))
return self.setPowerDigits(pwr_digits)
def getPowerWatts(self):
pwr_watts_min = self.caps['pwr_watts_min']
pwr_watts_max = self.caps['pwr_watts_max']
pwr_digits_min = self.caps['pwr_digits_min']
pwr_digits_max = self.caps['pwr_digits_max']
pwr_watts_range = pwr_watts_max - pwr_watts_min
pwr_digits_range = pwr_digits_max - pwr_digits_min
digits_per_watt = pwr_digits_range/pwr_watts_range
max_digits = max(pwr_digits_max, pwr_digits_min)
min_digits = min(pwr_digits_max, pwr_digits_min)
pwr_digits = int(self.getPowerDigits())
pwr_watts = (pwr_digits - pwr_digits_min)/digits_per_watt + pwr_watts_min
return int(pwr_watts)
return int(self.toWatts(self.getPowerDigits()) + 0.5)
if __name__ == '__main__':
@@ -205,6 +178,7 @@ if __name__ == '__main__':
try:
hendi.remoteEnable(True)
hendi.setSwitch(1)
time.sleep(2.0)
for pwr in range(500, 3500, 100):
hendi.setPowerWatts(pwr)
time.sleep(0.1)