Автор Тема: ФНЧ-КСВметр-автоТЮНЕР (дневник)  (Прочитано 39536 раз)

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #45 : 15 Апреля 2019, 08:46:08 »
Вот Геннадий Завидовский предложил:

Алгоритм такой... На минимуме индуктивности и емкость. Начинаю увеличивать индуктивность пока не начнет увеличтватьс ксв. Потом увеличиваю ёмкость пока не начнет увеличиваться ксв.
Потом то же самое на другом положении подклбчения конденсаторов.
То где меньше результат - принимается.
Да, шаги неравномерные.
Все есть в исходниках - https://github.com/ua1arn/hftrx/blob/master/tc1.c 0 искать по слову TUNER

источник http://www.cqham.ru/forum/member.php?1595-Genadi-Zawidowski

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #46 : 15 Апреля 2019, 10:20:36 »
Алгоритм работает!
за 6 итераций вышел на мин ксв.


Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #47 : 15 Апреля 2019, 10:59:47 »
Еще раз посмотрел алгоритм Геннадия.... он останавливает программу на время замера и переброски реле.
Это не наш вариант, но сам алгоритм правильный.

Более того, я его буду использовать для PA1500 на 2-ГУ74 с моторами, с адаптацией под П-контур.
Дя Г-образного согласования это оптимум, из простого подхода(на сегодня без фазового детектора). 
« Последнее редактирование: 15 Апреля 2019, 11:25:16 от ra0ahc »

RZ6FE

  • Гость
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #48 : 15 Апреля 2019, 17:23:07 »
Еще раз посмотрел алгоритм Геннадия.... он останавливает программу на время замера и переброски реле.
Это не наш вариант, но сам алгоритм правильный.

Более того, я его буду использовать для PA1500 на 2-ГУ74 с моторами, с адаптацией под П-контур.
Дя Г-образного согласования это оптимум, из простого подхода(на сегодня без фазового детектора).
Ну, лишь бы только на бумаге не осталось... ;)

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #49 : 16 Апреля 2019, 07:05:51 »
Ну, лишь бы только на бумаге не осталось... ;)


Да уже много сделано
Печатки, БП

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #50 : 16 Апреля 2019, 12:52:44 »
Процедура тюнера с коментами (смайлики не мои в листинге, это сам сайт подменяет зачем-то):

P.S. была протестирована и забракована в последствии.

