ULN2003 是一种广泛应用的高电流驱动器,主要用于驱动步进电机和其他高功率负载。它是一款七通道功率驱动集成电路(IC),可以通过较低电流的控制信号驱动较大电流的负载,如步进电机、继电器、LED显示等。
ULN2003 的基本特点和功能
-
多通道驱动: ULN2003 内部有 7 个通道,每个通道都能够独立驱动一个负载。每个通道的输出是一个 NPN 晶体管,可以提供较大的电流(通常为 500mA,最大可达 600mA)。
-
高电流驱动能力: 每个通道的输出可以驱动最大 500mA 的负载电流,适用于驱动继电器、步进电机等高电流设备。多个通道并联使用时,可以实现更高的电流输出。
-
低电压控制: 控制信号的输入电压通常为 5V 或 3.3V,非常适合与微控制器(如 Arduino、单片机等)连接。控制信号无需大电流,因此可以直接连接到低功耗设备。
-
内置自由轮流二极管: 每个输出通道都有内置的二极管,用于抑制由于电感性负载(如步进电机、继电器)断开时产生的反向电动势。这有助于保护 ULN2003 和其他电路免受高电压损害。
-
支持双极性和单极性步进电机: ULN2003 常用于驱动步进电机,尤其是常见的 5V 或 12V 单极性步进电机,通过四个或更多的输出引脚控制步进电机的旋转。
-
小型封装: ULN2003 通常以 DIP-16 或 SOP-16 的封装提供,适用于多种电路板设计。由于其小型化,广泛应用于嵌入式控制系统中。
主要应用领域
-
步进电机驱动: ULN2003 最常用于驱动步进电机,尤其在机器人、自动化控制系统、打印机等设备中。它可以将微控制器或单片机的低电流控制信号转换为能够驱动步进电机的高电流信号。
-
继电器控制: 它可以用来控制高功率设备的开关,如电磁继电器、电磁阀等,通常用于自动化控制系统。
-
LED 驱动: 在某些情况下,ULN2003 也可以用来驱动多个高功率的 LED,提供足够的电流来满足显示需求。
-
其他高电流负载: 除了步进电机和继电器,ULN2003 还可以用于驱动其他需要较大电流的负载,如蜂鸣器、电磁锁等。
基本电路连接示意
在典型的步进电机驱动应用中,ULN2003 用作接口电路,微控制器(如 Arduino)的输出端口通过适当的限流电阻连接到 ULN2003 的输入端(1-7引脚),ULN2003 的输出端(11-16引脚)连接到步进电机的驱动线圈。
总结
ULN2003 是一种高效、功能强大的驱动器,适合用于控制高电流负载,尤其是在步进电机驱动、继电器控制等应用中。它能够简化控制电路设计,使得低电压、低电流控制信号可以驱动更大电流的负载,广泛应用于自动化、嵌入式系统及机器人等领域
ULN2003 引脚功能
ULN2003 的封装通常是 DIP-16 或 SOP-16,其中有 16 个引脚。每个引脚的功能如下:
1. 引脚 1-7 (输入端)
- 功能: 控制信号输入端。
- 说明: 这些引脚(1-7)接收来自微控制器或其他控制电路的低电平输入信号。输入电平通常为 5V 或 3.3V,信号通过这些引脚控制 IC 中的 NPN 晶体管的开关。
2. 引脚 8 (地)
- 功能: 接地端。
- 说明: 该引脚连接到电源地线(GND),用于为 IC 提供参考地。
3. 引脚 9-15 (输出端)
- 功能: 高电流输出端。
- 说明: 这些引脚(9-15)输出高电流信号,用于驱动负载(如步进电机线圈、继电器等)。每个输出引脚对应一个输入引脚,且每个输出端口都连接到 NPN 晶体管的集电极。
4. 引脚 16 (电源端)
- 功能: 电源端。
- 说明: 该引脚连接到负载电源的正极(通常为 +5V 至 +50V)。它为 ULN2003 提供电力,以驱动输出端的负载。
总结表格
引脚编号 | 功能描述 | 说明 |
---|---|---|
1-7 | 输入端 | 接收低电平控制信号 |
8 | 地(GND) | 连接电源地线 |
9-15 | 输出端 | 驱动负载(例如步进电机、继电器) |
16 | 电源端 | 连接负载电源正极 |
工作原理
- 输入端(引脚 1-7)接收到来自微控制器或其他控制系统的控制信号(低电平信号)。
- NPN 晶体管内部的开关被激活,允许通过 输出端(引脚 9-15)流动较大的电流,用于驱动外部负载(如步进电机线圈、继电器等)。
- 输出端通常与负载的一个端子连接,负载的另一端连接到电源,提供足够的电流来操作负载。
- 内置的 自由轮流二极管(即每个输出通道上的二极管)会保护电路免受由电感性负载产生的反向电动势影响
28BYJ-48 步进电机的基本特性:
- 电压: 5V
- 相数: 4 相(四相)
- 步距角: 5.625°(全步模式)或 0.9°(细分模式)
- 驱动方式: 通常使用半步驱动或全步驱动
- 扭矩: 小扭矩电机,适合低功率应用
连接方式:
28BYJ-48 步进电机通过 5 个引脚与驱动板(如 ULN2003)连接。具体连接方式如下:
- 电源引脚:将电机的电源引脚(一般为红色)连接到 5V 电源。
- 四相绕组引脚:电机的 4 相绕组接到 ULN2003 驱动板的 4 个输出引脚(通常为 IN1 到 IN4)。
- 驱动板的控制引脚:将 ULN2003 驱动板的输入引脚(IN1 到 IN4)连接到控制器的数字输出引脚。
典型电路连接:
-
28BYJ-48 电机接线:
- 电机红线连接到电源的正极(5V)。
- 电机的 4 个相线(一般是蓝色、粉色、橙色、黄色)连接到 ULN2003 驱动板的 IN1 到 IN4。
-
ULN2003 驱动板接线:
- 5V 电源接到 ULN2003 驱动板的 VCC 引脚。
- 电源地接到 GND。
- 驱动板的 IN1 到 IN4 分别连接到 控制器的数字引脚(例如 8、9、10、11)。
硬件部分
单片机:stm32f103c8t6
引脚连接:单片机PA4—PA7连接ULN2003的INT1—INT4,单片机5V的VCC连接ULN2003的VCC,单片机与ULN2003共地。
软件部分
原理概述:
- 28BYJ-48 步进电机 是一个四相步进电机,它需要通过对四个相绕组(A、B、C、D)施加不同的电流信号来实现逐步转动。
- STM32F103C8T6 是一款基于 ARM Cortex-M3 核心的微控制器,它拥有丰富的 I/O 引脚、定时器和 PWM 输出等功能,非常适合控制步进电机。
电机驱动原理:
28BYJ-48 步进电机通常通过一个驱动电路(如 ULN2003)来驱动,因为电机的工作电压为 5V,而 STM32F103C8T6 的 GPIO 输出电压为 3.3V。ULN2003 驱动板能够放大 STM32 输出的信号,并驱动电机。
基本的工作步骤:
- 控制引脚: 你需要通过 STM32 的 GPIO 引脚(通常是 4 个)控制 ULN2003 驱动板的输入引脚。
- 步进顺序: 步进电机的每次转动是基于四个引脚的信号变化(A, B, C, D)。不同的信号组合决定了电机的旋转步进角度。
- 延迟控制: 控制电机的转速时,可以通过延迟来设置每一步之间的时间,控制电机的转动速度。
控制过程:
-
连接:
- STM32 的四个 GPIO 引脚分别连接到 ULN2003 驱动板的输入引脚(IN1, IN2, IN3, IN4)。
- ULN2003 的输出引脚(OUT1, OUT2, OUT3, OUT4)分别连接到 28BYJ-48 步进电机的四个相绕组。
- 电源(5V)连接到电机的电源引脚。
-
控制方法:
- 使用 STM32 的 GPIO 引脚输出高低电平信号(0 或 3.3V)来控制电机绕组。
- 按照步进电机的步进顺序(通常为 4 步或者 8 步)依次改变输入信号的组合,推动电机的转动。
-
步进序列: 步进电机的四相步进顺序通常如下(假设使用半步驱动或全步驱动):
- 全步驱动顺序:
- IN1 = High, IN2 = Low, IN3 = Low, IN4 = Low
- IN1 = Low, IN2 = High, IN3 = Low, IN4 = Low
- IN1 = Low, IN2 = Low, IN3 = High, IN4 = Low
- IN1 = Low, IN2 = Low, IN3 = Low, IN4 = High
其中,
High
和Low
分别表示 3.3V 和 0V 信号。这个顺序可以控制步进电机向一个方向旋转。- 细分驱动模式(可选): 可以通过改变电流信号的切换方式,将每步的步进角度进一步细分,从而提高电机的精度和平稳度。
- 全步驱动顺序:
-
转速控制:
- 转速的快慢是通过调整每次步进之间的延迟时间来控制的。例如,如果
delay(10)
表示电机每步之间延迟 10 毫秒,增大延迟会减慢电机的转速,减小延迟会加快电机的转速
- 转速的快慢是通过调整每次步进之间的延迟时间来控制的。例如,如果
示例代码
cube配置
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void Motorcw()
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(10);
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
Motorcw();
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
学习笔记,有歧义请指出,感谢!