@@ -40,12 +40,18 @@ namespace psu {
40
40
// //////////////////////////////////////////////////////////////////////////////
41
41
42
42
#if defined(EEZ_PLATFORM_STM32)
43
+
43
44
static const uint8_t DATA_BUFFER_A = 0B00010000 ;
44
45
static const uint8_t DATA_BUFFER_B = 0B00100100 ;
45
46
46
47
static const uint32_t CONF_DCP405_R2B11_RAMP_DURATION_USEC = 4000 ; // 4 ms
48
+
49
+ #if CONF_SURVIVE_MODE
50
+ static const uint32_t CONF_I_RAMP_DURATION_USEC = 300000 ; // 300 ms
47
51
#endif
48
52
53
+ #endif // EEZ_PLATFORM_STM32
54
+
49
55
#if defined(EEZ_PLATFORM_SIMULATOR)
50
56
extern float g_uSet[CH_MAX];
51
57
extern float g_iSet[CH_MAX];
@@ -120,28 +126,47 @@ bool DigitalAnalogConverter::test(IOExpander &ioexp, AnalogDigitalConverter &adc
120
126
121
127
void DigitalAnalogConverter::tick () {
122
128
#if defined(EEZ_PLATFORM_STM32)
123
- if (m_isRampActive ) {
129
+ if (m_uIsRampActive ) {
124
130
uint16_t value;
125
131
126
132
uint32_t tickCountUsec = micros ();
127
133
128
- uint32_t diff = tickCountUsec - m_rampStartTimeUsec ;
134
+ uint32_t diff = tickCountUsec - m_uRampStartTimeUsec ;
129
135
if (diff >= CONF_DCP405_R2B11_RAMP_DURATION_USEC) {
130
- value = m_rampTargetValue ;
131
- m_isRampActive = false ;
136
+ value = m_uRampTargetValue ;
137
+ m_uIsRampActive = false ;
132
138
} else {
133
- value = m_rampTargetValue * diff / CONF_DCP405_R2B11_RAMP_DURATION_USEC;
139
+ value = m_uRampTargetValue * diff / CONF_DCP405_R2B11_RAMP_DURATION_USEC;
134
140
}
135
141
136
142
set (DATA_BUFFER_B, value, FROM_RAMP);
137
143
}
138
- #endif
144
+
145
+ #if CONF_SURVIVE_MODE
146
+ if (m_iIsRampActive) {
147
+ uint16_t value;
148
+
149
+ uint32_t tickCountUsec = micros ();
150
+
151
+ uint32_t diff = tickCountUsec - m_iRampStartTimeUsec;
152
+ if (diff >= CONF_I_RAMP_DURATION_USEC) {
153
+ value = m_iRampTargetValue;
154
+ m_iIsRampActive = false ;
155
+ } else {
156
+ value = (uint64_t )m_iRampTargetValue * diff / CONF_I_RAMP_DURATION_USEC;
157
+ }
158
+
159
+ set (DATA_BUFFER_A, value, FROM_RAMP);
160
+ }
161
+ #endif // CONF_SURVIVE_MODE
162
+
163
+ #endif // EEZ_PLATFORM_STM32
139
164
}
140
165
141
166
bool DigitalAnalogConverter::isOverHwOvpThreshold () {
142
167
static const float CONF_OVP_HW_VOLTAGE_THRESHOLD = 1 .0f ;
143
168
Channel &channel = Channel::get (channelIndex);
144
- float u_set = remap (m_rampLastValue , (float )DAC_MIN, channel.params .U_MIN , (float )DAC_MAX, channel.params .U_MAX );
169
+ float u_set = remap (m_uRampLastValue , (float )DAC_MIN, channel.params .U_MIN , (float )DAC_MAX, channel.params .U_MAX );
145
170
return u_set > channel.getCalibratedVoltage (CONF_OVP_HW_VOLTAGE_THRESHOLD);
146
171
}
147
172
@@ -206,19 +231,41 @@ void DigitalAnalogConverter::set(uint8_t buffer, uint16_t value, RampOption ramp
206
231
g_slots[slotIndex]->moduleRevision <= MODULE_REVISION_DCP405_R2B11 &&
207
232
!ramp::isActive (channel)
208
233
) {
209
- m_isRampActive = true ;
210
- m_rampTargetValue = value;
234
+ m_uIsRampActive = true ;
235
+ m_uRampTargetValue = value;
211
236
value = 0 ;
212
237
rampOption = FROM_RAMP;
213
- m_rampStartTimeUsec = micros ();
238
+ m_uRampStartTimeUsec = micros ();
239
+ }
240
+
241
+ m_uRampLastValue = value;
242
+
243
+ if (rampOption != FROM_RAMP) {
244
+ m_uIsRampActive = false ;
245
+ }
246
+ }
247
+ #if CONF_SURVIVE_MODE
248
+ else {
249
+ if (
250
+ rampOption != FROM_RAMP &&
251
+ !m_testing &&
252
+ CONF_I_RAMP_DURATION_USEC > 0 &&
253
+ !ramp::isActive (channel)
254
+ ) {
255
+ m_iIsRampActive = true ;
256
+ m_iRampTargetValue = value;
257
+ value = m_iRampLastValue;
258
+ rampOption = FROM_RAMP;
259
+ m_iRampStartTimeUsec = micros ();
214
260
}
215
261
216
- m_rampLastValue = value;
262
+ m_iRampLastValue = value;
217
263
218
264
if (rampOption != FROM_RAMP) {
219
- m_isRampActive = false ;
265
+ m_iIsRampActive = false ;
220
266
}
221
267
}
268
+ #endif // CONF_SURVIVE_MODE
222
269
223
270
uint8_t data[3 ];
224
271
uint8_t result[3 ];
0 commit comments