← На главную

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

Важная штука, которой не хватает в 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», когда КСВ превышает заданный порог.

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