Индикатор КСВ для трансивера 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].
Так новые компоненты разместились внутри трансивера:
В корпусе не осталось свободного места. Поэтому плата была размещена вертикально на задней стенке. Плата односторонняя. Контакт с землей осуществляется через винт M3. Его можно разглядеть по центру фотографии. Модуль на базе ADS1115 изолирован от платы при помощи каптона.
Процедура, отвечающая за чтение напряжения, выглядит так:
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]. Помимо прочего, оттуда можно узнать, как использовать АЦП в дифференциальном режиме, то есть, для измерения напряжения между двумя каналами.
Код измерения КСВ получился примерно таким:
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», когда КСВ превышает заданный порог.
Обновленную версию прошивки можно скачать здесь. Как всегда, буду рад вашим вопросам и дополнениям.
Метки: STM32, Беспроводная связь, Любительское радио, Электроника.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.