步进电机控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
步进电机控制
文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)
杭州电子科技大学
电子系统设计综合实验
设计报告
实验名称: 步进电机控制
实验序号: 4
小组号: 4A
姓名学号:
指导教师: 黄继业
2015年1月4日
一.引言:
步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB)。实验中使用的是永磁式步进电机24BY 型,下图是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5 根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将COM 端标识为C,只要AC、A C、BC、B C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM 端接正电源,那么只要用开关元件
(如三极管),将A、A 、B、B 轮流接地。
二.实验要求:
1.(基本):控制四相六线式步进电机的转动(四相八拍方式)
2.(基本):显示步进电机的转动圈数、角度和方向
三.(扩展):用非接触的方式实时监测步进电机的工作状态
四.实验器材清单:
名称型号数量
驱动芯片L2981片
霍尔元件cs31441个
二极管80508个
电容100uf、各2个
电阻2K1个
四:实验电路原理图
1:驱动电路原理图:
2:驱动电路工作原理:
L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准
TTL逻辑电平信号,可驱动46V、2A以下的电机。OUT1、OUT2和OUT3、OUT4之间分别接两电机。IN1、IN2、IN3、IN4引脚从单片机接输入控制电平,控制电机正反转。
3:L298控制单双八拍的逻辑表:
4.霍尔模块电路图
4:霍尔模块工作原理:
霍尔传感器是对磁敏感的传感元件,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。如果在圆周上粘上多粒磁钢,可以实现旋转一周,获得多个脉冲输出。根据这些输出的脉冲可以实现实时监测电机的工作状态。
5.实验所用的程序代码:
源码目录:
USER:
STM32: (库文件)
Driver:
/*
要求:
控制步进电机转动,8拍
显示步进电机转动圈数,角度,方向。
非接触方式实时监测
*/
#include ""
#include ""
#include ""
#include ""
#include ""
u8 i,j,keynum,direction=0;
u16
Speedtime,loop_num1=0,loop_num2=0,interrupt_num=0,interrupt_speed=0; double angle=0;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
void EXTIX_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
= GPIO_Pin_15;
= GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource15);
=EXTI_Line15;
= EXTI_Mode_Interrupt;
= EXTI_Trigger_Rising;
= ENABLE;
EXTI_Init(&EXTI_InitStructure);
= EXTI15_10_IRQn;
= 0x0F;
= 0x0F;
= ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
interrupt_num ++; .");
lcd_6x8(0,3,"Loop Num1:");
lcd_6x8(0,4,"Loop Num2:");
lcd_6x8(0,5,"Angle:");
lcd_6x8(0,7,"Speed:");
lcd_6x8(60,7,"N/s");
while(1)
{
keynum=New_KEY_Scan();
switch(keynum)
{
case 1:direction++;if(direction==4)direction=0;break;
case 2:Speedtime-
=100;if(Speedtime==600)Speedtime=900;break;
default:break;
}
lcd_6x8_num(45,7,interrupt_speed); //每秒转速
lcd_6x8_num(100,7,interrupt_num);
if(direction==0)
{