|
5 | 5 | #define BUILD_DATE __DATE__ |
6 | 6 | #define BUILD_TIME __TIME__ |
7 | 7 |
|
| 8 | +extern "C" { |
8 | 9 | #define XCP_MAKE_EPK(name) const char Xcp_EEPROM_Kennung[] = name " " BUILD_DATE " " BUILD_TIME |
9 | 10 |
|
10 | | -XCP_MAKE_EPK("ArduinoXCP V1.1.0"); |
| 11 | + XCP_MAKE_EPK("ArduinoXCP V1.1.0"); |
| 12 | +} |
11 | 13 |
|
12 | 14 | // Measurements. |
13 | 15 | volatile uint8_t dummy; |
@@ -58,9 +60,110 @@ XCP_DAQ_DEFINE_MEASUREMENT_VARIABLE(dummy), XCP_DAQ_DEFINE_MEASUREMENT_VARIABLE( |
58 | 60 |
|
59 | 61 | __attribute__((section(".measurements"))) volatile float values[8]; |
60 | 62 |
|
| 63 | +unsigned long time_point; |
| 64 | +unsigned long elapsed_time; |
| 65 | + |
| 66 | +enum WaveformType { |
| 67 | + SINE, |
| 68 | + TRIANGLE, |
| 69 | + SQUARE, |
| 70 | + SAWTOOTH |
| 71 | +}; |
| 72 | + |
| 73 | +inline float amplitiude_value(float base = 1.0F, float amplification = 0.0F) { |
| 74 | + return base * (pow(10.0F, amplification / 20.0F)); |
| 75 | +} |
| 76 | + |
| 77 | +class WaveformGenerator { |
| 78 | + private: |
| 79 | + |
| 80 | + float phase = 0.0F; |
| 81 | + float phase_increment = 0.0F; |
| 82 | + float amplitude = 1.0F; |
| 83 | + WaveformType type = SINE; |
| 84 | + |
| 85 | + public: |
| 86 | + |
| 87 | + WaveformGenerator(WaveformType t, float freq, float sample_rate, float amp = 1.0F, float p = 0.0F) : |
| 88 | + type(t), phase_increment(freq / sample_rate), amplitude(amp), phase(p) { |
| 89 | + } |
| 90 | + |
| 91 | + void setFrequency(float freq, float sample_rate) { |
| 92 | + phase_increment = freq / sample_rate; |
| 93 | + } |
| 94 | + |
| 95 | + void setAmplitude(float amp) { |
| 96 | + amplitude = amp; |
| 97 | + } |
| 98 | + |
| 99 | + void setWaveform(WaveformType t) { |
| 100 | + type = t; |
| 101 | + } |
| 102 | + |
| 103 | + float nextSample() { |
| 104 | + phase += phase_increment; |
| 105 | + if (phase >= 1.0F) |
| 106 | + phase -= 1.0F; |
| 107 | + |
| 108 | + float value = 0.0F; |
| 109 | + switch (type) { |
| 110 | + case SINE: |
| 111 | + value = ::sin(2.0F * PI * phase); |
| 112 | + break; |
| 113 | + case TRIANGLE: |
| 114 | + value = 2.0F * abs(2.0F * (phase - floor(phase + 0.5F))) - 1.0F; |
| 115 | + break; |
| 116 | + case SQUARE: |
| 117 | + value = (phase < 0.5F) ? 1.0F : -1.0F; |
| 118 | + break; |
| 119 | + case SAWTOOTH: |
| 120 | + value = 2.0F * (phase - 0.5F); |
| 121 | + break; |
| 122 | + } |
| 123 | + |
| 124 | + return amplitude * value; |
| 125 | + } |
| 126 | +}; |
| 127 | + |
| 128 | +const uint32_t AMPLITUDE_SCALE = 32.0F; |
| 129 | + |
| 130 | +auto wg1 = WaveformGenerator(SINE, 1.0f, 100.0f, amplitiude_value(AMPLITUDE_SCALE)); |
| 131 | +auto wg2 = WaveformGenerator(SINE, 1.0f, 100.0f, amplitiude_value(AMPLITUDE_SCALE, -3.0F), 90.0); |
| 132 | +auto wg3 = WaveformGenerator(TRIANGLE, 0.5f, 100.0f, amplitiude_value(AMPLITUDE_SCALE, -6.0F)); |
| 133 | +auto wg4 = WaveformGenerator(SAWTOOTH, 0.5f, 100.0f, amplitiude_value(AMPLITUDE_SCALE, -6.0F), -90.0); |
| 134 | + |
61 | 135 | void setup() { |
| 136 | + dummy = 0x55; |
| 137 | + voltage1 = 90.0f; |
| 138 | + voltage2 = 180.0f; |
| 139 | + voltage3 = 270.0f; |
| 140 | + voltage4 = 360.0f; |
| 141 | + |
| 142 | + time_point = micros(); |
62 | 143 | Xcp_Init(); |
63 | 144 | } |
64 | 145 |
|
65 | 146 | void loop() { |
| 147 | + unsigned long start = 0; |
| 148 | + unsigned long stop = 0; |
| 149 | + |
| 150 | + XcpTl_MainFunction(); |
| 151 | + Xcp_MainFunction(); |
| 152 | + |
| 153 | + if ((micros() - time_point) >= 10 * 1000) { |
| 154 | + time_point = micros(); |
| 155 | + start = micros(); |
| 156 | + |
| 157 | + voltage1 = wg1.nextSample(); |
| 158 | + voltage2 = wg2.nextSample(); |
| 159 | + voltage3 = wg3.nextSample(); |
| 160 | + voltage4 = wg4.nextSample(); |
| 161 | + |
| 162 | + XcpDaq_TriggerEvent(0); |
| 163 | + dummy++; |
| 164 | + |
| 165 | + stop = micros(); |
| 166 | + elapsed_time = stop - start; |
| 167 | + time_point -= elapsed_time; |
| 168 | + } |
66 | 169 | } |
0 commit comments