单片机控制电机调速实验报告.docx
《单片机控制电机调速实验报告.docx》由会员分享,可在线阅读,更多相关《单片机控制电机调速实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![单片机控制电机调速实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/7/b7b1b61e-09fa-416f-b064-f4401205d592/b7b1b61e-09fa-416f-b064-f4401205d5921.gif)
单片机控制电机调速实验报告
重庆邮电大学综合实验报告
——单片机控制步进电机调速
学生姓名:
组长:
AAAA
组员:
AAAAAAAA
学号:
XXXXX
XXXXXXXXXXXXX
所在学院:
自动化班级:
XXXXX专
业:
机械设计制造及其自指导老师:
XXXX成绩评定:
检测与控制实验中心
2
一、实验要求与目的3
1、设计要求3
2、实验目的3
二、设计思路3
三、实验原理4
1、步进电机4
2、步进电机控制系统结构4
3、速度控制算法5
四、功能概述及方案设计5
1、显示模块5
2、AD转换模块6
3、步进电机细分驱动模块6
五、实验运行程序7
六、实验心得13
参考文献13
3
一、实验要求与目的
1、设计要求
1、步进电机的给定速度由电位器通过AD转换输入
2、只有给定速度和实际速度显示功能
3、实际速度通过红外光电开关(或霍尔元件)检查
4、步进电机具有细分功能:
1/2细分1/4细分1/8细分
5、测试步进电机的响应时间及曲线
2、实验目的
1、熟悉步进电机的工作原理
2、熟悉51系列单片机的工作原理及调试方法
3、设计基于51系列单片机控制的步进电机调速原理图
4、实现51系列单片机对步进电机的速度控制
5、了解霍尔元件和步进电机细分驱动芯片tb6560的使用
二、设计思路
主控芯片采用STC89C52IL片机,显示采用1602液晶,由于步进电机速度设定由电位器
输入,使用外部ADtlc5510,AD时钟源接89C52ALE弓I脚,AD为并行,AD使用单片机
P1口,可以直接读取,根据对应数据设定速度。
步进电机速度控制采用闭环控制,由
于传统的PID控制算法波动较大,我们采用分级设定加速度的办法,并把编码器反馈回
来的速度与设定速度进行比较确定是加速还是减速,软件模拟加速减速过程,步进电机
细分由驱动芯片TB6560提供,由于驱动细分由ml、m2口电平决定,我们采取直接通过拨码开关设定电平,从而设定驱动细分值。
4
三、实验原理
1、步进电机
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机
就转动一个角度,因此非常适合于单片机控制。
步进电机可分为反应式步进电机(简称
VR)、永磁式步进电机(简称PM和混合式步进电机。
步进电机区别于其他控制电机的
最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数
决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控
制信号由单片机产生。
其基本原理作用如下:
(1)控制换相顺序
通电换相这一过程称为脉冲分配。
例如:
三相步进电机的三拍工作方式,其各相通电顺
序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。
(2)控制步进电机的转向
如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反
转。
(3)控制步进电机的速度
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。
两个脉
冲的间隔越短,步进电机就转得越快。
调整单片机发出的脉冲频率,就可以对步进电机
进行调速。
2、步进电机控制系统结构
单片机在适当的时刻通过对计数器0赋初值,设置好加减速过程的频率变化(即速度、
加速度变化),以防止失步。
例如,在点位控制中设置好速度曲线图,在起动和升速
时,使步进电机产生足够的转矩驱动负载,跟上规定的速度和加速度;在减速时,下降
特性使负载不产生过冲,停止在规定的位置。
启动细分驱动电路中的固化程序以产生一
定频率的脉冲,经功率放大后驱动步进电机运动。
步进电机运动方向的改变及启动和停
止均由计算机控制硬件控制电路实现。
5
图2步进电机控制系统
3、速度控制算法
单片机控制系统通过A/D电路检测设定速度值,通过编码器得到实际速度值,当实际
速度值大于设定速度值,步进电机加速,反之减速。
根据实际速度真与设定速度值的差
值大小的不同,将加速度分为三个等级,相差越大,加速度越大。
从而达到既能快速达
到设定速度值,又能让实际速度稳定在设定速度值左右的目的。
四、功能概述及方案设计
1、显示模块
显示模块采用1602液晶显示测量参数和显示所有测量数据。
程序逻动步进电编码
电源输入脉
细分指
6
2、AD转换模块
3、步进电机细分驱动模块
TB6560步进电机驱动电路主要包括3部分电路:
控制信号隔离电路、主电
路和自动半流电路,可利用简单的编程实现。
7
五、实验运行程序
#defineDataP0//数据端口
#defineLENGTH7
typedefunsignedcharuchar;typedefunsignedintuint;
codecharnum[]=0123456789;charsetSd[LENGTH]=SetSpd:
;charnowSd[LENGTH]=NowSpd:
;charr_min[5]=r/min;
//液晶显示接口sbitRS=P2A4;
sbitRW=P2A5;
sbitE=P2A6;
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);
8
}
if(number==0){WriteData(num[temp[0]]);}else{
i=0;while(number){temp[i]=number;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/******************************************************************
写入命令函数
******************************************************************/voidWriteCommand(uchar
c){DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/******************************************************************
9写入数据函数
******************************************************************/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);//displaymodeWriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymodeWriteCommand(0x06);//显示光标移动位置
WriteCommand(0x0c);//显示开及光标设置
WriteCommand(0x01);//显示清屏
}
/******************************************************************索
微妙级函数
12MHz频
******************************************************************/voidDelayUs(ucharus)
{ucharuscnt;uscnt=us>>1;
while(--uscnt);}
/******************************************************************
毫秒延时函数
****************************************************************
{while(--ms){DelayUs(250);DelayUs(250);/******************************************************Init.c******************************************************/
**/voidDelayMs(ucharms)
DelayUs(250);DelayUs(250);}}
文件
10
#include
typedefunsignedcharuchar;typedefunsignedintuint;
sbitCW=P2A1;
sbitENABLE=P2A2;
externvoidInitLcd(void);
/************************************************TB6560
初始化
***********************************************
CW=0;ENABLE=1;}
/************************************************功能:
周期定时50ms
定时器0初始化函数
*************************************************/voidInitTime0(void){
ET0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%6;TR0=1;}
TMOD|=0x01;EA=1;
/************************************************
定时器1初始化函数
功能:
设定为外部脉冲计数模式
*************************************************/voidInitTime1(void){
TMOD|=0x50;EA=1;
ET1=0;TH1=0;TL1=0;TR1=1;}/************************************************
定时器1初始化函数
功能:
设定为外部脉冲计数模式
*************************************************/voidInitTime2(void){
50000)/256;//重装载计数器赋初值
RCAP2L=(65536-50000)%6;ET2=1;
RCAP2H=(65536-
//开定时器
2中断
EA=1;
11
//开总中断
TR2=1;}
//开启定时器,并设置为自动重装载模式
/************************************************
总初始化函数
*************************************************/voidInitSystem(void){InitTime0();InitTime1();InitTime2();}
/******************************************************StepMotor.c
******************************************************/
InitLcd();InitTB6560();
文件
#include#include
#includeStepMotor.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(setSpeedif(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;}}}
12
/************************************************功能:
周期定时50ms
定时器2中断函数
***********************************************
**/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的中断标志要软件清0TR1=1;}
定时器0中断函数
***********************************************
/************************************************功能:
周期定时50ms**/voidTsr_Time0(void)interrupt1
{CLK=~CLK;TH0=(65536-adjustment)/256;//2600一转每秒TL0=(65536-adjustment)%6;
clkp2.0步进电机转速
c/cwP2.1正反转
EnableP2.2驱动使能
singalP3.5编码器信号反馈typedefunsignedcharuchar;typedefunsignedintuint;
sbitCLK=P2A0;
sbitCW=P2A1;
sbitENABLE=P2A2;
//函数声明
13
externvoidInitSystem(void);externvoidWriteData(ucharc);
externvoidWriteCommand(ucharc);
externvoidDisPlay(uintnumber,ucharstatus);
//变量定义intsetSpeed;//速度设定
intpreSetSpeed;ucharcount=0;
volatileintnowSpeed;//当前速度
intstaticAdjustment=0;
volatileintadjustment=30000;//周期调整
volatileucharstatusFlag=0;
六、实验心得
经过这次的实验,我们受益匪浅,熟悉掌握了步进电机的工作原理,对51系列单片机
的工作原理及调试方法也有了更进一步的了解,对霍尔元件和步进电机细分驱动芯片
tb6560的使用也有了一定的了解,经过这次实验,锻炼了我们对知识的综合能力,在
动手能力方面也有了进一步的提高。
希望以后有更多这种机会,为毕业设计做好充分的准备。
参考文献
[1]何耀三,唐卓尧编著,电气传动的单片机控制[M].重庆:
重庆大学出版社
1996
[2]刘金琪编著.机床电器自动控制[M].哈尔滨:
哈尔滨工业出版社,1999[3]
王建,于勤著.利用单片机实现步进电机控制[J].四川工业大学学报,
2002,5722
14
题目4:
基于CAN总线的单片机温度控制系统(粕电阻)设计实验
要求:
①具有CAN总线节点,能与其他CANm点进行数据交换
2具有温度采集系统(传感器采用铂电阻)
3具有温度非线性补偿电路(或者软件补偿)
4控制温度设置通过键盘输入
5具有实时温度值和设置温度值显示功能
⑥控制算法采用PID,输出才用继电器PW昉式(温度加热箱由实验室提供)