Индикатор КСВ для трансивера HBR/CW

21 марта 2022

Важная штука, которой не хватает в HBR/CW — это индикатор КСВ. Если антенну оборвет ветром, или переключатель антенного коммутатора окажется в неверном положении, трансивер никак не сообщит об этом. Было решено исправить данную ситуацию.

Схему я взял проверенную, мост Стоктона на бинокле BN61-202. АЦП решил опробовать новый — ADS1115. Это 16-и битный 4-х канальный АЦП с I2C интерфейсом. АЦП не быстрый, максимум 860 измерений в секунду, но для задачи сгодится. Готовые модули на основе ADS1115 в большом количестве доступны на AliExpress. Полную схему доработки можно скачать здесь [PDF].

Fun fact! Пины B8 и B9 в микроконтроллере STM32F103 являются 5V-tolerant. Напряжение на них может быть от -0.3 до 5.5 В. Это позволяет спокойно использовать 5-и волтовую логику на I2C шине, а также не беспокоиться из-за наводок со стороны УМ. Подробности в даташите [PDF].

Так новые компоненты разместились внутри трансивера:

Доработка трансивера HBR/CW: КСВ-метр на мосте Стоктона и ADS1115

В корпусе не осталось свободного места. Поэтому плата была размещена вертикально на задней стенке. Плата односторонняя. Контакт с землей осуществляется через винт M3. Его можно разглядеть по центру фотографии. Модуль на базе ADS1115 изолирован от платы при помощи каптона.

Процедура, отвечающая за чтение напряжения, выглядит так:

// See section "9.5.1.1 I2C Address Selection" of the datasheet
const uint8_t ads1115_i2c_addr = (0x48 << 1);

typedef enum {
  ADS1115_CHANNEL_0 = 0,
  ADS1115_CHANNEL_1 = 1,
  ADS1115_CHANNEL_2 = 2,
  ADS1115_CHANNEL_3 = 3,
} ADS1115Channel_t;

double getADS1115Voltage(ADS1115Channel_t ch) {
    int16_t reading;
    uint8_t conversion[2];
    uint8_t config[] = { 0xC1, 0x83 };

    switch(ch) {
    case ADS1115_CHANNEL_0:
        config[0] = 0xC1;
        break;
    case ADS1115_CHANNEL_1:
        config[0] = 0xD1;
        break;
    case ADS1115_CHANNEL_2:
        config[0] = 0xE1;
        break;
    case ADS1115_CHANNEL_3:
        config[0] = 0xF1;
        break;
    }

    // Write to the config register (0x01):
    // byte 1: single conversion, channel number, FSR +/- 6.114 V, ...
    // byte 2: 128 SPS, default comparator options, ALTR pin High-Z
    HAL_I2C_Mem_Write(&hi2c1, ads1115_i2c_addr,
        0x01, I2C_MEMADD_SIZE_8BIT,
        config, sizeof(config), HAL_MAX_DELAY);

    // Read from the conversion register (0x00)
    HAL_I2C_Mem_Read(&hi2c1, ads1115_i2c_addr,
        0x00, I2C_MEMADD_SIZE_8BIT,
        conversion, sizeof(conversion), HAL_MAX_DELAY);

    reading = ((int16_t)conversion[0] << 8) | (int16_t)conversion[1];
    return ((double)reading) * (6.114 / 32768.0);
}

Подробности про доступные регистры ADS1115 и какой битик в них что означает вы найдете в разделе «9.6 Register Map» даташита [PDF]. Помимо прочего, оттуда можно узнать, как использовать АЦП в дифференциальном режиме, то есть, для измерения напряжения между двумя каналами.

Код измерения КСВ получился примерно таким:

bool highSWR = false;
uint32_t lastSWRCheckTime = 0;

// ...

uint32_t tstamp = HAL_GetTick();
if(tstamp - lastSWRCheckTime > 1000) {
    // the ADS1115 module I have seems to have AIN0 and AIN1 swapped
    double v_fwd = getADS1115Voltage(ADS1115_CHANNEL_0);
    double v_ref = getADS1115Voltage(ADS1115_CHANNEL_1);
    if(v_fwd > 1.0 && (v_ref / v_fwd > 0.35)) { // indicates SWR ~2.3
        LCD_Goto(1, 0);
        LCD_SendString("HIGH SWR");
        highSWR = true;
    }
    lastSWRCheckTime = tstamp;
}

Если подумать, то никому не интересно, видит ли трансивер КСВ 1.2 или 1.8. Это не только бесполезная информация, но еще и неверная, за счет потерь в коаксиальном кабеле. На самом деле, нужно знать только одно — не оборвало ли антенну. Поэтому HBR/CW не отображает КСВ, а лишь выводит «HIGH SWR», когда КСВ превышает заданный порог.

Обновленную версию прошивки можно скачать здесь. Как всегда, буду рад вашим вопросам и дополнениям.

Метки: , , , .