-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCAMCode.c
494 lines (430 loc) · 24.5 KB
/
CAMCode.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
#include "CAMCode.h"
/********************************************************************\
* Dynamx Design Lab C Code *
*--------------------------------------------------------------------*
* *
* File: CAMCode.c *
* Circuit: okika_us.okt *
* Generated: May 05, 2022: 01:38 PM *
* Version: 2.8.0.10 - (Standard) - Release *
* Copyright: Copyright © 2015 Okika. All rights reserved. *
* *
\********************************************************************/
/*##################################################################*\
# #
# Comparator.cam #
# #
\*##################################################################*/
/*================================================================*\
) Hysteresis and Output Polarity (
\*================================================================*/
/*--------------------------------------------------------------*\
| CompSetHyst |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| This function controls the hysteresis of the Comparator. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| Comparator2 ot_FPAA1_Comparator2 ot_FPAA1 |
| Comparator3 ot_FPAA1_Comparator3 ot_FPAA1 |
| Comparator4 ot_FPAA2_Comparator4 ot_FPAA2 |
| Comparator5 ot_FPAA2_Comparator5 ot_FPAA2 |
| Comparator4 ot_FPAA3_Comparator4 ot_FPAA3 |
| Comparator5 ot_FPAA3_Comparator5 ot_FPAA3 |
| Comparator4 ot_FPAA4_Comparator4 ot_FPAA4 |
| Comparator5 ot_FPAA4_Comparator5 ot_FPAA4 |
| Comparator4 ot_FPAA5_Comparator4 ot_FPAA5 |
| Comparator5 ot_FPAA5_Comparator5 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
void ot_CompSetHyst(ot_CAM cam, ot_Comparator NewHyst)
{
ot_SetApexComparator(cam, ot_okikaApex_Comparator_comp1, ot_ComparatorMask_Hysteresis, NewHyst);
}
/*--------------------------------------------------------------*\
| CompSetOutputPolarity |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| This function controls the output polarity of the Comparator. |
| |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| Comparator2 ot_FPAA1_Comparator2 ot_FPAA1 |
| Comparator3 ot_FPAA1_Comparator3 ot_FPAA1 |
| Comparator4 ot_FPAA2_Comparator4 ot_FPAA2 |
| Comparator5 ot_FPAA2_Comparator5 ot_FPAA2 |
| Comparator4 ot_FPAA3_Comparator4 ot_FPAA3 |
| Comparator5 ot_FPAA3_Comparator5 ot_FPAA3 |
| Comparator4 ot_FPAA4_Comparator4 ot_FPAA4 |
| Comparator5 ot_FPAA4_Comparator5 ot_FPAA4 |
| Comparator4 ot_FPAA5_Comparator4 ot_FPAA5 |
| Comparator5 ot_FPAA5_Comparator5 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
void ot_CompSetOutputPolarity(ot_CAM cam, ot_Comparator NewPol)
{
if ((NewPol == ot_Comparator_Apex_NonInverted) || (NewPol == ot_Comparator_Apex_Inverted))
ot_SetApexComparator(cam, ot_okikaApex_Comparator_comp1, ot_ComparatorMask_Polarity, NewPol);
}
/*##################################################################*\
# #
# FilterBilinear.cam #
# #
\*##################################################################*/
/*================================================================*\
) Gain and Corner Frequency (
\*================================================================*/
/*--------------------------------------------------------------*\
| setFilterLowPass |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| A full floating-point method for setting the corner frequency |
| [kHz] and gain of a low-pass filter. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| FilterBilinear1 ot_FPAA1_FilterBilinear1 ot_FPAA1 |
| FilterBilinear2 ot_FPAA2_FilterBilinear2 ot_FPAA2 |
| FilterBilinear2 ot_FPAA3_FilterBilinear2 ot_FPAA3 |
| FilterBilinear2 ot_FPAA4_FilterBilinear2 ot_FPAA4 |
| FilterBilinear2 ot_FPAA5_FilterBilinear2 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
double ot_setFilterLowPass(ot_CAM cam, double Fo, double G)
{
static const double an_Pi = 3.1415926535897931;
short dCin, dCout;
short dCint = 255;
short Cin, Cint, Cout;
double aG, aomega, aFo;
long clocka = ot_GetApexClockFrequency(cam, ot_CAMClock_ClockA);
// Prewarp omega (Fo) into omega_a with Bilinear Transform
double omega = 2.0 * clocka * tan(an_Pi*Fo*1000.0/clocka);
double alpha = (clocka/omega - 0.5);
double err = 99999;
double bestErr = 999;
while (dCint>0)
{
dCout = ot_AdjustCap(dCint/alpha);
dCin = ot_AdjustCap(1.0*G*dCout);
aG = 1.0*dCin/dCout;
aomega = 2.0 * dCout *clocka/(2.0 * dCint + dCout);
err = aG/G + G/aG + aomega/omega + omega/aomega;
if (err < bestErr)
{
bestErr = err;
Cout = dCout;
Cint = dCint;
Cin = dCin;
}
dCint--;
}
aomega = 2.0 * Cout * clocka/(2.0 * Cint + Cout);
aFo = 0.001*clocka * atan(0.5 * aomega / clocka) / an_Pi;
ot_SetCapValue(cam, ot_okikaApex_FilterBilinear_Cin,Cin);
ot_SetCapValue(cam, ot_okikaApex_FilterBilinear_Cout,Cout);
ot_SetCapValue(cam, ot_okikaApex_FilterBilinear_Cint,Cint);
return aFo;
}
/*##################################################################*\
# #
# FilterBiquad.cam #
# #
\*##################################################################*/
/*================================================================*\
) BandPass Capacitors (
\*================================================================*/
/*--------------------------------------------------------------*\
| SetBQBandPassCaps |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| This function directly sets the capacitors for this CAM. It |
| does not perform any validation of the data for correctness. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| FilterBiquad1 ot_FPAA1_FilterBiquad1 ot_FPAA1 |
| FilterBiquad2 ot_FPAA1_FilterBiquad2 ot_FPAA1 |
| FilterBiquad3 ot_FPAA2_FilterBiquad3 ot_FPAA2 |
| FilterBiquad4 ot_FPAA2_FilterBiquad4 ot_FPAA2 |
| FilterBiquad3 ot_FPAA3_FilterBiquad3 ot_FPAA3 |
| FilterBiquad4 ot_FPAA3_FilterBiquad4 ot_FPAA3 |
| FilterBiquad3 ot_FPAA4_FilterBiquad3 ot_FPAA4 |
| FilterBiquad4 ot_FPAA4_FilterBiquad4 ot_FPAA4 |
| FilterBiquad3 ot_FPAA5_FilterBiquad3 ot_FPAA5 |
| FilterBiquad4 ot_FPAA5_FilterBiquad4 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
void ot_SetBQBandPassCaps(ot_CAM cam, ot_Byte C2, ot_Byte C3, ot_Byte C4, ot_Byte CB1, ot_Byte CB2, ot_Byte CA1, ot_Byte CA2, ot_Byte Cp)
{
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_C2, C2);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_C3, C3);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_C4, C4);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CB1, CB1);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CB2, CB2);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CA1, CA1);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CA2, CA2);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_Cp, Cp);
}
/*================================================================*\
) Corner Frequency, Gain & Q (
\*================================================================*/
/*--------------------------------------------------------------*\
| SetBQBandPassFilterI |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| This function controls the center frequency [kHz], gain, and |
| Q of this filter. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| FilterBiquad1 ot_FPAA1_FilterBiquad1 ot_FPAA1 |
| FilterBiquad2 ot_FPAA1_FilterBiquad2 ot_FPAA1 |
| FilterBiquad3 ot_FPAA2_FilterBiquad3 ot_FPAA2 |
| FilterBiquad4 ot_FPAA2_FilterBiquad4 ot_FPAA2 |
| FilterBiquad3 ot_FPAA3_FilterBiquad3 ot_FPAA3 |
| FilterBiquad4 ot_FPAA3_FilterBiquad4 ot_FPAA3 |
| FilterBiquad3 ot_FPAA4_FilterBiquad3 ot_FPAA4 |
| FilterBiquad4 ot_FPAA4_FilterBiquad4 ot_FPAA4 |
| FilterBiquad3 ot_FPAA5_FilterBiquad3 ot_FPAA5 |
| FilterBiquad4 ot_FPAA5_FilterBiquad4 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
void ot_SetBQBandPassFilterI(ot_CAM cam, double Fo, double G, double Q)
{
static const double an_Pi = 3.1415926535897931;
static const double an_TwoPi = 6.2831853071795862;
static const int maxCA = 510;
static const int maxCB = 510;
int dCp, dC2, dC3, dC4, dCA, dCB;
int CA1, CA2, CB1, CB2;
int Cp=0, C2=0, C3=0, C4=0, CA=0, CB=0; //final low Q biquad values
double aFoa, aFoa2, aQ, aG0; //achieved parameter values
long clocka = ot_GetApexClockFrequency(cam, ot_CAMClock_ClockA);
double FCdiv2PI = clocka/an_TwoPi;
//Limits in this module are extremely complicated due to the interrelation of parameters
double G0 = G;
//Prewarp Fo (kHz) into Foa (Hz)
double Wo = 2.0*clocka*sin(an_Pi*Fo*1000.0/clocka);
double Foa = Wo /an_TwoPi;
// calculate normalized capacitor values
double nC2 = Wo / clocka;
//First calculate for low Q circuit
double err = 99999, bestErr1 = 9999;
double bestErr2 = 9999;
dCB = maxCB;
while(dCB>0)
{
dC3 = ot_AdjustCap(nC2*dCB);
dC4 = ot_AdjustCap(1.0*dCB*nC2/Q);
dCp = ot_AdjustCap(G0 * dC4);
aFoa2 = FCdiv2PI*dC3/dCB;
aQ = 1.0*dCB*nC2/dC4;
aG0 = 1.0* dCp/dC4;
err = aQ/Q + Q/aQ + aFoa2/Foa + Foa/aFoa2 + aG0/G0 + G0/aG0;
if (err < bestErr1)
{
bestErr1 = err;
C3 = dC3;
C4 = dC4;
Cp = dCp;
CB = dCB;
}
dCB--;
}
err = 99999;
dCA = maxCA;
while(dCA>0)
{
dC2 = ot_AdjustCap(nC2*nC2*CB*dCA/C3);
aFoa = FCdiv2PI*sqrt(1.0*dC2*C3/dCA/CB);
err = aFoa/Foa + Foa/aFoa;
if (err < bestErr2)
{
bestErr2 = err;
C2 = dC2;
CA = dCA;
}
dCA--;
}
CA1 = CA/2;
CA2 = CA - CA1;
CB1 = CB/2;
CB2 = CB - CB1;
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_C2, C2);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_C3, C3);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_C4, C4);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CA1, CA1);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CA2, CA2);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CB1, CB1);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_CB2, CB2);
ot_SetCapValue(cam, ot_okikaApex_FilterBiquad_Cp, Cp);
}
/*##################################################################*\
# #
# GainInv.cam #
# #
\*##################################################################*/
/*================================================================*\
) Gain (
\*================================================================*/
/*--------------------------------------------------------------*\
| fixed_setGainInv |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| A full fixed-point method for setting the gain of the module. |
| It accepts floating-point inputs and returns a floating-point |
| result. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| GainInv1 ot_FPAA1_GainInv1 ot_FPAA1 |
| GainInv2 ot_FPAA1_GainInv2 ot_FPAA1 |
| GainInv3 ot_FPAA2_GainInv3 ot_FPAA2 |
| GainInv4 ot_FPAA2_GainInv4 ot_FPAA2 |
| GainInv3 ot_FPAA3_GainInv3 ot_FPAA3 |
| GainInv4 ot_FPAA3_GainInv4 ot_FPAA3 |
| GainInv3 ot_FPAA4_GainInv3 ot_FPAA4 |
| GainInv4 ot_FPAA4_GainInv4 ot_FPAA4 |
| GainInv3 ot_FPAA5_GainInv3 ot_FPAA5 |
| GainInv4 ot_FPAA5_GainInv4 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
double ot_fixed_setGainInv(ot_CAM cam, double G)
{
ot_Byte cap1;
ot_Byte cap2;
ot_FixedChooseCapRatio(G, &cap1, &cap2);
ot_SetCapValue(cam, ot_okikaApex_GainInv_Cin,cap1);
ot_SetCapValue(cam, ot_okikaApex_GainInv_aCin,cap1);
ot_SetCapValue(cam, ot_okikaApex_GainInv_Cout,cap2);
ot_SetCapValue(cam, ot_okikaApex_GainInv_aCout,cap2);
return ot_FixedToFloat(ot_FixedDivide(ot_IntToFixed(cap1),ot_IntToFixed(cap2)));
}
/*--------------------------------------------------------------*\
| setGainInv |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| A full floating point method for setting the gain of this |
| module. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| GainInv1 ot_FPAA1_GainInv1 ot_FPAA1 |
| GainInv2 ot_FPAA1_GainInv2 ot_FPAA1 |
| GainInv3 ot_FPAA2_GainInv3 ot_FPAA2 |
| GainInv4 ot_FPAA2_GainInv4 ot_FPAA2 |
| GainInv3 ot_FPAA3_GainInv3 ot_FPAA3 |
| GainInv4 ot_FPAA3_GainInv4 ot_FPAA3 |
| GainInv3 ot_FPAA4_GainInv3 ot_FPAA4 |
| GainInv4 ot_FPAA4_GainInv4 ot_FPAA4 |
| GainInv3 ot_FPAA5_GainInv3 ot_FPAA5 |
| GainInv4 ot_FPAA5_GainInv4 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
double ot_setGainInv(ot_CAM cam, double G)
{
ot_Byte cap1;
ot_Byte cap2;
ot_ChooseCapRatio(G, &cap1, &cap2);
ot_SetCapValue(cam, ot_okikaApex_GainInv_Cin,cap1);
ot_SetCapValue(cam, ot_okikaApex_GainInv_aCin,cap1);
ot_SetCapValue(cam, ot_okikaApex_GainInv_Cout,cap2);
ot_SetCapValue(cam, ot_okikaApex_GainInv_aCout,cap2);
return (double) cap1 / (double) cap2;
}
/*##################################################################*\
# #
# PeriodicWave.cam #
# #
\*##################################################################*/
/*================================================================*\
) Waveform Control (
\*================================================================*/
/*--------------------------------------------------------------*\
| changeLUTReset |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| This function allows a change in the counter reset value for |
| this module. It allows for varying table operations without |
| having to reload the table. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| PeriodicWave1 ot_FPAA1_PeriodicWave1 ot_FPAA1 |
| PeriodicWave2 ot_FPAA2_PeriodicWave2 ot_FPAA2 |
| PeriodicWave2 ot_FPAA3_PeriodicWave2 ot_FPAA3 |
| PeriodicWave2 ot_FPAA4_PeriodicWave2 ot_FPAA4 |
| PeriodicWave2 ot_FPAA5_PeriodicWave2 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
void ot_changeLUTReset(ot_CAM cam, ot_Byte ResetValue)
{
ot_SetApexCounterRollOver(cam, ResetValue);
}
/*--------------------------------------------------------------*\
| setWaveformTable |
+----------------------------------------------------------------+
| |
| Description |
| ------------------------------ |
| This function sets up the Waveform Generator values for |
| operation over time and reset value. |
| |
| |
| Instance Name cam chip |
| ------------------------------------------------------------ |
| PeriodicWave1 ot_FPAA1_PeriodicWave1 ot_FPAA1 |
| PeriodicWave2 ot_FPAA2_PeriodicWave2 ot_FPAA2 |
| PeriodicWave2 ot_FPAA3_PeriodicWave2 ot_FPAA3 |
| PeriodicWave2 ot_FPAA4_PeriodicWave2 ot_FPAA4 |
| PeriodicWave2 ot_FPAA5_PeriodicWave2 ot_FPAA5 |
| |
\*--------------------------------------------------------------*/
void ot_setWaveformTable(ot_CAM cam, double* Values, int Size, ot_Byte ResetValue)
{
ot_Byte LUTTable[256];
int loop;
double maxV = 0.0;
int Clut = 128, Cout = 128;
if (Size > 256) Size = 256;
for (loop = 0; loop < Size; loop++)
if (maxV < fabs(Values[loop]))
maxV = fabs(Values[loop]);
if (maxV > 0)
Cout = ot_AdjustCap(127.0 * 2.0 / maxV);
for (loop = 0; loop < Size; loop++)
{
Clut = ot_AdjustCap(128.0 + Values[loop] * Cout / 2.0);
LUTTable[loop] = Clut;
}
ot_LoadLUT(cam, LUTTable, 0, Size);
ot_SetCapValue(cam, ot_okikaApex_PeriodicWave_Cout, Cout);
ot_SetApexCounterRollOver(cam, ResetValue);
}