Trong hướng dẫn này, tôi sẽ dạy bạn cách giao tiếp rơle với vi điều khiển stm32f103. Bộ vi điều khiển Stm32 hoạt động trên logic TTL 3,3 volt. Trong đó các rơle điện tối thiểu phải lấy +5 volt để kết nối thường xuyên. Chúng ta phải cần một mạch bên ngoài để điều khiển rơ le với vi điều khiển stm32. Bài đăng này hướng dẫn bạn những gì phải sử dụng với vi điều khiển stm32 để điều khiển nhiều rơle với nó. Đó là một số phương pháp về cách điều khiển tải cao với bộ vi điều khiển. Tôi tranh thủ các phương pháp đó trong một hướng dẫn khác. Nếu bạn muốn biết thông qua những cách nào chúng ta có thể tăng tải cao với bộ vi điều khiển, chỉ cần nhấp vào nút bên dưới để xem hướng dẫn.   
Bóng bán dẫn phù hợp nhất với bộ vi điều khiển để dẫn động rơ le. Nhưng nếu chúng ta có số lượng rơ le trong dự án của mình thì việc sử dụng bóng bán dẫn cho mỗi rơ le không phải là lựa chọn tốt nhất. Các bóng bán dẫn riêng lẻ không chỉ làm cho mạch của chúng ta lớn hơn mà còn lộn xộn. May mắn thay, chúng tôi có một số ic có sẵn trên thị trường chứa kết hợp bóng bán dẫn trong đó. Các ic này có kích thước nhỏ và tiêu thụ ít không gian hơn khi so sánh với các bóng bán dẫn đơn lẻ. ULN2003 và ULN2803 là các ic kết hợp bóng bán dẫn phổ biến hiện có trên thị trường. ULN2003 có 7 kênh bóng bán dẫn và ULN2803 có 8 kênh bóng bán dẫn. Mỗi kênh bao gồm một cặp darlington gồm 2 bóng bán dẫn. Trong cấu hình darlington, dòng điện được khuếch đại bởi bóng bán dẫn đầu tiên trong khi được khuếch đại thêm bởi bóng bán dẫn thứ hai. Chúng ta có thể kết luận rằng mỗi kênh của ULN2003 và ULN2803 là các bộ khuếch đại có độ lợi dòng cao. Trong dự án này, tôi sẽ sử dụng cặp ic cặp darlington ULN2003. ULN2003 trong dự án này sẽ hoạt động như trình điều khiển chuyển tiếp.         

ULN2003 làm trình điều khiển chuyển tiếp

Cấu hình cặp darlington riêng lẻ trong ic ULN2003 được đưa ra ở phía bên phải. 3,3 volt từ các chân đầu ra của vi điều khiển stm32 đi đến chân của bóng bán dẫn đầu tiên. Bộ phát bóng bán dẫn đầu tiên được đưa vào đế bóng bán dẫn thứ hai. Vì vậy, khi bóng bán dẫn đầu tiên được bật ngay lập tức bóng bán dẫn thứ hai cũng sẽ được bật. Dòng điện sẽ bắt đầu chạy từ ‘Ra’ xuống đất. Diode ở chân ‘COM’ đang hoạt động như một diode quay lại. Nó ngăn mạch khỏi bất kỳ emf trở lại nào được tạo ra bởi các cuộn dây rơle. ULN2003 có thể xử lý tải yêu cầu 50 volt và dòng điện 500 mA.    

Mạch dự án

Tôi sẽ bật và tắt bốn rơ le với vi điều khiển stm32. Bốn nút được sử dụng làm đầu vào cho vi điều khiển stm32. Bốn nút này tương ứng với bốn rơ le đầu ra. Nhấn từng nút sẽ thay đổi trạng thái của rơ le tương ứng. Ví dụ, nếu rơle đang bật, nhấn nút tương ứng của nó sẽ chuyển trạng thái thành tắt. Chúng ta có thể nói rằng các nút đang chuyển đổi trạng thái của rơ le trên mỗi lần nhấn.

