Очередная версия процедуры поиска.
void tuner_auto_start(void) //auto-tune
{
if (pttYN && tunerAutoStartYN) { //todo потом добавить проверку на наличие тона
if (tunerAutoJustStartedYN) {//рутина перед стартом
tunerAutoJustStartedYN = 0;
tunerTuningStep = 0;//этапы тюнинга
tunerTempValueIdx = 0;//индекс прохода во время поиска куда подключить кондер
tuner_L_or_C_YN = 0xff;// 0-тюним L, ff-тюнем С
tunerBedIterationCount=5;//сколько перезапусков для поиска
tunerNoGoodYN = 0; // итерация по Л С оба плохие 2=плохо 0=сначала
/*
// if (v_to_dbW(SWR_ch_value[1]) - v_to_dbW(SWR_ch_value[1]) < 3) {
// tunerAutoStartYN = 0;
// warningOnDisplay((uint8_t *) " HI SWR >6. Check Ant ");
// return;
// }
// if (v_to_dbW(SWR_ch_value[0]) < 0) {
// tunerAutoStartYN = 0;
// warningOnDisplay((uint8_t *) " Need MORE power or Tone. ");
// return;
// }
*/
if (v_to_dbW(SWR_ch_value[0]) > 15) {
tunerAutoStartYN = 0;
warningOnDisplay((uint8_t *) " Need less 13dbW power. ");
return;
}
warningOnDisplay((uint8_t *) " Tuning... ");
tunerMore50 = 0;//итерации в 0 начнем все сначала
tunerCircleL = 0;
///установка степа в зависимости от диапазона
if (nowBandIsNumber < 3) {
tunerStepL = 2;
tunerStepC = 8;
tunerMaxC = 255; //стартовая емкость
}
if (nowBandIsNumber >= 3 && nowBandIsNumber < 5) {
tunerStepL = 1;
tunerStepC = 2;
tunerMaxC = 200;//стартовая емкость
}
if (nowBandIsNumber >= 5 && nowBandIsNumber < 7) {
tunerStepL = 1;
tunerStepC = 2;
tunerMaxC = 150;//стартовая емкость
}
if (nowBandIsNumber >= 7) {
tunerStepL = 1;
tunerStepC = 2;
tunerMaxC = 127;//стартовая емкость
}
tunerCircleL = tunerStepL;
tunerCircleC = tunerMaxC;
//обнулим значения до старта (с учетом диапазона)
tunerBeforeValueLC[nowBandIsNumber][0] = 0;
tunerBeforeValueLC[nowBandIsNumber][1] = tunerMaxC;
tunerBeforeValueLC[nowBandIsNumber][2] = 0;
//первое и текущее -лучшее значения
tunerLastBestPSR[0] = 0;//power
tunerLastBestPSR[1] = 0;//swr
tunerLastBestPSR[2] = 0;//RL
tunerLastBestPSR[3] = tunerMore50;//кондер
}//конец рутины
//
//
//ВЫХОД если все прошел то выход
//
//
if (!tunerCircleC && tunerCircleL == 127) { //C=0 L=127
warningOnDisplay((uint8_t *) " Tuner has MAX LC ");
return;
}
//
if ((100 * (v_to_dbW(SWR_ch_value[0]) - v_to_dbW(SWR_ch_value[1]))) >= tunerTargetRL) {
tunerAutoStartYN = 0;
warningOnDisplay((uint8_t *) " Tuner OK ");
tuner_write(tunerBeforeValueLC[nowBandIsNumber][2] ?
(uint8_t) (tunerBeforeValueLC[nowBandIsNumber][0] | 0x80)
://подставим бит кондера
(uint8_t) (tunerBeforeValueLC[nowBandIsNumber][0] & 0x7f),
(uint8_t) tunerBeforeValueLC[nowBandIsNumber][1]);
return;
}
//
//
//analyse
//
//
read_swr_tuner();//read swr ADC
rl = SWR_ch_value[0] - SWR_ch_value[1];
if (rl >> 2 >= tunerLastBestPSR[2] >> 2 || (!tunerLastBestPSR[0] && !tunerLastBestPSR[1])
) {//если рл лучше тогда сохраним это результат (загрубили на ..) или начало
//ADC
tunerLastBestPSR[0] = SWR_ch_value[0];//power uV
tunerLastBestPSR[1] = SWR_ch_value[1];//reflected uV
tunerLastBestPSR[2] = rl;//RL uV
tunerLastBestPSR[3] = tunerMore50;//кондер
//L C C50
tunerBeforeValueLC[nowBandIsNumber][0] = tunerCircleL;
tunerBeforeValueLC[nowBandIsNumber][1] = tunerCircleC;
tunerBeforeValueLC[nowBandIsNumber][2] = tunerMore50;
tunerNoGoodYN = 0; // итерация по Л С оба плохие 2=плохо 0=с начала
tunerBedIterationCount=5;//сколько перезапусков для поиска
//условие выхода из настройки
} else { //если хуже вариант (только основной итерации)
if (tunerTuningStep) {
if (tunerNoGoodYN < 2) {// 2=плохо 0=с начала
if (tuner_L_or_C_YN && tunerStepC)//вернем С назад и еще раз но с Л
tunerCircleC =(tunerCircleC+tunerStepC<0xff) ? (tunerCircleC+tunerStepC):(uint8_t)0xff;
if (!tuner_L_or_C_YN && tunerStepL) //вернем Л назад и еще раз с С
tunerCircleL = (tunerCircleL - tunerStepL >= 0) ? (tunerCircleL - tunerStepL) : (uint8_t) 0;
tunerNoGoodYN++;// 2=плохо
tuner_L_or_C_YN = ~tuner_L_or_C_YN; // 0-тюним L, ff-тюнем С меняем местами
} else {//оба прохода по Л и С были плохими. Что дальше?
tunerBedIterationCount--;//сколько перезапусков для поиска
//вернем все к лучшему варианту и попробуем еше раз
tunerCircleL = (uint8_t) tunerBeforeValueLC[nowBandIsNumber][0];
tunerCircleC = (uint8_t) tunerBeforeValueLC[nowBandIsNumber][1];
tunerMore50 = (uint8_t) tunerBeforeValueLC[nowBandIsNumber][2];
tuner_L_or_C_YN = 0xff; //начнем с С
//если итерации кончились - выход. c лучшеми измерениями.
if(!tunerBedIterationCount){//если итерации кончились - выход.
tunerAutoStartYN = 0;
tuner_write(tunerBeforeValueLC[nowBandIsNumber][2] ?
(uint8_t) (tunerBeforeValueLC[nowBandIsNumber][0] | 0x80)
://подставим бит кондера
(uint8_t) (tunerBeforeValueLC[nowBandIsNumber][0] & 0x7f),
(uint8_t) tunerBeforeValueLC[nowBandIsNumber][1]);
warningOnDisplay((uint8_t *) " Tuner bad iter. ");
return;
}
}
}
}
//
//
//старт итераций
//
//
if (!tunerTuningStep) { //......1 STEP старт итераций 4+4 должно хватить для понимания куда цепляем емкость
tunerTempValueIdx++; //следующая итерация из 16
//меняем напрвление
if (tunerMore50) {//и если это опять 0 тогда увиличивем L на шаг.
tunerMore50 = 0;
tunerCircleL += tunerStepL;
} else
tunerMore50 = 1; //делаем замер в другом напрвлении
if (tunerTempValueIdx ==
{
tunerTuningStep = 1;
tunerCircleL = 0;
tunerCircleC = tunerMaxC;
tunerLastBestPSR[0] = 0;//power
tunerLastBestPSR[1] = 0;//swr
tunerLastBestPSR[2] = 0;//RL
// выход , переход к основным итерациям
}
} else { ///...........2 STEP старт основных итераций
if (tuner_L_or_C_YN) {//тюним С в обратном напрвлении
if (tunerCircleC - tunerStepC >= 0) {
if ((v_to_dbW(SWR_ch_value[0]) - v_to_dbW(SWR_ch_value[1]) > 20)) {
tunerCircleC--;
tunerStepC=1;
}
else
tunerCircleC -= tunerStepC;
} else
tunerCircleC = 0;
} else {//тюним Л на возрастание
if (tunerCircleL + tunerStepL <= 127) {
if ((v_to_dbW(SWR_ch_value[0]) - v_to_dbW(SWR_ch_value[1]) > 20)) {
tunerCircleL++;
tunerStepL=1;
}
else
tunerCircleL += tunerStepL;
} else
tunerCircleL = 127;
}
}
// end
//
//
//
//update relays
tuner_write(tunerMore50 ?
(uint8_t) (tunerCircleL | 0x80)
://подставим бит кондера
(uint8_t) (tunerCircleL & 0x7f),
tunerCircleC);
tunerRaleyTimer = 5; // ini timer of relay
while (tunerRaleyTimer) {}
//}
}
if (!pttYN && tunerAutoStartYN) {
tunerAutoStartYN = 0;
warningOnDisplay((uint8_t *) " Need PTT. Tuning off. ");
}
}