-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathdeltaADC.cpp
127 lines (119 loc) · 2.72 KB
/
deltaADC.cpp
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
#include <SPI.h>
#include "fancyLock.h"
#include "testPins.h"
#include "deltaADC.h"
#include "myPwm.h"
/**
*
* @param rate
* @param scale
* @param nbSamples
* @return
*/
bool DeltaADC::setup(const adc_smp_rate rate, const DSOADC::Prescaler scale, const int nbSamples)
{
_rate=rate;
_scale=scale;
return _pA.prepareDualDmaSample(_pB,_rate,_scale,nbSamples);
}
/**
*
* @param nbSamples
* @param ptr
* @param period
* @return
*/
bool DeltaADC::get(int &nbSamples, uint16_t **samples, float &period)
{
if(!_pA.finishDmaSample(nbSamples,samples))
{
return false;
}
nbSamples/=2; // we deal with pairs from here on
_pA.disconnect();
_pB.disconnect();
_pA.dualSimulatenousDelta(nbSamples,*samples);
switch(_scale)
{
case DSOADC::ADC_PRESCALER_2 : period=2;break;
case DSOADC::ADC_PRESCALER_4 : period=4;break;
case DSOADC::ADC_PRESCALER_6 : period=6;break;
case DSOADC::ADC_PRESCALER_8 : period=8;break;
default:
xAssert(0);
break;
}
period=(float)F_CPU/period;
// now divide by rate
float r;
switch(_rate)
{
case ADC_SMPR_1_5 : r=1.5;break;
case ADC_SMPR_7_5 : r=7.5;break;
case ADC_SMPR_13_5 : r=13.5;break;
case ADC_SMPR_28_5 : r=28.5;break;
case ADC_SMPR_41_5 : r=41.5;break;
case ADC_SMPR_55_5 : r=55.5;break;
case ADC_SMPR_71_5 : r=71.5;break;
case ADC_SMPR_239_5 : r=239.5;break;
default:
xAssert(0);
break;
}
period=period/(r+12.5);
period=1/period;
return true;
}
/**
*
* @param A
* @param B
*/
DeltaADCTime::DeltaADCTime(TestPin &A, TestPin &B) :DeltaADC(A,B)
{
}
/**
*
*/
DeltaADCTime::~DeltaADCTime()
{
}
/**
*
* @param frequency
* @param nbSamples
* @return
*/
extern bool frequencyToRateScale(int fq, DSOADC::Prescaler &scaler, adc_smp_rate &rate);
bool DeltaADCTime::setup(int frequency,const int nbSamples)
{
_fq=frequency;
DSOADC::Prescaler scaler;
adc_smp_rate rate;
DSOADC::frequencyToRateScale(_fq,scaler,rate);
return _pA.prepareDualTimeSample(_fq,_pB,rate,scaler,nbSamples);
}
/**
*
* @param nbSamples
* @param ptr
* @param period
* @return
*/
#include "testerGfx.h"
bool DeltaADCTime::get(int &nbSamples, uint16_t **ptr, float &period)
{
int timerScaler;
int timerOvf;
int cmp;
pwmGetScaleOverFlowCompare(_fq,timerScaler, timerOvf,cmp);
if(!_pA.finishDmaSample(nbSamples,ptr))
{
return false;
}
nbSamples/=2; // we deal with pairs
_pA.dualSimulatenousDelta(nbSamples,*ptr);
period=1./_fq;
return true;
}
// EOF