void tuner_auto_start(void) //auto-tune
{
    if (pttYN && tunerAutoStartYN) { //todo потом добавить проверку на наличие тона
        if (tunerAutoJustStartedYN) {//рутина перед стартом
            tunerAutoJustStartedYN = 0;
            tunerTuningStep = 0;
            tunerTempValueIdx = 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]) > 12) {
                tunerAutoStartYN = 0;
                warningOnDisplay((uint8_t *) " Need less 13dbW power. ");
                return;
            }

            tunerCircleL = tunerCircleC = tunerMore50 = 0;//итерации в 0 начнем все сначала

            ///установка степа в зависимости от диапазона
            if (nowBandIsNumber < 3) {
                tunerStepL = 4;
                tunerStepC = 8;
                tunerMaxC = 255; //стартовая емкость
            }
            if (nowBandIsNumber >= 3 && nowBandIsNumber < 5) {
                tunerStepL = 2;
                tunerStepC = 4;
                tunerMaxC = 200;//стартовая емкость

            }
            if (nowBandIsNumber >= 5 && nowBandIsNumber < 7) {
                tunerStepL = 1;
                tunerStepC = 2;
                tunerMaxC = 150;//стартовая емкость

            }
            if (nowBandIsNumber >= 7) {
                tunerStepL = 1;
                tunerStepC = 1;
                tunerMaxC = 127;//стартовая емкость
            }

            //обнулим значения до старта (с учетом диапазона)
            tunerBeforeValueLC[nowBandIsNumber][0] = 0;
            tunerBeforeValueLC[nowBandIsNumber][1] = tunerMaxC;
            tunerBeforeValueLC[nowBandIsNumber][2] = 0;


            //первое и текущее -лучшее значения
            tunerLastBestPSR[0] = SWR_ch_value[0];//power
            tunerLastBestPSR[1] = SWR_ch_value[1];//swr
            tunerLastBestPSR[2] = SWR_ch_value[0] - SWR_ch_value[1];//RL
            tunerLastBestPSR[3] = tunerMore50;//кондер

        }//конец рутины

        if (tunerSwrReady == 2 && tunerRaleyTimer == 0) { //если ксв замерили и реле сработало


            //analyse
            if (tunerLastBestPSR[2] <= SWR_ch_value[0] - SWR_ch_value[1]) {//если рл лучше тогда сохраним это результат
                //ADC
                tunerLastBestPSR[0] = SWR_ch_value[0];//power
                tunerLastBestPSR[1] = SWR_ch_value[1];//reflected
                tunerLastBestPSR[2] = SWR_ch_value[0] - SWR_ch_value[1];//RL
                tunerLastBestPSR[3] = tunerMore50;//кондер
                //L C C50
                tunerBeforeValueLC[nowBandIsNumber][0] = tunerCircleL;
                tunerBeforeValueLC[nowBandIsNumber][1] = tunerCircleC;
                tunerBeforeValueLC[nowBandIsNumber][2] = tunerMore50;


                //условие выхода из настройки
                if ((100 * (v_to_dbW(SWR_ch_value[0]) - v_to_dbW(SWR_ch_value[1]))) >= tunerTargetRL) {
                    tunerAutoStartYN = 0; //stop
                    pttYN = 0;// птт выкл
//                    //сохраним значения
//                    tunerBeforeValueLC[nowBandIsNumber][0] = tunerCircleL;
//                    tunerBeforeValueLC[nowBandIsNumber][1] = tunerCircleC;
//                    tunerBeforeValueLC[nowBandIsNumber][2] = tunerMore50;

                    warningOnDisplay((uint8_t *) " Tuning was OK ");

                    //todo добавить запись во флеш
                    return;
                }

            } else { //если нашли хуже вариант (только основной итерации)
               if(tunerTuningStep) {
                   tuner_L_or_C_YN = ~tuner_L_or_C_YN; // 0-тюним L, ff-тюнем С меняем местами
                   //вспоминаем лучшее значении по L C C50
                   tunerCircleL=(uint8_t)tunerBeforeValueLC[nowBandIsNumber][0];
                   tunerCircleC=(uint8_t)tunerBeforeValueLC[nowBandIsNumber][1];
                   tunerMore50=(uint8_t)tunerBeforeValueLC[nowBandIsNumber][2];
                    //продолжаем поиск липо по С либо Л
               }
            }

            //если все прошел то выход
            if (!tunerCircleC && tunerCircleL == 127) { //C=0 L=127
                warningOnDisplay((uint8_t *) " Tuner has MAX LC ");
                return;
            }

            //старт  итераций
            if (!tunerTuningStep) { //......1 старт итераций 4+4 должно хватить для понимания куда цепляем емкость
                tunerTempValueIdx++; //следующая итерация

                //меняем напрвление
                if (tunerMore50) {//и если это опять 0 тогда увиличивем L  на шаг.
                    tunerMore50 = 0;
                    tunerCircleL += tunerStepL;
                } else tunerMore50 = 1; //делаем замер в другом напрвлении

                if (tunerTempValueIdx == 8) tunerTuningStep = 1; // выход , переход к основным итерациям

            } else { ///...........2 старт основных итераций
            if(tuner_L_or_C_YN){//тюним С в обратном напрвлении
                tunerCircleC-=tunerStepC;
            }else {//тюним Л на возрастание
                tunerCircleL+=tunerStepL;
            }

            }
            // end



            tunerSwrReady = 0;// init to start adc

            //update relays
            tuner_write(tunerMore50 ?
                        (uint8_t) (tunerCircleL & 1)
                                    ://подставим бит кондера
                        (uint8_t) (tunerCircleL & (~1)),
                        tunerCircleC);
            tunerRaleyTimer = 40; // ini timer of relay

        }


    }

    if (!pttYN && tunerAutoStartYN) {
        tunerAutoStartYN = 0;
        warningOnDisplay((uint8_t *) " Need PTT. Tuning off. ");
    }

}
« Последнее редактирование: 17 Апреля 2019, 09:20:04 от ra0ahc »

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #51 : 16 Апреля 2019, 12:53:16 »
описание переменных:

//auto tune var
uint8_t tunerAutoStartYN = 0;
uint8_t tunerAutoJustStartedYN = 0; //тюнер только начал тюнить
int16_t tunerBeforeValueLC[10][3];//значение L C и кондер перед началом работы тюнера

