hbr-cw-swr-meter-mod/

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

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

EnglishRussianUkrainian