单片机控制电机调速实验报告_第1页
单片机控制电机调速实验报告_第2页
单片机控制电机调速实验报告_第3页
单片机控制电机调速实验报告_第4页
单片机控制电机调速实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE4重庆邮电大学综合实验报告——单片机控制步进电机调速学生姓名:组长:AAAA组员:AAAAAAAA学号:XXXXXXXXXXXXXXXXXX所在学院:自动化班级:XXXXX专业:机械设计制造及其自动化指导老师:XXXX成绩评定:检测与控制实验中心目录一、实验要求与目的 31、设计要求 32、实验目的 3二、设计思路 3三、实验原理 41、步进电机 32、步进电机控制系统结构 43、速度控制算法 5四、功能概述及方案设计 51、显示模块 52、AD转换模块 63、步进电机细分驱动模块 6五、实验运行程序 7六、实验心得 13参考文献 13一、实验要求与目的1、步进电机的给定速度由电位器通过AD转换输入2、只有给定速度和实际速度显示功能3、实际速度通过红外光电开关(或霍尔元件)检查4、步进电机具有细分功能:1/2细分1/4细分1/8细分5、测试步进电机的响应时间及曲线1、熟悉步进电机的工作原理2、熟悉51系列单片机的工作原理及调试方法3、设计基于51系列单片机控制的步进电机调速原理图4、实现51系列单片机对步进电机的速度控制5、了解霍尔元件和步进电机细分驱动芯片tb6560的使用二、设计思路主控芯片采用STC89C52单片机,显示采用1602液晶,由于步进电机速度设定由电位器输入,使用外部ADtlc5510,AD时钟源接89C52ALE引脚,AD为并行,AD使用单片机P1口,可以直接读取,根据对应数据设定速度。步进电机速度控制采用闭环控制,由于传统的PID控制算法波动较大,我们采用分级设定加速度的办法,并把编码器反馈回来的速度与设定速度进行比较确定是加速还是减速,软件模拟加速减速过程,步进电机细分由驱动芯片TB6560提供,由于驱动细分由m1、m2口电平决定,我们采取直接通过拨码开关设定电平,从而设定驱动细分值。三、实验原理步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机。步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下:(1)控制换相顺序通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。(2)控制步进电机的转向如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。(3)控制步进电机的速度如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就可以对步进电机进行调速。单片机在适当的时刻通过对计数器0赋初值,设置好加减速过程的频率变化(即速度、加速度变化),以防止失步。例如,在点位控制中设置好速度曲线图,在起动和升速时,使步进电机产生足够的转矩驱动负载,跟上规定的速度和加速度;在减速时,下降特性使负载不产生过冲,停止在规定的位置。启动细分驱动电路中的固化程序以产生一定频率的脉冲,经功率放大后驱动步进电机运动。步进电机运动方向的改变及启动和停止均由计算机控制硬件控制电路实现。程序逻辑程序逻辑功率驱动器步进电机编码器电源输入脉冲细分指令图2步进电机控制系统单片机控制系统通过A/D电路检测设定速度值,通过编码器得到实际速度值,当实际速度值大于设定速度值,步进电机加速,反之减速。根据实际速度真与设定速度值的差值大小的不同,将加速度分为三个等级,相差越大,加速度越大。从而达到既能快速达到设定速度值,又能让实际速度稳定在设定速度值左右的目的。四、功能概述及方案设计显示模块采用1602液晶显示测量参数和显示所有测量数据。TB6560步进电机驱动电路主要包括3部分电路:控制信号隔离电路、主电路和自动半流电路,可利用简单的编程实现。五、实验运行程序/******************************************************Display.c文件******************************************************/#include<reg52.h>#include<intrins.h>#defineDataP0//数据端口#defineLENGTH7typedefunsignedcharuchar;typedefunsignedintuint;codecharnum[]="0123456789";charsetSd[LENGTH]="SetSpd:";charnowSd[LENGTH]="NowSpd:";charr_min[5]="r/min";//液晶显示接口sbitRS=P2^4;sbitRW=P2^5;sbitE=P2^6; voidDelayMs(ucharms);voidDelayUs(ucharus);voidInitLcd(void);voidWriteData(ucharc);voidWriteCommand(ucharc);voidDisPlay(uintnumber,ucharstatus);voidDisplayStr(char*s,ucharlength);/******************************************************************数据显示******************************************************************/voidDisPlay(uintnumber,ucharstatus){ chari; staticcharpre_i=0; chartemp[8]={0}; if(status==0) { WriteCommand(0x80); DisplayStr(setSd,LENGTH); } else { WriteCommand(0xc0); DisplayStr(nowSd,LENGTH); } if(number==0) { WriteData(num[temp[0]]); } else { i=0; while(number) { temp[i]=number%10; number/=10; i++; } if(pre_i>i) { WriteCommand(0x01);//显示清屏 } pre_i=i; while(i>0) { i--; WriteData(num[temp[i]]); } } DisplayStr(r_min,5);}/*******************************************字符串显示函数********************************************/voidDisplayStr(char*s,ucharlength){ ucharj=0; while(j<length) { WriteData(s[j]); j++; }}/******************************************************************写入命令函数******************************************************************/voidWriteCommand(ucharc){ DelayMs(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0;}/******************************************************************写入数据函数******************************************************************/voidWriteData(ucharc){ DelayMs(5);//操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0;}/******************************************************************初始化函数******************************************************************/voidInitLcd(void){ DelayMs(15); WriteCommand(0x38);//displaymode WriteCommand(0x38);//displaymode WriteCommand(0x38);//displaymode WriteCommand(0x06);//显示光标移动位置 WriteCommand(0x0c);//显示开及光标设置 WriteCommand(0x01);//显示清屏}/******************************************************************微妙级函数 12MHz频率******************************************************************/voidDelayUs(ucharus){ ucharuscnt; uscnt=us>>1; while(--uscnt);} /******************************************************************毫秒延时函数******************************************************************/voidDelayMs(ucharms){ while(--ms) { DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); }}/******************************************************Init.c文件******************************************************/#include<reg52.h>typedefunsignedcharuchar;typedefunsignedintuint;sbitCW=P2^1; sbitENABLE=P2^2; externvoidInitLcd(void);/************************************************TB6560初始化*************************************************/voidInitTB6560(void){ CW=0; ENABLE=1;}/************************************************定时器0初始化函数功能:周期定时50ms*************************************************/voidInitTime0(void){ TMOD|=0x01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;}/************************************************定时器1初始化函数功能:设定为外部脉冲计数模式*************************************************/voidInitTime1(void){ TMOD|=0x50; EA=1; ET1=0; TH1=0; TL1=0; TR1=1;}/************************************************定时器1初始化函数功能:设定为外部脉冲计数模式*************************************************/voidInitTime2(void){ RCAP2H=(65536-50000)/256;//重装载计数器赋初值 RCAP2L=(65536-50000)%256; ET2=1;//开定时器2中断 EA=1;//开总中断 TR2=1;//开启定时器,并设置为自动重装载模式}/************************************************总初始化函数*************************************************/voidInitSystem(void){ InitLcd(); InitTB6560(); InitTime0(); InitTime1(); InitTime2();}/******************************************************StepMotor.c文件******************************************************/#include<reg52.h>#include<math.h>#include"StepMotor.h"voidmain(void){ intK;InitSystem(); while(1) { if(statusFlag==0) { preSetSpeed=setSpeed; setSpeed=SET_SPEED; if(setSpeed>nowSpeed) { if(setSpeed-nowSpeed>10)K=10; elseif(setSpeed-nowSpeed>5)K=20; elseK=60; if(adjustment<1)adjustment=1; adjustment=adjustment-adjustment/K; } elseif(setSpeed<nowSpeed) { if(setSpeed-nowSpeed>10)K=10; elseif(setSpeed-nowSpeed>5)K=20; elseK=60; if(adjustment>30000)adjustment=30000; adjustment=adjustment+adjustment/K; } DisPlay(setSpeed,0); DisPlay(nowSpeed,1); statusFlag=1; } }}/************************************************定时器2中断函数功能:周期定时50ms*************************************************/voidTsr_Time2(void)interrupt5{ staticvolatileucharinTimes=0; TR1=0; if(inTimes<20) { inTimes++; } else { nowSpeed=TH1*256+TL1; statusFlag=0; inTimes=0; TH1=0; TL1=0; } TF2=0;//定时器2的中断标志要软件清0 TR1=1;}/************************************************定时器0中断函数功能:周期定时50ms*************************************************/voidTsr_Time0(void)interrupt1{ CLK=~CLK; TH0=(65536-adjustment)/256; //2600一转每秒 TL0=(65536-adjustment)%256; }/******************************************************StepMotor.h*******************************************************//********************************clkp2.0 步进电机转速c/cwP2.1 正反转EnableP2.2 驱动使能singalP3.5编码器信号反馈*********************************/#defineSET_SPEEDP1typedefunsignedcharuchar;typedefunsignedintuint; sb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论