1L298驱动步进电机摘要:本系统采用STM32作为主控制芯片,用L298驱动步进电机,并由按键分别控制步进电机的启/停,快速/慢速,整步/半步,正转/反转,发光二极管显示按键情况。实现了步进电机的基本功能。关键词:STM32、L298、步进电机Abstract:ThissystemadoptsSTM32microprocesserasmaincontroller.ThestepperisdrivenbyL298chip,andtheKeyscontrolsthestepper’smodeseparatelyasSTART/STOP,FAST/SLOW,FULL/HALF,CW/CCW,thenLEDshowswhethertheKeyispressed.Thesystemachievedthebasefunctionseasily.Keywords:STM32,L298,steppermotor第1章引言本系统采用STM32F103XX微控制器驱动步进电机的方法,由按键来执行整步和半步模式来控制L298,并驱动步进电机。用户可以选择:操作模式(整步/半步);电机旋转方式(顺时针/逆时针);当前控制模式(快速/慢速)。这种方法使用中密度STM32F103XX微控制器和常用电机驱动L298,这是性价比最高和最简单的方式获得最小的CPU负载。Cortex-M3是专门在微控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域实现高系统性能而设计的,它大大简化了编程的复杂性,集高性能、低功耗、低成本于一体。第2章方案比较与论证总体系统框图如图1所示:图1系统框图2.1控制模块选择方案一:采用89C51作为步进电机控制器。经典51单片机具有价格低廉、使用简单等优点。但其运算速度低,功能单一,RAM、ROM空间小,不稳定等特点。方案二:采用STM32F103XX作为步进电机控制器。STM32通过寄存器模式,寻址方式灵活,RAM和FLASH容量大,运算速度快、低功耗、低电压等,且通过TIM2的输出比较模式来控制步进电机以连续周期的50%和一个可变频率。DMA控制器可用来改变时钟周2期,Systick定时器灵活地产生中断。基于以上分析,选择方案二。2.2电机的选择方案一:采用直流电机。直流电机具有优良的调速特性,调速平滑、方便,调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速启动、制动和反转;能满足生产自动化系统各种不同的特殊运行要求。直流电机的工作状态可分为两种:开环状态和闭环状态。直流电机工作在开环状态时,电路相对简单,但其定位性能比较差。直流电机工作的闭环状态时,其定位性能精确,但是相对开环状态又要增加很多检测器件,使用的元器件多,电路非常复杂。方案二:采用步进电机。步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、启停的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机一个脉冲信号,电机则转过一个步距角。因此,步进电机具有快速启停能力,如果负荷不超过步进电机所能提供的动态转矩值,就能立即使步进电机启动或反转,而且步进电机的转换精度高,驱动电路简单,非常适合定位控制系统。基于以上分析,选择方案二。2.3驱动模块的选择方案一:采用继电器对电动机的开和关进行控制,通过开关的切换对电机的速度进行调整。这个方案的优点是电路较为简单,实现容易;缺点是继电器的响应速度慢、机械结构易损坏、寿命较短。方案二:采用DSP芯片,配以电机控制所需要的外围功能电路,通过数控电压源调节电机运行速度,实现控制物体的运动轨迹。该方案优点是体积小、结构紧凑、使用便捷、可靠性提高。但系统软硬件复杂、成本高。方案三:采用专用芯片L298N。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。基于上述理论分析和实际情况,拟定选择方案三。第3章系统硬件设计3.1电机驱动系统的设计按键Key1、Key2、Key3、Key4分别控制电机的START/STOP、FAST/SLOW、HALF/FULL、CW/CCW,作为驱动芯片L298的控制信号的输入端,按键控制电路和L298的封装分别如图2和图3所示:3100nFC5100nFC6100nFC7100nFC8LED1LED2LED3LED4330330330330100100Key3Key1Key4Key2Port5Port6Port7Port83.3V100100图2按键原理图图3L298N封装图L298引脚的功能如下所示:1、15=SEN1、SEN2分别为两个H桥的电流反馈脚,不用时可以直接接地;2、3=1Y1、1Y2输出端;13、14=2Y1、2Y2输出端;4=VS驱动电压,最小值须比输入的低电平电压高2.;5、7=1A1、1A2输入端,10、12=2A1、2A2输入端,TTL电平兼容;6、11=ENA、ENB使能端,低电平禁止输出;8=GND地;9=Vss逻辑电源。电机驱动系统原理图如图4所示:4图4电机控制系统原理图第4章系统软件设计程序流程图如下:5第5章功能测试及结果分析第6章结束语本系统主要以STM32为主要控制芯片。采用了L298驱动芯片实现电机控制。在设计过程中,力求硬件电路简单,充分发挥软件设计的优势,编程灵活方便来满足系统的要求。参考文献[1]李宁,《基于MDK的STM32处理器开发应用》,北京航空航天大学出版社[2]黄智伟,《全国大学生电子设计竞赛系统设计》,北京航空航天大学出版社[3]康华光,陈大钦,《电子技术基础》,高等教育出版社附录一主要元器件清单:器件名称器件数量STM32F103RBT6微控制器1片电机驱动芯片L298N1片42BYG102步进电机1个电阻、电容、按键、肖特基二极管等若干附录二主程序:#includereg52.h//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#defineucharunsignedchar#defineuintunsignedint#definehongwaiP2//红外扫描端口sbitIN1=P1^0;//电机输入IN1IN1--L,IN2--H反转sbitIN2=P1^1;//电机输入IN2sbitIN3=P1^2;//电机输入IN3IN3--L,IN4--H正转sbitIN4=P1^3;//电机输入IN4unsignedcharCYCLE;//定义周期该数字X基准定时时间如果是10则周期是10x0.1msunsignedcharPWM_ON;//定义高电平时间unsignedcharlevel1,level2,level3,level4;/******************************************************************//*延时函数*//******************************************************************/6//红外扫描函数voidscan(){hongwai|=0x0f;switch(hongwai){case0xf1:PWM_ON=80;level1=1;level2=0;level3=1;level4=0;break;//当检测到红外发射1为高时,调整方向,转向速度较大case0xf2:PWM_ON=40;level1=1;level2=0;level3=1;level4=0;break;//当检查到红外发射2为高时,调整方向,转向速度较小case0xf3:PWM_ON=60;level1=1;level2=0;level3=1;level4=0;break;//当检查到红外发射1和2都为高时,调整方向,转向速度中等case0xf4:PWM_ON=80;level1=0;level2=1;level3=0;level4=1;break;//当检测到红外发射4为高时,调整方向,转向速度较大case0xf8:PWM_ON=40;level1=0;level2=1;level3=0;level4=1;break;//当检查到红外发射3为高时,调整方向,转向速度较小case0xfc:PWM_ON=60;level1=0;level2=1;level3=0;level4=1;break;//当检查到红外发射3和4都为高时,调整方向,转向速度中等default:PWM_ON=50;level1=0;level2=1;level3=1;level4=0;}}/******************************************************************//*主函数*//******************************************************************/main(){TMOD|=0x01;//定时器设置1msin12McrystalTH0=(65536-1000)/256;TL0=(65536-1000)%256;//定时1mSIE=0x82;//打开中断TR0=1;CYCLE=100;//时间可以调整这个是10步调整周期10ms8位PWM就是256步while(1){scan();}}/******************************************************************//*定时器中断函数*//******************************************************************/voidtim(void)interrupt1using17{staticunsignedcharcount=0;//TH0=(65536-1000)/256;TL0=(65536-1000)%256;//定时1mSif(countPWM_ON){IN1=level1;IN2=level2;IN3=level3;IN4=level4;}else{IN1=0;IN2=0;IN3=0;IN4=0;}count++;if(count==CYCLE){count=0;}}