uint32_t tunerLastBestPSR[4];//последнее лучшее значение POWer SWR RL Кондер
uint8_t tunerTempValueIdx = 0; //индекс прохода во время поиска куда подключить кондер

uint8_t tunerMore50 = 1; //если больше чем 50 ом перебрасывыем кондер к 1-антенне(больше 50ом)  0-тюнер(меньше 50)
uint8_t tunerStepL = 1;//шаг перестройки Л
uint8_t tunerStepC = 1;//шаг перестройки С
uint8_t tunerMaxC = 0;//max С for every band 0..255
uint8_t tuner_L_or_C_YN = 0xff;// 0-тюним L, ff-тюнем С

uint16_t tunerTargetRL = 2800; //лучшее рл потом стоп (28.00дб)
uint8_t tunerSwrReady = 0; //идет замер ксв, 2-готово
uint8_t tunerTuningStep = 0; //этапы тюнинга
uint8_t tunerCircleL = 0; //итерация по индуктивности
uint8_t tunerCircleC = 0;// итерация по емкости
uint8_t tunerRaleyTimer = 0;//таймер ожидания срабатывания реле

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #52 : 16 Апреля 2019, 12:54:15 »
Запись в плату:

void tuner_write(uint8_t l, uint8_t c) {

    uint8_t y = 0x1;//эту будем двигать для маски
    uint8_t res = 0;

//зеркальное переделка байта
    l = (uint8_t) (l & 0xF0) >> 4 | (uint8_t) (l & 0x0F) << 4;
    l = (uint8_t) (l & 0xCC) >> 2 | (uint8_t) (l & 0x33) << 2;
    l = (uint8_t) (l & 0xAA) >> 1 | (uint8_t) (l & 0x55) << 1;

//установка битов последоватильно от меньшнго к большему емкостей
    for (int i = 0; i < 8; i++) {
        if (c & y) res |= tunerTableC;
        y <<= 1;
    }
    c = res;

//    l &= ~1;// первый бит в 0 <50ом
//0= <50 ,(l|=1;) 1= >50ом
    //   l |= 1;//>50ом
    char buf[10];
    BSP_LCD_SetFont(&Font16);
    sprintf((char *) buf, "L=%03d ", l);
    BSP_LCD_DisplayHStringAt(0, 150, (uint8_t *) buf, LEFT_MODE);
    sprintf((char *) buf, "C=%03d ", c);
    BSP_LCD_DisplayHStringAt(0, 170, (uint8_t *) buf, LEFT_MODE);

    sprintf((char *) buf, "=%d ", tunerMore50);
    BSP_LCD_DisplayHStringAt(60, 170, (uint8_t *) buf, LEFT_MODE);

    uint8_t buferWT[3] = {0b00000010, l, c};
    while (HAL_I2C_Master_Transmit(&hi2c3, TUNER_TUNER_PCA9555_ADRESS, (uint8_t *) &buferWT, (uint16_t) 3,
                                   (uint32_t) 500) != HAL_OK) {
        BSP_LCD_DisplayHStringAt(0, 150, "tuRx-err", LEFT_MODE);
    };

};

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #53 : 16 Апреля 2019, 12:55:27 »
АЦП чтение двух каналов:

///check swr, read ADC

