1基于STM32和L6208的步进电机控制系统摘要:本文介绍了步进电机的基本工作原理及控制方法,通过对ARM公司的STM32F103XX处理器Cortex-M3和ST公司步进电机驱动芯片L6208性能和驱动原理的深入分析,阐述了一种新型驱动步进电机的控制系统。本控制系统能够实时、准确、可靠地控制两相两极的步进电机。关键词:STM32、L6208、步进电机Abstract:Thispaperintroducedthebasicworkprincipleandcontrolmethods,ByintroducingtheperformanceofSTM32F103XXandthoroughanalyzingthedriveprincipleofDMOSdriverforbipolarsteepermotorL6208,Iexpoundedanewcontrolsystemfordrivingsteepermotor.Thiscontrolsystemcancontrolbipolarsteppermotorreal-time,wellandtrulyandreliably.Keywords:STM32,L6208,steppermotor第1章引言本系统采用STM32F103XX微控制器驱动双极性步进电机的方法,执行整步和半步模式来控制步进电机。用户可以选择:操作模式(整步/半步);电机旋转方式(顺时针/逆时针);当前控制模式(快速/慢速)。这种方法使用中密度STM32F103XX微控制器和全集成两相步进电机驱动L6208,这是性价比最高和最简单的方式获得最小的CPU负载。Cortex-M3是专门在微控制系统和无线网络等对功耗和成本敏感的嵌入式使用领域实现高系统性能而设计的,它大大简化了编程的复杂性,集高性能、低功耗、低成本于一体。本设计的主要特点:1、不需反馈器件,比其他运动控制系统成本低。2、尤其在低速扭转力和强稳定性方面具有优势。3、低功耗,高性能并且灵活,可用于机器人控制,机械工具转弯处,影像和其它精准的轴位置控制环境。4、高性能的STM32F103XX微控制器驱动步进电机依赖于控制器的低计算环境。第2章方案比较和论证总体系统框图如图1所示:图1系统框图22.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/CMOS3.3V电压。为全面保护对地短路和每个电桥的两个相位之间的短路,芯片内置过流检测电路(OCD)。OCD电路用于监测流经上桥臂功率DMOS晶体管的电流,因为没有外部电阻器,所以也就降低了功耗,符合节能要求。此外,为保证对IC进行的全面的保护,芯片上还集成了其它的特殊电路:监测电源电压的低压封锁保护以及一旦结温超过165℃时关闭所有功率输出的热保护功能。这个器件能够适应各种使用,包括微步进使用。基于上述理论分析和实际情况,拟定选择方案二。第3章系统硬件设计33.1电机控制系统的设计RESET、ENABLE、FAST/SLOW、HALF/FULL、CLOCK、CW/CCW是控制信号的输入端,控制信号由STM32提供,可以直接将STM32和L6208的相应引脚相连。STM32控制L6208对应引脚如表1所示:STM32引脚L6208引脚TIM2_CH1(PA0)CLOCK(PIN_1)PC2CONTROL(PIN_13)PC3HALF/FULL(PIN_12)PC4CW/CCW(PIN_2)PC5RESET(PIN_23)PC13EN(PIN_14)表1STM32控制L6208对应引脚电机控制系统原理图如图2所示:图2电机控制系统原理图L6208驱动电路图如图3所示:4图3L6208驱动电路图第4章系统软件设计主程序流程图:部分流程图:5图4DMA流程图图5系统时钟流程图第5章功能测试及结果分析第6章结束语本系统主要以STM32为主要控制芯片。采用了L6208驱动芯片实现电机控制。在设计6过程中,力求硬件电路简单,充分发挥软件设计的优势,编程灵活方便来满足系统的要求。参考文献[1]李宁,《基于MDK的STM32处理器开发使用》,北京航空航天大学出版社[2]黄智伟,《全国大学生电子设计竞赛系统设计》,北京航空航天大学出版社[3]ST公司,步进电机驱动l6208使用手册。附录一主要元器件清单:器件名称器件数量STM32F103RBT6微控制器1片电机驱动芯片L6208N1片42BYG102步进电机1个电阻、电容、电位器、二极管若干附录二主程序:intmain(void){/*SystemClocksConfiguration*/RCC_Configuration();/*NVICConfiguration*/NVIC_Configuration();/*Activatethedriver*/Stepper_Cmd(ENABLE);/*Drivercontrolpinconfiguration*/Stepper_PinControlConfig();/*Disabletheinitializationofthedriver*/Stepper_ResetDisable();/*-----------Modesselection:Rotationdirection,Stepmode,Decaymode---------------*/#ifdefRotationDirection_CWStepper_SetRotationDirection(Stepper_RotationDirection_CW);#endif/*RotationDirection_CW*/#ifdefRotationDirection_CCWStepper_SetRotationDirection(Stepper_RotationDirection_CCW);#endif/*RotationDirection_CCW*/#ifdefHalf_StepStepper_SelectMode(Stepper_Half);#endif/*Half_Step*/#ifdefFull_StepStepper_SelectMode(Stepper_Full);#endif/*Full_Step*/#ifdefControlSlow_CurrentStepper_SetControlMode(Stepper_ControlSlow);7#endif/*ControlSlow_Current*/#ifdefControlFast_CurrentStepper_SetControlMode(Stepper_ControlFast);#endif/*ControlFast_Current*//*Startthesteppermotor*/Stepper_Start(ENABLE);/*Peripheralsconfiguration*/Stepper_Init();while(1){}}/***@briefConfiguresthedifferentsystemclocks.*@paramNone*@retval:None*/voidRCC_Configuration(void){/*RCCsystemreset(fordebugpurpose)*/RCC_DeInit();/*EnableHSE*/RCC_HSEConfig(RCC_HSE_ON);/*WaittillHSEisready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS){/*EnablePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*Flash2waitstate*/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=72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*EnablePLL*/RCC_PLLCmd(ENABLE);/*WaittillPLLisready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){8}/*SelectPLLassystemclocksource*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*WaittillPLLisusedassystemclocksource*/while(RCC_GetSYSCLKSource()!=0x08){}}}/***@briefConfigurethenestedvectoredinterruptcontroller.*@paramNone*@retval:None*/voidNVIC_Configuration(void){NVIC_SetPriorityGrouping(7);/*0bitsforpre-emptionpriority4bitsforsubpriority*/NVIC_SetPriority(DMA1_Channel2_IRQn,0x01);/*0x01=0x03|(0x1&0x7),prorityis0x014*/NVIC_EnableIRQ(DMA1_Channel2_IRQn);}#ifdefUSE_FULL_ASSERT