Управление бистабильным реле при помощи одного пина микроконтроллера

13 сентября 2021

Бистабильные реле, такие, как использованные нами ранее HFD2/012-S-L2, не сложнее в управлении, чем обычные. Пускаем ток через одну катушку, и реле переключается в первое положение. Пускаем ток через другую, и реле переключается во второе положение. Обесточиваем обе катушки, и реле держит свое последнее состояние. Вот только если делать это «в лоб», то понадобится два пина микроконтроллера. Спрашивается, а можно ли обойтись только одним?

Оказывается, что можно. Рассмотрим следующую схему:

Схема управления бистабильным реле при помощи одного пина микроконтроллера

Здесь применен сдвоенный компаратор LM393. Он имеет выход с открытым коллектором и по даташиту [PDF] может пропускать через себя до 20 мА. То что нужно для нашей задачи.

Когда на пине микроконтроллера низкое напряжение, верхний компаратор на схеме притягивает первую катушку к земле. Когда напряжение на пине высокое, нижний компаратор притягивает к земле вторую катушку. Когда пин находится в состоянии высокого импеданса (high-Z), обе катушки обесточены.

Соответствующий код:

void switchPinModeToInput() {
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void switchPinModeToOutput() {
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void switchRelayToPositionA() {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    switchPinModeToOutput();
    HAL_Delay(10);
    switchPinModeToInput();
}

void switchRelayToPositionB() {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    switchPinModeToOutput();
    HAL_Delay(10);
    switchPinModeToInput();
}

void init() {
    switchPinModeToInput();
}

void loop() {
    switchRelayToPositionA();
    HAL_Delay(1000);
    switchRelayToPositionB();
    HAL_Delay(1000);
}

Для тестирования всего этого дела был использован макет на основе STM32F030:

Управление бистабильным реле одним пином МК

Все работает как часы. По площади схема занимает столько же, сколько и пара транзисторов в корпусе TO-92 с резисторами на базе. По деньгам получается дороже. Но учитывая общую стоимость самодельного трансивера (или для чего вы намерены применить схему), разница в итоге будет незначительной.

Метки: , .