void read_swr(void) {

    if (!pttYN) return;

    if (!tunerAutoStartYN || (tunerAutoStartYN && tunerSwrReady < 2 && tunerRaleyTimer == 0)) {

        uint8_t read_buf[4];
        uint8_t config[1] = {0};

//1
        if (numberOfChanel == 1 && SWR_ch_started[1] == 0 && SWR_ch_time == 0) {
            config[0] = 0b10101000;
            //1 = Initiate a new conversion
            // 01 =channel
            //   0 = One-Shot
            //    10= 16 bits
            //      00= x1 pga

            while (HAL_I2C_Master_Transmit(&hi2c3, TUNER_SWR_MCP3426_ADRESS_WR, (uint8_t *) &config, 1, 500) !=
                   HAL_OK) { BSP_LCD_DisplayHStringAt(0, 130, "error mcp3426", LEFT_MODE); };
            SWR_ch_started[1] = 1;
            SWR_ch_started[0] = 0;
            SWR_ch_time = 70; //70 для 16бит

        }
        if (numberOfChanel == 1 && SWR_ch_started[1] == 1 &&
            SWR_ch_time == 0) {//если 1 канал, стартанул и время истекло тогда..

            while (HAL_I2C_Master_Receive(&hi2c3, TUNER_SWR_MCP3426_ADRESS_RD, read_buf, 4, 500) != HAL_OK) {
                BSP_LCD_DisplayHStringAt(0, 20, "error read mcp3426", LEFT_MODE);
            };
            SWR_ch_value[numberOfChanel] = (((read_buf[0]) << 8) | read_buf[1]);
            //преобразование в dbm
            SWR_ch_value[numberOfChanel] = (uint16_t) (SWR_ch_value[numberOfChanel] / v_to_dbm);
            needDrawSwrBarYN = 1;
            needToDrawYN = 1;
            SWR_ch_started[1] = 0;
            //SWR_ch_started[0]=1;
            numberOfChanel = 0;
            tunerSwrReady++;//2-готово
        }


//0
        if (numberOfChanel == 0 && SWR_ch_started[0] == 0 && SWR_ch_time == 0) {
            config[0] = 0b10001000;
            //1 = Initiate a new conversion
            // 00 =channel
            //   0 = One-Shot
            //    10= 16 bits
            //      00= x1 pga

            while (HAL_I2C_Master_Transmit(&hi2c3, TUNER_SWR_MCP3426_ADRESS_WR, (uint8_t *) &config, 1, 500) !=
                   HAL_OK) { BSP_LCD_DisplayHStringAt(0, 130, "error mcp3426", LEFT_MODE); };
            SWR_ch_started[0] = 1;
            SWR_ch_time = 70; //70 для 16бит

        }

        if (numberOfChanel == 0 && SWR_ch_started[0] == 1 && SWR_ch_time == 0) {
            //если 1 канал, стартанул и время истекло тогда..

            while (HAL_I2C_Master_Receive(&hi2c3, TUNER_SWR_MCP3426_ADRESS_RD, read_buf, 4, 500) != HAL_OK) {
                BSP_LCD_DisplayHStringAt(0, 20, "error read mcp3426", LEFT_MODE);
            };

            SWR_ch_value[numberOfChanel] = (((read_buf[0]) << 8) | read_buf[1]);

            SWR_ch_value[numberOfChanel] = (uint16_t) (SWR_ch_value[numberOfChanel] / v_to_dbm);

            SWR_ch_started[0] = 0;
            numberOfChanel = 1;
            tunerSwrReady++;//2-готово
        }
        //если данные изменились то перерисуем
        if (SWR_ch_oldValue[0] != SWR_ch_value[0] || SWR_ch_oldValue[1] != SWR_ch_value[1]) {
            needDrawSwrBarYN = 1;
            needToDrawYN = 1;
            //обновим старые на новые данные
            SWR_ch_oldValue[0] = SWR_ch_value[0];
            SWR_ch_oldValue[1] = SWR_ch_value[1];

        }

    }

}

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #54 : 17 Апреля 2019, 09:16:28 »
Выше показанный алгоритм работает не корректно, пропускает минимум (он был первым).

Переделал весь алгоритм. Изменил сам себе - поставил задержки при чтении каналов АЦП прямо в процедуре (теперь программа останавливается). Увеличил точность замера в 10 раз на АЦП (было с точности на 1мВ, сейчас 100uV). Упростил практически всё. Вечером посмотрим, что из этого вышло.

Пока не тестировал.

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #55 : 17 Апреля 2019, 09:23:19 »
На будущие ...надо "эту" серию АЦП ставить.

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #56 : 17 Апреля 2019, 11:17:27 »
Ручной прогон алгоритма. 4 итерации до ксв 1.10

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #57 : 18 Апреля 2019, 14:14:51 »
Нашёл ошибку в управлении железом
Тесты продолжаются, но пока алгоритм работает очень не стабильно. Разные замеры получаются при одинаковых установках реле. Стукаешь легонько по реле и обратка меняется

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #58 : 19 Апреля 2019, 08:39:14 »
Очередная версия процедуры поиска.




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 == 8) {
                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. ");
    }

}

Оффлайн ra0ahc

  • ***
  • Сообщений: 73
  • Репутация: +1/-4
    • Просмотр профиля
Re: ФНЧ-КСВметр-автоТЮНЕР (дневник)
« Ответ #59 : 19 Апреля 2019, 08:41:35 »
Надо еще второй сценарий приделать -это проход по емкости от 0...255 (сейчас 255...0)