64,6 → 64,9 |
// For reading and writing acc. meter offsets. |
#include "eeprom.h" |
|
// For DebugOut.Digital |
#include "output.h" |
|
/* |
* For each A/D conversion cycle, each analog channel is sampled a number of times |
* (see array channelsForStates), and the results for each channel are summed. |
241,6 → 244,10 |
} |
} |
|
/* |
* Min.: 0 |
* Max: About 106 * 240 + 2047 = 27487; it is OK with just a 16 bit type. |
*/ |
uint16_t getSimplePressure(int advalue) { |
return (uint16_t)OCR0A * (uint16_t)rangewidth + advalue; |
} |
308,14 → 315,17 |
if (pressureAutorangingWait) { |
//A range switch was done recently. Wait for steadying. |
pressureAutorangingWait--; |
DebugOut.Analog[27] = (uint16_t)OCR0A; |
DebugOut.Analog[31] = simpleAirPressure; |
break; |
} |
|
rawAirPressure = sensorInputs[AD_AIRPRESSURE]; |
if (rawAirPressure < MIN_RAWPRESSURE) { |
// value is too low, so decrease voltage on the op amp minus input, making the value higher. |
newrange = OCR0A - (MAX_RAWPRESSURE - rawAirPressure) / rangewidth - 1; |
newrange = OCR0A - (MAX_RAWPRESSURE - MIN_RAWPRESSURE) / (rangewidth * 4); // 4; // (MAX_RAWPRESSURE - rawAirPressure) / (rangewidth * 2) + 1; |
if (newrange > MIN_RANGES_EXTRAPOLATION) { |
pressureAutorangingWait = (OCR0A - newrange) * AUTORANGE_WAIT_FACTOR; |
pressureAutorangingWait = (OCR0A - newrange) * AUTORANGE_WAIT_FACTOR; // = OCRA0 - OCRA0 + |
OCR0A = newrange; |
} else { |
if (OCR0A) { |
326,7 → 336,7 |
} else if (rawAirPressure > MAX_RAWPRESSURE) { |
// value is too high, so increase voltage on the op amp minus input, making the value lower. |
// If near the end, make a limited increase |
newrange = OCR0A + (rawAirPressure - MIN_RAWPRESSURE) / rangewidth - 1; |
newrange = OCR0A + (MAX_RAWPRESSURE - MIN_RAWPRESSURE) / (rangewidth * 4); // 4; // (rawAirPressure - MIN_RAWPRESSURE) / (rangewidth * 2) - 1; |
if (newrange < MAX_RANGES_EXTRAPOLATION) { |
pressureAutorangingWait = (newrange - OCR0A) * AUTORANGE_WAIT_FACTOR; |
OCR0A = newrange; |
340,30 → 350,34 |
|
// Even if the sample is off-range, use it. |
simpleAirPressure = getSimplePressure(rawAirPressure); |
DebugOut.Analog[27] = (uint16_t)OCR0A; |
DebugOut.Analog[31] = simpleAirPressure; |
|
if (simpleAirPressure < MIN_RANGES_EXTRAPOLATION * rangewidth) { |
// Danger: pressure near lower end of range. If the measurement saturates, the |
// copter may climb uncontrolled... Simulate a drastic reduction in pressure. |
airPressureSum += (int16_t)MIN_RANGES_EXTRAPOLATION * rangewidth + (simpleAirPressure - (int32_t)MIN_RANGES_EXTRAPOLATION * rangewidth) * PRESSURE_EXTRAPOLATION_COEFF; |
// copter may climb uncontrolledly... Simulate a drastic reduction in pressure. |
airPressureSum += (int16_t)MIN_RANGES_EXTRAPOLATION * rangewidth + (simpleAirPressure - (int16_t)MIN_RANGES_EXTRAPOLATION * rangewidth) * PRESSURE_EXTRAPOLATION_COEFF; |
} else if (simpleAirPressure > MAX_RANGES_EXTRAPOLATION * rangewidth) { |
// Danger: pressure near upper end of range. If the measurement saturates, the |
// copter may fall uncontrolled... Simulate a drastic increase in pressure. |
airPressureSum += (int16_t)MAX_RANGES_EXTRAPOLATION * rangewidth + (simpleAirPressure - (int32_t)MAX_RANGES_EXTRAPOLATION * rangewidth) * PRESSURE_EXTRAPOLATION_COEFF; |
// copter may descend uncontrolledly... Simulate a drastic increase in pressure. |
airPressureSum += (int16_t)MAX_RANGES_EXTRAPOLATION * rangewidth + (simpleAirPressure - (int16_t)MAX_RANGES_EXTRAPOLATION * rangewidth) * PRESSURE_EXTRAPOLATION_COEFF; |
} else { |
// normal case. |
airPressureSum += simpleAirPressure; |
// If AIRPRESSURE_SUMMATION_FACTOR is an odd number we only want to add half the double sample. |
// The 2 cases above (end of range) are ignored for this. |
if (pressureMeasurementCount == AIRPRESSURE_SUMMATION_FACTOR - 1) |
airPressureSum += simpleAirPressure / 2; |
else |
airPressureSum += simpleAirPressure; |
} |
|
|
// 2 samples were added. |
pressureMeasurementCount += 2; |
if (pressureMeasurementCount == AIRPRESSURE_SUMMATION_FACTOR) { |
if (pressureMeasurementCount >= AIRPRESSURE_SUMMATION_FACTOR) { |
filteredAirPressure = (filteredAirPressure * (AIRPRESSURE_FILTER-1) + airPressureSum + AIRPRESSURE_FILTER/2) / AIRPRESSURE_FILTER; |
pressureMeasurementCount = airPressureSum = 0; |
} |
|
// DebugOut.Analog[14] = OCR0A; |
// DebugOut.Analog[15] = simpleAirPressure; |
DebugOut.Analog[11] = UBat; |
DebugOut.Analog[27] = acc[Z]; |
break; |
|
case 15: |
425,6 → 439,7 |
// Battery. The measured value is: (V * 1k/11k)/3v * 1024 = 31.03 counts per volt (max. measurable is 33v). |
// This is divided by 3 --> 10.34 counts per volt. |
UBat = (3 * UBat + sensorInputs[AD_UBAT] / 3) / 4; |
DebugOut.Analog[11] = UBat; |
analogDataReady = 1; // mark |
ADCycleCount++; |
// Stop the sampling. Cycle is over. |
483,9 → 498,6 |
// airPressureSum = simpleAirPressure * (AIRPRESSURE_SUMMATION_FACTOR/2); |
// pressureMeasurementCount = 0; |
|
// Experiment! |
// filteredAirPressureOffset = filteredAirPressure - 1000L; |
|
Delay_ms_Mess(100); |
} |
|
530,29 → 542,28 |
|
// Set the feedback so that air pressure ends up in the middle of the range. |
// (raw pressure high --> OCR0A also high...) |
// OCR0A += (rawAirPressure - 512) / rangewidth; |
// Delay_ms_Mess(500); |
|
/* |
pressureDiff = 0; |
// DebugOut.Analog[16] = rawAirPressure; |
OCR0A += ((rawAirPressure - 1024) / rangewidth) - 1; |
Delay_ms_Mess(1000); |
|
#define PRESSURE_CAL_CYCLE_COUNT 2 |
for (i=0; i<PRESSURE_CAL_CYCLE_COUNT; i++) { |
pressureDiff = 0; |
// DebugOut.Analog[16] = rawAirPressure; |
|
#define PRESSURE_CAL_CYCLE_COUNT 5 |
for (i=0; i<PRESSURE_CAL_CYCLE_COUNT; i++) { |
savedRawAirPressure = rawAirPressure; |
OCR0A++; |
Delay_ms_Mess(200); |
OCR0A+=2; |
Delay_ms_Mess(500); |
// raw pressure will decrease. |
pressureDiff += (savedRawAirPressure - rawAirPressure); |
|
savedRawAirPressure = rawAirPressure; |
OCR0A--; |
Delay_ms_Mess(200); |
OCR0A-=2; |
Delay_ms_Mess(500); |
// raw pressure will increase. |
pressureDiff += (rawAirPressure - savedRawAirPressure); |
} |
|
// DebugOut.Analog[16] = |
rangewidth = (pressureDiff + PRESSURE_CAL_CYCLE_COUNT * 2 - 1) / (PRESSURE_CAL_CYCLE_COUNT * 2); |
} |
|
rangewidth = (pressureDiff + PRESSURE_CAL_CYCLE_COUNT * 2 * 2 - 1) / (PRESSURE_CAL_CYCLE_COUNT * 2 * 2); |
DebugOut.Analog[27] = rangewidth; |
*/ |
} |