#基于STM32和L6208的步进电机控制系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于STM32和L6208的步进电机控制系统
摘要:本文介绍了步进电机的基本工作原理及控制方法,通过对ARM公司的STM32F103XX处理器Cortex-M3和ST公司步进电机驱动芯片L6208性能和驱动原理的深入分析,阐述了一种新型驱动步进电机的控制系统。

本控制系统能够实时、准确、可靠地控制两相两极的步进电机。

关键词:STM32、L6208、步进电机
Abstract:This paper introduced the basic work principle and control methods, By introducing the performance of STM32F103XX and thorough analyzing the drive principle of DMOS driver for bipolar steeper motor L6208, I expounded a new control system for driving steeper motor. This control system can control bipolar stepper motor real-time, well and truly and reliably.
Key words: STM32, L6208, stepper motor
第1章引言
本系统采用STM32F103XX微控制器驱动双极性步进电机的方法,执行整步和半步模式来控制步进电机。

用户可以选择:操作模式(整步/半步);电机旋转方式(顺时针/逆时针);当前控制模式(快速/慢速)。

这种方法使用中密度STM32F103XX微控制器和全集成两相步进电机驱动L6208,这是性价比最高和最简单的方式获得最小的CPU负载。

Cortex-M3是专门在微控制系统和无线网络等对功耗和成本敏感的嵌入式使用领域实现高系统性能而设计的,它大大简化了编程的复杂性,集高性能、低功耗、低成本于一体。

本设计的主要特点:
1、不需反馈器件,比其他运动控制系统成本低。

2、尤其在低速扭转力和强稳定性方面具有优势。

3、低功耗,高性能并且灵活,可用于机器人控制,机械工具转弯处,影像和其它精准
的轴位置控制环境。

4、高性能的STM32F103XX微控制器驱动步进电机依赖于控制器的低计算环境。

第2章方案比较和论证
总体系统框图如图1所示:
图1 系统框图
2.1控制模块选择
方案一:采用89C51作为步进电机控制器。

经典51单片机具有价格低廉、使用简单等优点。

但其运算速度低,功能单一,RAM、ROM空间小,不稳定等特点。

方案二:采用STM32F103XX作为步进电机控制器。

STM32通过寄存器模式,寻址方式灵活,RAM和FLASH容量大,运算速度快、低功耗、低电压等,且通过TIM2的输出比较模式来控制步进电机以连续周期的50%和一个可变频率。

DMA控制器可用来改变时钟周期,Systick定时器灵活地产生中断。

基于以上分析,选择方案二。

2.2电机的选择
方案一:采用直流电机。

直流电机具有优良的调速特性,调速平滑、方便,调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速启动、制动和反转;能满足生产自动化系统各种不同的特殊运行要求。

直流电机的工作状态可分为两种:开环状态和闭环状态。

直流电机工作在开环状态时,电路相对简单,但其定位性能比较差。

直流电机工作的闭环状态时,其定位性能精确,但是相对开环状态又要增加很多检测器件,使用的元器件多,电路非常复杂。

方案二:采用步进电机。

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。

在非超载的情况下,电机的转速、启停的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机一个脉冲信号,电机则转过一个步距角。

因此,步进电机具有快速启停能力,如果负荷不超过步进电机所能提供的动态转矩值,就能立即使步进电机启动或反转,而且步进电机的转换精度高,驱动电路简单,非常适合定位控制系统。

基于以上分析,选择方案二。

2.3驱动模块的选择
方案一:采用继电器对电动机的开和关进行控制,通过开关的切换对电机的速度进行调整。

这个方案的优点是电路较为简单,实现容易;缺点是继电器的响应速度慢、机械结构易损坏、寿命较短。

方案二:采用L6208驱动芯片。

提供了带CMOS/TTL输入逻辑以及几个保护功能的全保护型双H驱动桥,且为驱动双极步进电机而专门优化的全集成驱动器,从而大幅度减少了电机控制使用所需的外围元器件的数量。

此芯片产品采用8V~52V的单电源电压,所有的逻辑输入引脚都配有降低噪声敏感度的磁滞功能,而且兼容TTL/CMOS/CMOS 3.3V电压。

为全面保护对地短路和每个电桥的两个相位之间的短路,芯片内置过流检测电路(OCD)。

