Ну и что бы не голословить вот код, точнее сам алгоритм.
Зеленым - это как раз алгоритм плавного изменения усиления каскадов в обеих ару, который убрал этот эффект, что у вас на записи.
void agcDacSelectLevel(uint8_t bank) {
adcSlaboSumValue = 0;
adcSilaSumValue = 0;
uint8_t s = 0;
uint8_t po = FRAME_SIZE / 2 - 1;
if (agcCountSila) agcCountSila--;
if (agcCountSlabo) agcCountSlabo--;
if (agcCountDown) agcCountDown--;
if (agcCountDownSila) agcCountDownSila--;
if (agcCountSlaboUp) agcCountSlaboUp--;
if (bank == 2) {
s = FRAME_SIZE / 2;
po = FRAME_SIZE - 1;
}
for (s; s <= po; s++) {
adcSlaboSumValue += IN_Buffer_slabo[ s ];
adcSilaSumValue += IN_Buffer_sila[ s ];
}
adcSlaboSumValue /= FRAME_SIZE / 2;
adcSilaSumValue /= FRAME_SIZE / 2;
//sila
if ((adcSilaSumValue <= ADC_LEVEL_NORM_SILA + ADC_LEVEL_DELTA_SILA &&
adcSilaSumValue >= ADC_LEVEL_NORM_SILA)
) { agcCountSila = AGC_HOLD_TIME_SILA; } //если сигнал еще высокий то продолжаем задержку
if ((adcSilaSumValue >= ADC_LEVEL_NORM_SILA + ADC_LEVEL_DELTA_SILA ||
adcSilaSumValue <= ADC_LEVEL_NORM_SILA - ADC_LEVEL_DELTA_SILA / 2)
) {
if (adcSilaSumValue >= ADC_LEVEL_NORM_SILA + ADC_LEVEL_DELTA_SILA) {//если растет на входе
uint16_t step;
agcCountSila = AGC_HOLD_TIME_SILA;
if ((float) (adcSilaSumValue) / ADC_LEVEL_NORM_SILA > 1.15) {
step = (uint8_t) ((float) (adcSilaSumValue) / ADC_LEVEL_NORM_SILA * 40);
} else step = 1;
if (nowDacLevelSila + step <= DAC_LEVEL_MAX_SILA) { nowDacLevelSila += step; }
else { nowDacLevelSila = DAC_LEVEL_MAX_SILA; }
agcDacWrite(nowDacLevelSila, 1);
// agcDacWrite(0, 1);
} else { //если падает
if (!agcCountSila) { //если задержка закончилась, поднимать усиление
uint8_t step;
if ((float) ADC_LEVEL_NORM_SILA / (float) adcSilaSumValue > 1.
{
step = (uint8_t) (ADC_LEVEL_NORM_SILA / (float) (adcSilaSumValue) * 20);
//step = 1;
} else step = 1;
if (!agcCountDown) {
if (nowDacLevelSila - step >= DAC_LEVEL_MIN_SILA) { nowDacLevelSila -= step; }
else { nowDacLevelSila = DAC_LEVEL_MIN_SILA; }
agcDacWrite(nowDacLevelSila, 1);
// agcDacWrite(0, 1);
agcCountDownSila = 0;
}
}
}
}
//
//
//slabo
//
//
if ((adcSlaboSumValue <= ADC_LEVEL_NORM_SLABO + ADC_LEVEL_DELTA_SLABO && adcSlaboSumValue >= ADC_LEVEL_NORM_SLABO)
) { agcCountSlabo = AGC_HOLD_TIME_SLABO; } //если сигнал еще высокий то продолжаем задержку
if ((adcSlaboSumValue > ADC_LEVEL_NORM_SLABO + ADC_LEVEL_DELTA_SLABO ||
adcSlaboSumValue < ADC_LEVEL_NORM_SLABO)
) {
if (adcSlaboSumValue >= ADC_LEVEL_NORM_SLABO + ADC_LEVEL_DELTA_SLABO) {//если растет на входе
agcCountSlabo = AGC_HOLD_TIME_SLABO;
uint16_t step = 1;
if ((float) (adcSlaboSumValue) / ADC_LEVEL_NORM_SLABO > 1.15) {
step = (uint8_t) ((float) (adcSlaboSumValue) / ADC_LEVEL_NORM_SLABO * 20);
// step = 1;
} else step = 1;
if (!agcCountSlaboUp) {//задержка на возрастание
if (nowDacLevelSlabo + step <= DAC_LEVEL_MAX_SLABO) { nowDacLevelSlabo += step; }
else { nowDacLevelSlabo = DAC_LEVEL_MAX_SLABO; }
// agcDacWrite(1250, 0);
agcDacWrite(nowDacLevelSlabo, 0);
agcCountSlaboUp = 0;// const задержка на возрастание
}
} else { //если падает
if (!agcCountSlabo) {
uint8_t step;
if ((float) ADC_LEVEL_NORM_SLABO / (float) adcSlaboSumValue > 1.9) {
step = (uint8_t) ((ADC_LEVEL_NORM_SLABO / (float) (adcSlaboSumValue)) * 25);
// step = 5;
} else {
if ((float) ADC_LEVEL_NORM_SLABO / (float) adcSlaboSumValue > 1.05) {
step = (uint8_t) ((ADC_LEVEL_NORM_SLABO / (float) (adcSlaboSumValue)) * 10);
//step = 1;
} else {
step = 1;
}
}
if (!agcCountDown) { //плавное отпускание
if (nowDacLevelSlabo - step >= DAC_LEVEL_MIN_SLABO) { nowDacLevelSlabo -= step; }
else { nowDacLevelSlabo = DAC_LEVEL_MIN_SLABO; }
agcDacWrite(nowDacLevelSlabo, 0);
//agcDacWrite(1250, 0);
agcCountDown = 10;
}
}
}
}
if (skip) skip = ~skip;
// char buf[20];
// GUI_SetFont(&GUI_Font8x16);
// sprintf(buf, "%04d", (int) adcSilaSumValue / FRAME_SIZE);
// GUI_DispStringAt(buf, 10, 70);
// sprintf(buf, "%04d", (int) adcSlaboSumValue);
// GUI_DispStringAt(buf, 10, 150);
}