Vi điều khiển được sử dụng trong dự án là stm32f103c8t6. Cấu tạo của nó trên lõi m3 vỏ não. Các chân Port-A 0,1,2,3 của vi điều khiển stm32 được dùng làm chân đầu ra. Chân số 0 của cổng-a được kết nối với đầu vào 1 của trình điều khiển rơle ULN2003. Pin # 1 trong tổng số port-a được kết nối với đầu vào 3, pin # 2 được kết nối với đầu vào 5 và pin # 3 được kết nối với pin # 7 của tài xế ULN2003 relay. Nút Input được kết nối với cổng-b ghim 6, 7, 8, 9. Vi điều khiển Stm32 tích hợp các điện trở kéo lên và kéo xuống trên mỗi chân gpio riêng lẻ. Chúng tôi có thể bật và tắt chúng trong mã. Đối với đầu vào nút của chúng tôi, tôi đã bật các điện trở kéo lên được liên kết với mỗi gpio (Cổng-B Pin # 6,7,8,9). Một mặt của các nút đầu vào được kết nối với các chân vi điều khiển và mặt còn lại thường được nối đất.

Rơ le mà tôi đang sử dụng trong dự án kích hoạt trên +9 volt. Tôi kết nối cuộn dây rơle một đầu với đầu ra ULN2003 và đầu kia +12 volt. Chân Com của rơ le được nối đất với nguồn tải. Chân Nc của rơ le được nối với tải và đầu kia của tải được nối với dây dẫn dương của nguồn tải. Không có chân nào của rơ le được để nguyên. Chân nối đất của ULN2003 được nối đất với nguồn điện 12 volt relay và với tiếp đất stm32. Lưu ý ULN2003 GND phải được nối đất thường với nguồn cấp điện stm32 và nguồn cấp điện rơ le ULN2003.  

Rơ le với vi điều khiển stm32 và trình điều khiển rơ le uln2003

Mã số dự án

Stm32cubemx được sử dụng để cấu hình vi điều khiển. Các chân xuất nhập được khai báo trong đó. Kéo lên và kéo xuống điện trở trên các chân đầu vào cũng được kích hoạt trong stm32cubemx. Sau khi cấu hình và cài đặt, mã dự án được tạo và nhập cho keil uvision arm 5 mdk ide. Hình dưới đây là cài đặt stm32 cuối cùng trong stm32cubemx. 

Stm32cubemx cài đặt GPIOS cho các chân làm đầu vào và đầu ra
Nếu bạn chưa làm việc với trình cấu hình mã stm32cubemx và keil uvision mdk arm 5 và bạn là người mới trong lĩnh vực này. Hơn tôi có một hướng dẫn bắt đầu toàn diện về stm32 cubemx và keil Ide cho bạn. Nhấp vào nút bên dưới để xem hướng dẫn.

Bắt đầu với stm32cubemx và keil arm mdk

Mã được viết và biên dịch trong keil uvision Ide. Thư viện Stm32 HAL được sử dụng trong dự án. Logic chính và mấu chốt của mã nằm trong vòng lặp while 1. Tuyên bố

if (HAL_GPIO_ReadPin (GPIOB, B6_Pin) == GPIO_PIN_RESET) // Kiểm tra nhấn nút đầu vào 

đang kiểm tra xem nút có được nhấn hay không. Câu lệnh sử dụng thư viện stm32 HAL để kiểm tra trạng thái của nút đầu vào. Cổng-B Pin # 6 được kiểm tra trong mã trên. GPIO_PIN_RESET có nghĩa là nếu chân ở điện áp thấp (0 volt). Khi nhấn nút, mặt đất sẽ xuất hiện trên chốt này. Vì nút đầu kia được kết nối với mặt đất stm32. Nếu câu lệnh trên là true, câu lệnh tiếp theo sẽ được thực hiện.  

HAL_GPIO_TogglePin (GPIOA, A0_Pin);

