- 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:
+13
-39
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user