OCD电路用于监测流经上桥臂功率DMOS晶体管的电流,因为没有外部电阻器,所以也就降低了功耗,符合节能要求。

此外,为保证对IC进行的全面的保护,芯片上还集成了其它的特殊电路:监测电源电压的低压封锁保护以及一旦结温超过165℃时关闭所有功率输出的热保护功能。

这个器件能够适应各种使用,包括微步进使用。

基于上述理论分析和实际情况,拟定选择方案二。

第3章系统硬件设计
3.1电机控制系统的设计
RESET、ENABLE、FAST/SLOW、HALF/FULL、CLOCK、CW/CCW是控制信号的输入端,控制信号由STM32提供,可以直接将STM32和L6208的相应引脚相连。

STM32控制L6208对应引脚如表1所示:
STM32引脚L6208引脚
TIM2_CH1(PA0) CLOCK(PIN_1)
PC2 CONTROL(PIN_13)
PC3
HALF/ FULL(PIN_12)
PC4
CW/ CCW(PIN_2)
PC5 RESET(PIN_23)
PC13 EN(PIN_14)
表1 STM32控制L6208对应引脚
电机控制系统原理图如图2所示:
图2 电机控制系统原理图
L6208驱动电路图如图3所示:
图3 L6208驱动电路图第4章系统软件设计
主程序流程图:
部分流程图:
图4 DMA流程图
图5 系统时钟流程图
第5章功能测试及结果分析
第6章结束语
本系统主要以STM32为主要控制芯片。

采用了L6208驱动芯片实现电机控制。

在设计
过程中,力求硬件电路简单,充分发挥软件设计的优势,编程灵活方便来满足系统的要求。

参考文献
[1] 李宁,《基于MDK的STM32处理器开发使用》,北京航空航天大学出版社
[2] 黄智伟,《全国大学生电子设计竞赛系统设计》,北京航空航天大学出版社
[3] ST公司,步进电机驱动l6208使用手册。

附录一
主要元器件清单:
器件名称器件数量
STM32F103RBT6微控制器1片
电机驱动芯片L6208N 1片
42BYG102步进电机1个
电阻、电容、电位器、二极管若干
附录二
主程序:
int main(void)
{
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC Configuration */
NVIC_Configuration();
/* Activate the driver */
Stepper_Cmd(ENABLE);
/* Driver control pin configuration */
Stepper_PinControlConfig();
/* Disable the initialization of the driver */
Stepper_ResetDisable();
/* -----------Modes selection: Rotation direction, Step mode, Decay mode---------------*/
#ifdef RotationDirection_CW
Stepper_SetRotationDirection(Stepper_RotationDirection_CW);
#endif /* RotationDirection_CW */
#ifdef RotationDirection_CCW
Stepper_SetRotationDirection(Stepper_RotationDirection_CCW);
#endif /* RotationDirection_CCW */
#ifdef Half_Step
Stepper_SelectMode(Stepper_Half);
#endif /* Half_Step */
#ifdef Full_Step
Stepper_SelectMode(Stepper_Full);
#endif /* Full_Step */
#ifdef ControlSlow_Current
Stepper_SetControlMode(Stepper_ControlSlow);
#endif /* ControlSlow_Current */
#ifdef ControlFast_Current
Stepper_SetControlMode(Stepper_ControlFast);
#endif /* ControlFast_Current */
/* Start the stepper motor */
Stepper_Start(ENABLE);
/* Peripherals configuration */
Stepper_Init();
while (1)
{
}
}
/**
* @brief Configures the different system clocks.
* @param None
* @retval : None
*/
void RCC_Configuration(void)
{
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
/**
* @brief Configure the nested vectored interrupt controller.
* @param None
* @retval : None
*/
void NVIC_Configuration(void)
{
NVIC_SetPriorityGrouping(7); /* 0 bits for pre-emption priority 4 bits for
subpriority*/
NVIC_SetPriority(DMA1_Channel2_IRQn, 0x01); /* 0x01 = 0x0 << 3 | (0x1 & 0x7), prority is 0x01 << 4 */
NVIC_EnableIRQ(DMA1_Channel2_IRQn);
}
#ifdef USE_FULL_ASSERT。

相关文档
最新文档