Câu lệnh trên thực thi ngay sau câu lệnh if Câu lệnh if if là true. Nó chuyển đổi trạng thái chuyển tiếp. Câu lệnh này cũng sử dụng thư viện HAL stm32. Câu lệnh chuyển đổi trạng thái của port-a pin # 6.   

/*
***********************************************
Written by : Usman Ali Butt *
Property of : www.microcontroller-project.com *
Dated : 17 july 2018 *
***********************************************
*/

#include “main.h”
#include “stm32f1xx_hal.h”
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
HAL_Init();

SystemClock_Config();
MX_GPIO_Init();

/* USER CODE BEGIN WHILE */
while (1)
{

if(HAL_GPIO_ReadPin(GPIOB,B6_Pin)==GPIO_PIN_RESET) //Check for input button press
HAL_GPIO_TogglePin(GPIOA,A0_Pin); //If button pressed toggle relay state
if(HAL_GPIO_ReadPin(GPIOB,B7_Pin)==GPIO_PIN_RESET) //Check for input button press
HAL_GPIO_TogglePin(GPIOA,A1_Pin); //If button pressed toggle relay state
if(HAL_GPIO_ReadPin(GPIOB,B8_Pin)==GPIO_PIN_RESET) //Check for input button press
HAL_GPIO_TogglePin(GPIOA,A2_Pin); //If button pressed toggle relay state
if(HAL_GPIO_ReadPin(GPIOB,B9_Pin)==GPIO_PIN_RESET) //Check for input button press
HAL_GPIO_TogglePin(GPIOA,A3_Pin); //If button pressed toggle relay state

}
}

void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}

/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

static void MX_GPIO_Init(void)
{

GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, A0_Pin|A1_Pin|A2_Pin|A3_Pin, GPIO_PIN_RESET);

/*Configure GPIO pins : A0_Pin A1_Pin A2_Pin A3_Pin */
GPIO_InitStruct.Pin = A0_Pin|A1_Pin|A2_Pin|A3_Pin;
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);

/*Configure GPIO pins : B6_Pin B7_Pin B8_Pin B9_Pin */
GPIO_InitStruct.Pin = B6_Pin|B7_Pin|B8_Pin|B9_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

void _Error_Handler(char *file, int line)
{
while(1)
{
}
/* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */

Làm cho mạch trên trên bảng mạch bánh mì là khó khăn cho một dự án tự làm. Nếu bạn đang thực hiện một dự án tự làm về lái xe tiếp sức stm32. Tôi đề nghị bạn sử dụng bảng chuyển tiếp được lắp ráp sẵn trong dự án của bạn. Có rất nhiều bảng chuyển tiếp có sẵn trên thị trường chứa số lượng rơle khác nhau. Bảng chuyển tiếp 2 kênh, 4 kênh và 8 kênh thông dụng nhất trên thị trường. Các bo mạch này có ic trình điều khiển rơ le ULN2003 hoặc ULN2803 được cài đặt trên chúng. Họ cũng có trạng thái dẫn trên họ. Led mô tả trạng thái của rơ le. Các khối đầu cuối cho mỗi rơ le cũng rất hữu ích trong việc kết nối với tải.
Đoạn mã trên có thể được sử dụng với bảng chuyển tiếp. Các kết nối giống nhau. Chỉ bạn phải làm cho nguồn điện rơle và nguồn điện stm32 chung.  

Bo mạch chuyển tiếp 4 kênh hoặc 8 kênh cho vi điều khiển với trình điều khiển chuyển tiếp uln2003 và uln2803 mạch kiểm tra dung lượng pin
Bảng chuyển tiếp cũng đi kèm với bộ ghép quang và mạch bóng bán dẫn đơn. Mã trong dự án này có thể được sử dụng với bất kỳ bảng chuyển tiếp nào ULN2003, ULN2803, bộ ghép quang hoặc bóng bán dẫn riêng lẻ làm trình điều khiển chuyển tiếp.  

LEAVE A REPLY

Please enter your comment!
Please enter your name here