]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control-pxmc.git/blob - tools/datavis/pxmc-spimc-currents-show.py
24189f029b0fff338372d060d86f9c4406177e23
[fpga/rpi-motor-control-pxmc.git] / tools / datavis / pxmc-spimc-currents-show.py
1 #! /usr/bin/python
2
3 import numpy as np
4 import math
5 #import matplotlib as plt
6 #from numpy import cos
7 from pylab import plot, subplot, figure, show, ylim, yticks
8 from pprint import pprint
9 import argparse
10
11 class spimc_state(object):
12   def __init__(self, data_fname = None, adc_channels = 3, pwm_channels = 3,
13                dmem_words = 0, skip_words = 0, period = 2500, adc_oversample = 1,
14                filtspan = 1, isr_divider = 1, samples = None):
15     self.adc_channels = adc_channels
16     self.pwm_channels = pwm_channels
17     self.period = period
18     self.adc_oversample = adc_oversample
19     self.isr_divider = isr_divider
20     self.filtspan = filtspan
21     self.dmem_words = dmem_words
22     self.adc_channels = adc_channels
23     self.pwm_channels = pwm_channels
24     self.skip_words = skip_words
25     data_buff = np.fromfile(data_fname, dtype=np.int32, count=-1, sep='')
26     self.rawsamples = int(math.floor((np.size(data_buff, 0) - 0) / (1 + self.adc_channels + 1 + self.pwm_channels + self.dmem_words)))
27     self.samples = self.rawsamples - self.filtspan
28     if samples is not None:
29       if self.samples > samples:
30         self.samples = samples
31     self.pwm = np.ndarray(shape=(self.pwm_channels, self.rawsamples), dtype=np.int32)
32     self.adc_data = np.ndarray(shape=(self.adc_channels, self.samples), dtype=np.float)
33     self.adc_raw = np.ndarray(shape=(self.adc_channels, self.rawsamples), dtype=np.int32)
34     self.adc_sqn = np.ndarray(shape=(self.rawsamples), dtype=np.uint32)
35     self.adc_offset = np.ndarray(shape=(self.adc_channels), dtype=np.float)
36     self.current = np.ndarray(shape=(self.adc_channels, self.samples), dtype=np.float)
37
38     self.pwm_d = np.ndarray(shape=(1, self.samples), dtype=np.float)
39     self.pwm_q = np.ndarray(shape=(1, self.samples), dtype=np.float)
40     self.cur_d = np.ndarray(shape=(1, self.samples), dtype=np.float)
41     self.cur_q = np.ndarray(shape=(1, self.samples), dtype=np.float)
42     self.ptindx = np.ndarray(shape=(1, self.samples), dtype=np.uint32)
43     self.ptphs = np.ndarray(shape=(1, self.samples), dtype=np.int32)
44
45     self.adc_offset[0] = 2071.0
46     self.adc_offset[1] = 2074.0
47     self.adc_offset[2] = 2050.0
48     sample_pos = 0;
49     for i in range(0, self.rawsamples):
50       pos = sample_pos + self.skip_words
51       if i < self.samples:
52         self.ptindx[0, i] = data_buff[pos];
53       pos += 1
54       for ch in range(0, self.pwm_channels):
55         self.pwm[ch, i] = data_buff[pos] & 0x3fff
56         pos += 1
57       self.adc_sqn[i] = data_buff[pos];
58       pos += 1
59       for ch in range(0, self.adc_channels):
60         self.adc_raw[ch, i] = data_buff[pos]
61         pos += 1
62       for a in range(0, self.dmem_words):
63         self.dmem[a, i] = data_buff[pos]
64         pos += 1
65       sample_pos = pos
66
67     nominal_cycle = self.period * self.adc_oversample;
68     for ch in range(0, self.adc_channels):
69       for i in range(0, self.samples):
70         #cycle_time = self.adc_raw[ch, i + self.filtspan] + nominal_cycle  * self.filtspan - self.adc_raw[ch, i]
71         #cycle_time = nominal_cycle * self.filtspan
72         fac = 1.0
73         sampsum = 0.0
74         for j in range(0, self.filtspan):
75           sampsum += float(self.adc_raw[ch, i + j]) / float(self.adc_sqn[i])
76         self.adc_data[ch, i] = sampsum * fac
77     for ch in range(0, self.adc_channels):
78       for i in range(0, self.samples):
79         self.current[ch, i] = self.adc_data[ch, i] - self.adc_offset[ch]
80
81 if __name__ == '__main__':
82   parser = argparse.ArgumentParser()
83   parser.add_argument('-f', '--filtspan', dest='filtspan', type=int,
84                       default=1, help='number of samples used in moving average')
85   parser.add_argument('-p', '--period', dest='period', type=int,
86                       default=2500, help='period period of ')
87   parser.add_argument('-a', '--adc-oversample', dest='adc_oversample', type=int,
88                       default=1, help='ADC oversample over period')
89   parser.add_argument('-d', '--isr-divider', dest='isr_divider', type=int,
90                       default=1, help='Rx done ISR divider')
91   parser.add_argument('-c', '--channels', dest='channels', type=int,
92                       default=3, help='number of measured current ADC channels')
93   parser.add_argument('-s', '--samples', dest='samples', type=int,
94                       default=None, help='limit number of processed samples')
95   parser.add_argument('files', nargs=argparse.REMAINDER)
96
97   args = parser.parse_args()
98
99   if len(args.files) == 0:
100     args.files.append('adc-out.bin')
101
102   adc_data = spimc_state(args.files[0], filtspan = args.filtspan,
103                             period = args.period, adc_oversample = args.adc_oversample,
104                             isr_divider = args.isr_divider, adc_channels = args.channels,
105                             samples = args.samples, pwm_channels = args.channels)
106
107   x = range(0, adc_data.samples)
108   xr = range(0, adc_data.rawsamples)
109   xf = range(adc_data.filtspan + 0, adc_data.samples + adc_data.filtspan)
110   y = adc_data.ptindx[0]
111   y1 = adc_data.pwm[0]
112   y2 = adc_data.pwm[1]
113   y3 = adc_data.pwm[2]
114   #y4 = adc_data.adc_data[0]
115   #y5 = adc_data.adc_data[1]
116   #y6 = adc_data.adc_data[2]
117   y4 = adc_data.current[0]
118   y5 = adc_data.current[1]
119   y6 = adc_data.current[2]
120   y7 = adc_data.adc_sqn
121   y8 = y4 + y5 + y6
122
123   #pwm_ph = np.arctan2(adc_data.pwm_q, adc_data.pwm_d)
124   #cur_ph = np.arctan2(adc_data.cur_q_filt, adc_data.cur_d_filt)
125   #cur_ph = np.arctan2(adc_data.cur_q, adc_data.cur_d)
126
127   #y7 = cur_ph[0] * 180.0 / math.pi * 10
128   #y8 = pwm_ph[0] * 180.0 / math.pi * 10
129
130   #y9 = adc_data.ptphs[0] * 100
131
132   plot(x, y, 'y', xr, y1, 'r.', xr, y2, 'g.', xr, y3, 'b.',
133        x, y4, 'r-', x, y5, 'g-', x, y6, 'b-', xr, y7, 'k',
134        x, y8, 'c')
135
136   show()