]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control-pxmc.git/commitdiff
Sript currents and PWM data visualization computes alpha and beta current components...
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Tue, 9 Jun 2015 17:38:09 +0000 (19:38 +0200)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Tue, 9 Jun 2015 17:38:09 +0000 (19:38 +0200)
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
tools/datavis/pxmc-spimc-currents-show.py

index 24189f029b0fff338372d060d86f9c4406177e23..2a1ce7a846ef0dae6ba4279d6f792cb2b243491b 100755 (executable)
@@ -11,7 +11,7 @@ import argparse
 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
@@ -34,6 +34,7 @@ class spimc_state(object):
     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)
@@ -42,9 +43,16 @@ class spimc_state(object):
     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
@@ -72,12 +80,22 @@ class spimc_state(object):
         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,
@@ -92,6 +110,8 @@ if __name__ == '__main__':
                       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()
@@ -102,7 +122,8 @@ if __name__ == '__main__':
   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)
@@ -120,6 +141,12 @@ if __name__ == '__main__':
   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)
@@ -134,3 +161,8 @@ if __name__ == '__main__':
        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()