热度 6
2023-7-5 01:12
1180 次阅读|
0 个评论
一、拆箱 东芝TB5128FTG是一款高性能的步进电机驱动器,它能够为两相和四相步进电机提供稳定、精确的控制。这款驱动器采用了先进的控制算法和驱动技术,确保电机在高速度和负载条件下也能稳定运行。它具有数字信号输入端口,可以轻松地通过微控制器控制电机的旋转方向、转速和定位。此外,东芝TB5128FTG还具有高温保护功能,确保在高温环境下也能可靠运行。总之,这款驱动器适用于各种工业自动化、机器人、打印机、雕刻机等领域,能够为项目提供出色的性能和可靠性。 在丝印可看出电源接入为直流电9-42v(推荐10-42v),以及接线端指示与拨码开关的设置示意。 二、步进电机的连接、驱动 步进电机是一种将电信号转化为角位移和线位移的电机,其转动角度和转速可以通过控制输入信号的脉冲数量和频率来精确控制。步进电机驱动板是用来驱动步进电机的专用电路板,它能够将STM32等微控制器的数字信号转换为适合步进电机的脉冲信号,同时提供电流和电压的放大,保护电机免受过流、过热等问题的损害。 在接线方面, 步进电机接线示意图如下: 我是用的是42BYGH47-401AS型号步进电机,在丝印上已经给了接线的示意: 对于步进电机的接线,四条引线,分别是A+、B+、A-和B-。将A和B线连接到驱动板的同名端口。这样,通过控制驱动板的ENA(使能)、DIR(方向)、PUL(脉冲)三对端口的状态,就可以控制步进电机的旋转方向和速度。 ENA、DIR和PUL三个信号的使用方法如下: ENA信号的使用: ENA信号是使能信号,用于控制步进电机是否开始旋转。当ENA信号有效时,步进电机驱动器会接收PUL和DIR信号的控制,并驱动步进电机按照指定方向旋转。如果ENA信号无效,步进电机将不会受到任何控制,处于停止状态。 例如,当需要启动步进电机并正转时,可以将ENA信号设置为高电平,DIR信号设置为高电平,PUL信号设置为按照一定频率和数量变化的脉冲信号。这样,步进电机就会在PUL信号的控制下按照指定方向旋转。 DIR信号的使用: DIR信号是方向信号,用于控制步进电机的旋转方向。当DIR信号为高电平时,步进电机正转;当DIR信号为低电平时,步进电机反转。例如,如果要将步进电机反转,可以将DIR信号设置为低电平,同时保持PUL信号不变。这样,步进电机就会在PUL信号的控制下反向旋转。 PUL信号的使用: PUL信号是脉冲信号,用于控制步进电机的旋转速度和位置。PUL信号的脉冲数量和频率决定了步进电机的旋转角度和速度。 在编写驱动代码时,需要使用STM32的GPIO口控制步进电机驱动板,并提供合适的控制信号。 代码如下: #include "stm32f10x.h" // 定义控制步进电机的ENA、DIR和PUL信号的GPIO口 #define ENA_PIN GPIO_Pin_5 #define DIR_PIN GPIO_Pin_4 #define PUL_PIN GPIO_Pin_3 // 定义步进电机驱动板的控制端口 #define ENA_PORT GPIOA #define DIR_PORT GPIOA #define PUL_PORT GPIOA void StepMotor(int stepCount) { // 设置方向端口状态 GPIO_WriteBit(DIR_PORT, DIR_PIN, Bit_RESET); // 逐步旋转步进电机 for (int i = 0; i < stepCount; i++) { // 设置步进电机步进端口状态 GPIO_WriteBit(PUL_PORT, PUL_PIN, Bit_SET); // 延时一段时间 delay(1); // 清除步进端口状态 GPIO_WriteBit(PUL_PORT, PUL_PIN, Bit_RESET); // 延时一段时间 delay(1); } } int main() { // 使能GPIOA和时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置ENA、DIR和PUL信号为输出模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = ENA_PIN | DIR_PIN | PUL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ENA_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = DIR_PIN; GPIO_Init(DIR_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = PUL_PIN; GPIO_Init(PUL_PORT, &GPIO_InitStructure); // 循环旋转步进电机100圈 for (int i = 0; i < 100; i++) { StepMotor(4096); // 4096为步进电机旋转一周的步数 } return 0; } 平衡车的连接、驱动 平衡车是一种通过感知车身姿态和用户指令来保持平衡的交通工具,它由平衡控制系统、电机驱动系统、传感器系统和人机交互系统等部分组成。其中,平衡控制系统是平衡车的核心部分,它根据传感器系统的数据和用户指令来控制电机驱动系统,以实现平衡车的稳定和控制。 在平衡车中,STM32F103Z8T6作为主控制器,负责接收传感器系统的数据和用户指令,并控制电机驱动系统。MPU6050是一种姿态传感器,它通过检测加速度和角速度来获取平衡车的姿态信息,包括俯仰角、横滚角和偏航角等。STM32F103Z8T6通过读取MPU6050的传感器数据,可以获得平衡车的实时姿态信息,并根据这些信息来控制电机驱动系统。 在电机驱动系 统中, 平衡车使用的 大功率编 码 减速 电机的驱动需要更高的电流和电压, 东芝TB5128FTG 支持高分辨率的细分控制,提高电机的运动平滑和精准度 。 通过以上组件的协同工作,平衡车可以实现以下工作原理: 姿态感知:MPU6050传感器通过检测加速度和角速度来获取平衡车的姿态信息,包括俯仰角、横滚角和偏航角等。这些信息被STM32F103Z8T6读取并进行处理。 控制系统:STM32F103Z8T6根据读取的MPU6050传感器数据和用户指令,计算出平衡车需要进行的调整动作,如向前、向后、向左或向右等。 驱动系统:根据STM32F103Z8T6的计算结果,电机驱动板控制步进电机的旋转方向和速度,以实现平衡车的移动和姿态调整。 动力系统:步进电机作为动力源,通过电机驱动板的控制实现旋转,从而带动平衡车的轮子或支撑结构运动。 通过以上工作原理,平衡车可以实现自动平衡和移动。当平衡车检测到姿态发生变化时,控制系统会根据传感器数据和用户指令进行调整,通过驱动系统控制步进电机旋转,带动平衡车的轮子或支撑结构运动,从而实现平衡车的稳定和控制。 此处仅讨论大功率编码减速电机的连接与驱动。 根据丝印分别是: 电线+ 编码器GND 编码器 B相 编码器 A相 编码器 5v 电线- 代码如下: #include "stm32f10x.h" // 定义GPIO端口 #define ENCODER_PORT GPIOA #define ENCODER_PIN_A GPIO_Pin_11 #define ENCODER_PIN_B GPIO_Pin_12 #define MOTOR_ENA_PORT GPIOB #define MOTOR_ENA_PIN GPIO_Pin_0 #define MOTOR_DIR_PORT GPIOB #define MOTOR_DIR_PIN GPIO_Pin_1 #define MOTOR_PUL_PORT GPIOB #define MOTOR_PUL_PIN GPIO_Pin_2 // 定义中断向量函数 void EXTI9_5_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line12) != RESET) { // 处理编码器A相中断 handle_encoder_phase_a_interrupt (); } if (EXTI_GetITStatus(EXTI_Line13) != RESET) { // 处理编码器B相中断 handle_encoder_phase_a_interrupt (); } // 清除中断标志位 EXTI_ClearITPendingBit(EXTI_Line12); EXTI_ClearITPendingBit(EXTI_Line13); } int main(void) { // 初始化GPIO端口 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = ENCODER_PIN_A | ENCODER_PIN_B; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(ENCODER_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = MOTOR_ENA_PIN | MOTOR_DIR_PIN | MOTOR_PUL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(MOTOR_ENA_PORT, &GPIO_InitStructure); GPIO_Init(MOTOR_DIR_PORT, &GPIO_InitStructure); BSRR = 0x00001000; // 使能EXTI11中断线(编码器A相)和EXTI12中断线(编码器B相) // 初始化定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 配置脉冲输出通道1和2 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 100; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC2Init(TIM3, &TIM_OCInitStructure); // 使能定时器3脉冲输出通道1和2 TIM_CtrlPWREnables(TIM3, TIM_CCxChannel1); TIM_CtrlPWREnables(TIM3, TIM_CCxChannel2); TIM_Cmd(TIM3, ENABLE); // 配置编码器 TIM_EncoderInitTypeDef TIM_EncoderInitStructure; TIM_EncoderInitStructure.TIM_EncoderMode = TIM_EncoderMode_TI12; TIM_EncoderInitStructure.TIM_IC1Polarity = TIM_ICPolarity_Rising; TIM_EncoderInitStructure.TIM_IC1Selection = TIM_ICSelection_DirectTI; TIM_EncoderInitStructure.TIM_IC2Polarity = TIM_ICPolarity_Rising; TIM_EncoderInitStructure.TIM_IC2Selection = TIM_ICSelection_DirectTI; TIM_EncoderInitStructure.TIM_IC1Prescaler = TIM_ICPSC_DIV1; TIM_EncoderInitStructure.TIM_IC2Prescaler = TIM_ICPSC_DIV1; TIM_EncoderInit(TIM3, &TIM_EncoderInitStructure); // 启用编码器 TIM_EncoderInterfaceEnable(TIM3, TIM_EncoderMode_TI12, TIM3_IC1, TIM3_IC2); // 启用全局中断和编码器中断 enableInterrupts(IRQ_MASK15); enableInterrupts(IRQ_MASK13); SR = 0; // 清除中断标志位 DIER = TIM3_DIER_UIE; // 允许更新中断 NVIC_SetPriority(TIM3_IRQn, 0); // 设置中断优先级 NVIC_EnableIRQ(TIM3_IRQn); // 使能中断向量 // 启动定时器3 TIM_Cmd(TIM3, ENABLE); // 电机控制逻辑 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == RESET) // 编码器A相输入为高电平 { if(IfPositiveRotation()) { NegativeReversal(); } } else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == RESET) // 编码器B相输入为高电平 { if(NegativeReversal()) { PositiveRotation(); } } else // 编码器A相和B相均为低电平,停止电机 { StopMotor(); } }