[PROJEKT] Sterowanie urządzeniami dużych mocy – KA-NUCLEO oraz moduł z przekaźnikami
Gdy już wiemy jakie funkcje będą pełniły poszczególne piny można podłączyć moduł przekaźnika do KA-NUCLEO oraz do urządzeń, którymi będziemy sterować. Można zacząć od połączenia z płytką z mikrokontrolerem. Należy to zrobić zgodnie z poniższą tabelką:
Pin KA-NUCLEO | Pin modułu z przekaźnikami |
+5V | DC+ |
GND | DC- |
D7 | IN1 |
D8 | IN2 |
Urządzenia, którymi będziemy sterować (przy założeniu że przekaźniki będą załączać urządzenie a nie je rozłączać) należy podłączyć w następujący sposób:
Pin modułu z przekaźnikami | Pin urządzania do sterowania |
COM1 | Plus urządzenia 1 |
NC1 | Plus zasilania 12V |
COM2 | Plus urządzenia 2 |
NC2 | Plus zasilania 12V |
Zmontowany układ prezentuje się następująco:
Rys 11. Moduł z przekaźnikami podłączony do KA-NUCLEO
Po zmontowaniu układu można przejść do napisania programu w środowisku AC6. Będzie działał on następująco – gdy przyciśniemy przycisk 1 zostanie załączony przekaźnik 1, natomiast gdy drugi raz przyciśniemy przycisk 1 przekaźnik 1 zostanie rozłączony. Analogicznie będzie odbywało się to w przypadku drugiego przycisku oraz drugiego przekaźnika (projekt dla programu AC 6 z kodem programu wykorzystanym w projekcie znajduje się w sekcji do pobrania na końcu tego artykułu).
Najpierw deklarujemy dwie zmienne stan_przycisk_1 oraz stan_przycisk_2 należy je umieścić w sekcji Private variables:
/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint stan_przycisk_1 = 0; uint stan_przycisk_2 = 0; /* USER CODE END PV */
Następnie w sekcji Private function prototypes znajduje się funkcja do obsługi przerwań:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == PRZYCISK_1_Pin) { if (stan_przycisk_1 == 0) { stan_przycisk_1 = 1; } else if (stan_przycisk_1 == 1) { stan_przycisk_1=0; } } if(GPIO_Pin == PRZYCISK_2_Pin) { if (stan_przycisk_2 == 0) { stan_przycisk_2 = 1; } else if (stan_przycisk_2 == 1) { stan_przycisk_2=0; } } }
Jeżeli wystąpi przerwanie zewnętrzne, najpierw sprawdzane jest od którego pinu pochodzi: PA10 (PRZYCISK_1) czy PB3 (PRZYCISK_2). Następnie ustalana jest wartość zmiennej przypisanej do konkretnego przycisku. Dla przykładu jeżeli wystąpiło przerwanie od pinu PA10, sprawdzana jest wartość zmiennej stan_przycisku_1, i jej wartość zostaje zamieniona na przeciwną (jeżeli jej wartość wynosiła 1 to jest ustawiane 0, jeżeli było 0 jest ustawiane 1). Dla przycisku drugiego kod wygląda analogicznie.
Następnie można przejść do omówienia do pętli głównej programu. W sekcji /* USER CODE BEGIN 3 */ umieszczony jest kod, który sprawdzi zmienną stan_przycisku_1, następnie odczeka 50 ms (ma to przeciwdziałać drganiom styków przycisków i przypadkowym zmianom stanów). Po 50 milisekundach sprawdzany jest stan przycisku 1. Jeżeli jest on wciśnięty (stan niski) na wyjściu wyj_przekaznik_1 ustawiany jest stan niski. Dla drugiego przycisku kod wygląda podobnie z tą różnica, że sprawdzana jest zmienna stan_przycisku_2 oraz załączane jest wyjście wyj_przekaznik_2.
/* USER CODE BEGIN 3 */ // Przekaznik 1 if (stan_przycisk_1 == 1) { HAL_Delay(50); if (HAL_GPIO_ReadPin(GPIOA, PRZYCISK_1_Pin)== GPIO_PIN_RESET) { HAL_GPIO_WritePin(GPIOA, WYJ_PRZEKAZNIK_1_Pin, GPIO_PIN_SET); } } else if (stan_przycisk_1 == 0) { HAL_Delay(50); if (HAL_GPIO_ReadPin(GPIOA, PRZYCISK_1_Pin)== GPIO_PIN_SET) { HAL_GPIO_WritePin(GPIOA, WYJ_PRZEKAZNIK_1_Pin, GPIO_PIN_RESET); } } // Przekaznik 2 if (stan_przycisk_2 == 1) { HAL_Delay(50); if (HAL_GPIO_ReadPin(GPIOB, PRZYCISK_2_Pin)== GPIO_PIN_RESET) { HAL_GPIO_WritePin(GPIOA, WYJ_PRZEKAZNIK_2_Pin, GPIO_PIN_SET); } } else if (stan_przycisk_2 == 0) { HAL_Delay(50); if (HAL_GPIO_ReadPin(GPIOB, PRZYCISK_2_Pin)== GPIO_PIN_SET) { HAL_GPIO_WritePin(GPIOA, WYJ_PRZEKAZNIK_2_Pin, GPIO_PIN_RESET); } } } /* USER CODE END 3 */
Działanie programu zostało przedstawione na poniższym materiale wideo: