class spimc_state(object):
def __init__(self, data_fname = None, adc_channels = 3, pwm_channels = 3,
dmem_words = 0, skip_words = 0, period = 2500, adc_oversample = 1,
- filtspan = 1, isr_divider = 1, samples = None):
+ filtspan = 1, isr_divider = 1, samples = None, do_curcal = False):
self.adc_channels = adc_channels
self.pwm_channels = pwm_channels
self.period = period
self.adc_sqn = np.ndarray(shape=(self.rawsamples), dtype=np.uint32)
self.adc_offset = np.ndarray(shape=(self.adc_channels), dtype=np.float)
self.current = np.ndarray(shape=(self.adc_channels, self.samples), dtype=np.float)
+ self.cur_alpbet = np.ndarray(shape=(2, self.samples), dtype=np.float)
self.pwm_d = np.ndarray(shape=(1, self.samples), dtype=np.float)
self.pwm_q = np.ndarray(shape=(1, self.samples), dtype=np.float)
self.ptindx = np.ndarray(shape=(1, self.samples), dtype=np.uint32)
self.ptphs = np.ndarray(shape=(1, self.samples), dtype=np.int32)
- self.adc_offset[0] = 2071.0
- self.adc_offset[1] = 2074.0
- self.adc_offset[2] = 2050.0
+ self.adc_offset[0] = 2070.881306
+ self.adc_offset[1] = 2073.552682
+ self.adc_offset[2] = 2050.669577
+
+ self.curcal = np.array(
+ [[ 0.0063098, -0.00182591, 0.00580102],
+ [ 0.00245373, 0.00224583, -0.00493571],
+ [-0.00876353, -0.00041991, -0.00086531]]
+ ) * 1000
+
sample_pos = 0;
for i in range(0, self.rawsamples):
pos = sample_pos + self.skip_words
fac = 1.0
sampsum = 0.0
for j in range(0, self.filtspan):
- sampsum += float(self.adc_raw[ch, i + j]) / float(self.adc_sqn[i])
+ sqn_inc = float(self.adc_sqn[i]);
+ if sqn_inc <= 1:
+ sampsum += 0
+ else:
+ sampsum += float(self.adc_raw[ch, i + j]) / sqn_inc
self.adc_data[ch, i] = sampsum * fac
for ch in range(0, self.adc_channels):
for i in range(0, self.samples):
self.current[ch, i] = self.adc_data[ch, i] - self.adc_offset[ch]
+ if do_curcal:
+ self.current = np.dot(self.curcal, self.current)
+
+ clarke_t = np.array([[1.0, -0.5, -0.5], [0, math.sqrt(3)/2.0, -math.sqrt(3)/2.0]])
+ self.cur_alpbet = np.dot(clarke_t, self.current)
+
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--filtspan', dest='filtspan', type=int,
default=3, help='number of measured current ADC channels')
parser.add_argument('-s', '--samples', dest='samples', type=int,
default=None, help='limit number of processed samples')
+ parser.add_argument('-C', '--curcal', dest='do_curcal', action='store_true',
+ default=False, help='Use current callibration')
parser.add_argument('files', nargs=argparse.REMAINDER)
args = parser.parse_args()
adc_data = spimc_state(args.files[0], filtspan = args.filtspan,
period = args.period, adc_oversample = args.adc_oversample,
isr_divider = args.isr_divider, adc_channels = args.channels,
- samples = args.samples, pwm_channels = args.channels)
+ samples = args.samples, pwm_channels = args.channels,
+ do_curcal = args.do_curcal)
x = range(0, adc_data.samples)
xr = range(0, adc_data.rawsamples)
y7 = adc_data.adc_sqn
y8 = y4 + y5 + y6
+ cur_alp = adc_data.cur_alpbet[0]
+ cur_bet = adc_data.cur_alpbet[1]
+
+ cur_mag = np.sqrt(cur_alp**2 + cur_bet**2)
+ cur_ph = np.arctan2(cur_alp, cur_bet)
+
#pwm_ph = np.arctan2(adc_data.pwm_q, adc_data.pwm_d)
#cur_ph = np.arctan2(adc_data.cur_q_filt, adc_data.cur_d_filt)
#cur_ph = np.arctan2(adc_data.cur_q, adc_data.cur_d)
x, y8, 'c')
show()
+
+ plot(x, y, 'k', x, cur_alp, 'm', x, cur_bet, 'c',
+ x, cur_mag, 'r', x, cur_ph*3600/2/math.pi, 'g')
+
+ show()