5 #import matplotlib as plt
7 from pylab import plot, subplot, figure, show, ylim, yticks
8 from pprint import pprint
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
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)
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)
45 self.adc_offset[0] = 2071.0
46 self.adc_offset[1] = 2074.0
47 self.adc_offset[2] = 2050.0
49 for i in range(0, self.rawsamples):
50 pos = sample_pos + self.skip_words
52 self.ptindx[0, i] = data_buff[pos];
54 for ch in range(0, self.pwm_channels):
55 self.pwm[ch, i] = data_buff[pos] & 0x3fff
57 self.adc_sqn[i] = data_buff[pos];
59 for ch in range(0, self.adc_channels):
60 self.adc_raw[ch, i] = data_buff[pos]
62 for a in range(0, self.dmem_words):
63 self.dmem[a, i] = data_buff[pos]
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
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]
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)
97 args = parser.parse_args()
99 if len(args.files) == 0:
100 args.files.append('adc-out.bin')
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)
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]
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
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)
127 #y7 = cur_ph[0] * 180.0 / math.pi * 10
128 #y8 = pwm_ph[0] * 180.0 / math.pi * 10
130 #y9 = adc_data.ptphs[0] * 100
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',