单片机控制电机调速实验报告
单片机步进电机控制实验报告

单片机步进电机控制实验报告单片机步进电机控制实验报告引言:步进电机是一种常用的电动机,具有结构简单、体积小、转速稳定等优点,广泛应用于工业自动化、机械设备等领域。
本实验旨在通过单片机控制步进电机,实现电机的正转、反转、加速、减速等功能。
通过实验,深入了解步进电机的工作原理和控制方法,提高对单片机的编程能力。
一、实验目的本实验的主要目的是掌握步进电机的工作原理,了解单片机控制步进电机的方法和步骤,并通过实验验证控制效果。
二、实验器材1. 步进电机:XX型号,XXV,XXA2. 单片机开发板:XX型号3. 驱动电路:包括电源、驱动芯片等三、实验原理步进电机是一种特殊的电动机,其转子通过电磁螺线管的工作原理实现转动。
步进电机的转子分为若干个极对,每个极对上都有一个螺线管,通过对这些螺线管施加电流,可以使转子转动。
单片机通过控制螺线管的电流,实现步进电机的控制。
四、实验步骤1. 连接电路:根据实验器材提供的电路图,将步进电机与单片机开发板相连接。
2. 编写程序:使用C语言编写单片机控制步进电机的程序。
程序中需要包括电机正转、反转、加速、减速等功能的实现。
3. 上传程序:将编写好的程序通过编程器上传到单片机开发板上。
4. 实验验证:通过按下开发板上的按键,观察步进电机的运动情况,验证程序的正确性。
五、实验结果与分析经过实验验证,编写的程序能够准确控制步进电机的运动。
按下不同的按键,电机可以实现正转、反转、加速、减速等功能。
通过调整程序中的参数,可以实现不同速度的控制效果。
实验结果表明,单片机控制步进电机具有较高的精确性和可靠性。
六、实验总结通过本次实验,我深入了解了步进电机的工作原理和控制方法,掌握了单片机控制步进电机的编程技巧。
实验中遇到了一些问题,如电路连接不正确、程序逻辑错误等,但通过仔细分析和排除,最终解决了这些问题。
通过实验,我不仅提高了对步进电机的理论认识,还锻炼了自己的动手实践能力和问题解决能力。
单片机步进电机控制实训报告

单片机步进电机控制实训报告一、引言随着工业自动化技术的不断发展,步进电机作为一种能够将电脉冲转化为机械转动的装置,在各种自动化控制系统中得到了广泛的应用。
而单片机作为现代电子计算机技术的重要分支,具有体积小、价格低、抗干扰能力强等特点,被广泛应用于各类电机的控制中。
本次实训旨在通过单片机实现对步进电机的控制,加深对步进电机和单片机理论知识的理解,提高实际操作技能。
二、实验目标本次实训的目标是通过单片机控制步进电机,实现电机的正转、反转、停转等操作。
同时,通过对电机的控制,进一步了解步进电机的特性和工作原理。
三、实验原理步进电机是一种将电脉冲转化为机械转动的装置。
当给步进电机施加一个电脉冲信号时,电机就会转动一个固定的角度,这个角度通常称为“步进角”。
通过控制电脉冲的数量和频率,可以实现对电机的速度和位置的控制。
而单片机的GPIO口可以输出高低电平信号,通过控制输出信号的频率和占空比,可以实现对步进电机的控制。
四、实验步骤1、准备器材:单片机开发板、步进电机、杜邦线、面包板、焊锡等。
2、连接电路:将步进电机连接到单片机开发板上,使用杜邦线连接电源和信号接口。
3、编写程序:使用C语言编写程序,通过单片机控制GPIO口输出电脉冲信号,控制步进电机的转动。
4、调试程序:在调试过程中,需要不断调整程序中的参数,观察电机的反应,直到达到预期效果。
5、测试结果:完成程序调试后,进行实际测试,观察步进电机是否能够实现正转、反转、停转等操作。
五、实验结果及分析通过本次实训,我们成功地实现了通过单片机控制步进电机的正转、反转、停转等操作。
在实验过程中,我们发现步进电机的转速和方向可以通过改变单片机输出信号的频率和占空比来控制。
我们还发现步进电机具有较高的精度和稳定性,适用于需要精确控制的位置和速度控制系统。
六、结论与展望通过本次实训,我们深入了解了步进电机的工作原理和单片机的应用。
实践证明,单片机控制步进电机是一种高效、精确、可靠的方法。
51系列单片机直流电机闭环调速实验

一、实验名称:51系列单片机直流电机闭环调速实验 基于Protuse 仿真实验平台实现二、实验内容(实验原理介绍): 1、直流电机调速原理图1所示电枢电压为V ,电枢电流I ,电枢回路总电阻为R ,电机常数C ,励磁磁通量Φ。
那么根据KVL 方程:电机转速φC IR V n -=,其中,对于极对数为P ,匝数为N ,电枢支路数为a 的电机来说:电机常数aPN C 60=,意味着电机确定后,该值是不变的。
而在V-IR 中,由于R 仅为绕组电阻,导致IR 非常小,所以V-IR ≈V 。
由此可见我们改变电枢电压,转速n 即可随之改变。
实现直流电机的闭环调速 实现原理如下图所示:2、测速软件设计Array图12 软件测速的方框图/****T1中断服务程序********单位时间(S)方波的个数*************/void time1_int(void) interrupt 3{count_speed++; if(count_speed == 20) { count_speed = 0;num_display = num_medium; num_medium = 0; }}3、PID 算法的数字实现由于DDC (Direct Digital Control )系统是一种时间离散控制系统。
因此,为了用微机实现(式3-1-1)必须将其离散化,用数字形式的差分方程来代替连续系统的微分方程。
离散化的PID 表达式为:[]⎭⎬⎫⎩⎨⎧--++=∑=nj DIP n e n e T T j e T T n e K n P 0)1()()()()( (式3-1-2)式中,T ——采样周期;P n ()——第n 次采样时微机输出;e n ()——第n 次采样时的偏差值;e n ()-1——第n-1次采样时的偏差值;n ——采样序号,n =0,1,2,…。
通常把(式3-1-2)称为PID 的位置控制算式。
根据(式3-1-2)可以进一步推导出离散化的位置型PID 编程表达式,如(式3-1-3):第K 次采样PID 的输出式为:P K P K P K P K P I D ()()()()=++(式3-1-3)其中,设[]⎪⎪⎩⎪⎪⎨⎧--=-+=+===∑∑==)1()()()1()()()()()()()(00K E K E K K P K P K E K j e K K E K j E K K P K E K K P D DK j I I I I K j I I P P 式中,K TT K K T T K I I PD DP=----=----积分系数;微分系数。
单片机直流有刷电机系统控制实验报告

实验名称:单片机直流有刷电机系统控制实验报告实验目的:1. 了解有刷电机的工作原理和基本结构2. 掌握单片机对有刷电机进行控制的方法和技巧3. 探究单片机直流有刷电机系统的稳定性和精确控制性能实验设备:1. 单片机开发板2. 直流有刷电机3. 桥式整流器4. 电源供应器5. 逻辑分析仪6. 示波器实验过程:1. 连接单片机开发板和直流有刷电机,并通过桥式整流器和电源供应器为系统供电。
2. 编写单片机控制程序,包括PWM波输出、速度控制算法等内容。
3. 将程序下载到单片机开发板上,并通过逻辑分析仪和示波器对系统进行调试和监测。
4. 在不同工作条件下,比如负载变化、电压波动等情况下,观察系统的稳定性和控制性能。
实验结果与数据分析:1. 经过一系列实验操作,我们获得了系统在不同工况下的运行数据,包括电流、转速、PWM波形等。
2. 通过对数据的分析,我们发现系统在稳态和动态工作条件下表现出了良好的稳定性和精准性能,能够满足实际工程控制要求。
3. 我们也发现了系统在特定工况下的一些问题和不足之处,比如在低速和负载较大时的起动过程中的震动和噪音等。
结论与讨论:1. 通过本次实验,我们对单片机直流有刷电机系统的控制原理和方法有了更深入的了解,同时也掌握了一定的实际操作技能。
2. 在工程应用中,我们应该综合考虑系统的稳定性、动态性能和控制精度,进行更加系统和全面的设计和调试。
3. 我们还需要进一步研究和改进系统中存在的问题,以提高系统的整体性能和工程应用价值。
附录:实验中使用到的控制程序代码和调试数据记录表格。
在控制系统稳定性方面,我们发现在不同的负载条件下,系统的稳定性表现出了一定的差异。
在轻载条件下,系统的动态响应较快,控制精度较高;而在重载条件下,系统的动态响应速度降低,控制精度也有所下降。
这表明在实际工程应用中,需要根据具体的负载情况对于控制系统进行相应的调节和优化,以获得更好的稳定性和控制性能。
在实验过程中,我们也发现了一些值得注意的问题。
基于单片机的直流电机控制设计性实验报告

设计题目:直流电机控制电路设计一设计目的1掌握单片机用PWM实现直流电机调整的基本方法,掌握直流电机的驱动原理。
2学习模拟控制直流电机正转、反转、加速、减速的实现方法。
二设计要求用已学的知识配合51单片机设计一个可以正转、反转或变速运动的直流电机控制电路,并用示波器观察其模拟变化状况。
三设计思路及原理利用单片机对PWM信号的软件实现方法。
MCS一51系列典型产品8051具有两个定时计数器。
因为PWM信号软件实现的核心是单片机内部的定时器,所以通过控制定时计数器初值,从而可以实现从8051的任意输出口输出不同占空比的脉冲波形。
从而实现对直流电动机的转速控制。
AT89C51的P1.0—P1.2控制直流电机的快、慢、转向,低电平有效。
P3.0为PWM波输出,P3.1为转向控制输出,P3.2为蜂鸣器。
PWM控制DC电机转速,晶振为12M,利用定时器控制产生占空比可变的PWM波,按K1键,PWM值增加,则占空比增加,电机转快,按K2键,PWM值减少,则占空比减小,电机转慢,当PWM值增加到最大值255或者最小值1时,蜂鸣器将报警四实验器材DVCC试验箱导线若电源等器件PROTUES仿真软件KRIL软件五实验流程与程序#include < reg51.h >sbit K1 =P1^0 ; 增加键sbit K2 =P1^1 ; 减少键sbit K3 =P1^2 ; 转向选择键sbit PWMUOT =P3^0 ; PWM波输出sbit turn_around =P3^1 ; 转向控制输出sbit BEEP =P3^2 ; 蜂鸣器unsigned int PWM;void Beep(void);void delay(unsigned int n);void main(void){TMOD=0x11; //设置T0、T1为方式1,(16位定时器) TH0=0 ; 65536us延时常数{t=(65536-TH)/fose/12} TL0=0;TH1=PWM ; //脉宽调节,高8位TL1=0;EA=1; //开总中断ET0=1; //开T0中断ET1=1; //开T1中断TR0=1 ; // T0定时允许while(1){if(K3==0&&K1==1&&K2==1) // 转向{turn_around=!turn_around;}while(K3==0); //检测K3是否释放do{PWM++ ;if(PWM>0xfe)//防止PWMS计数溢出{PWM=0xff;}if(PWM==0xff)Beep() ; 响delay(3000);}while(K1==0&&K2==1);do{PWM-- ;if(PWM<1){PWM=1;}if(PWM==1)Beep() ;delay(3000);}while(K1==1&&K2==0);}}void timer0() interrupt 1 using 2 // 定时器0中断服务程序{TR1=0 ; //T1禁止TH0=0 ; //置T0定时常数TL0=0 ;TH1=PWM ; //置T1定时常数TL1=0;TR1=1 ; //T1允许PWMUOT=0 ;// PWM波输出0}void timer1() interrupt 3 using 3 //定时器1中断服务程序{TR1=0 ; //T1禁止PWMUOT=1 ; //PWM波输出1}void Beep(void) //蜂鸣器子程序{unsigned char i;for (i=0;i<100;i++){delay(100);BEEP=!BEEP; }BEEP=1; delay(100);}void delay(unsigned int n){while(n--) ;}六 Proteus仿真截图七实验结果此次试验通过仿真系统进行了仿真,按下相应的开关,可实现控制直流电机的加速、减速及转向。
单片机控制步进电机调速实验

51系列单片机控制步进电机调速实验实验目的及要求:1、熟悉步进电机的工作原理2、熟悉51系列单片机的工作原理及调试方法3、设计基于51系列单片机控制的步进电机调速原理图(要求实现电机的速度反馈测量,测量方式:数字测量)4、实现51系列单片机对步进电机的速度控制(步进电机由实验中心提供,具体型号42BYG )由按钮控制步进电机的启动与停止;实现加速、匀速、和减速控制。
速度设定由键盘设定,步进电机的反馈速度由LED数码管显示。
实验原理:步进电机控制原理一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机。
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。
步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
因此步进电动机是一种把脉冲变为角度位移(或直线位移)的执行元件。
步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。
由于输入的是脉冲信号,输出的角位移是断续的,所以又称为脉冲电动机。
随着数字控制系统的发展,步进电动机的应用将逐渐扩大。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号可以由单片机产生。
电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几何轴线依次分别与转子齿轴线错开。
0、1/3て、2/3て,(相邻两转子齿轴线间的距离为齿距以て表示),即A与齿1相对齐,B与齿2向右错开1/3て,C与齿3向右错开2/3て,A'与齿5相对齐,(A'就是A,齿5就是齿1)下面是定转子的展开图:(图2所示)图1 是反应式步进电动机结构示意图,它的定子具有均匀分布的六个磁极,磁极上绕有绕组。
控制步进电机实验报告(3篇)

第1篇一、实验目的1. 理解步进电机的工作原理及控制方法。
2. 掌握单片机与步进电机驱动模块的接口连接方法。
3. 学习使用C语言编写程序,实现对步进电机的正反转、转速和定位控制。
4. 通过实验,加深对单片机控制系统的理解。
二、实验原理步进电机是一种将电脉冲信号转换为角位移或线位移的电机,其特点是控制精度高、响应速度快、定位准确。
步进电机控制实验主要涉及以下几个方面:1. 步进电机驱动模块:常用的驱动模块有ULN2003、A4988等,它们可以将单片机的数字信号转换为步进电机的控制信号。
2. 单片机:单片机是整个控制系统的核心,负责接收按键输入、处理数据、控制步进电机驱动模块等。
3. 步进电机:步进电机分为单相、双相和三相等类型,本实验使用的是双相四线步进电机。
三、实验设备1. 单片机开发板:例如STC89C52、STM32等。
2. 步进电机驱动模块:例如ULN2003、A4988等。
3. 双相四线步进电机。
4. 按键。
5. 数码管。
6. 电阻、电容等元件。
7. 电源。
四、实验步骤1. 硬件连接(1)将步进电机驱动模块的输入端(IN1、IN2、IN3、IN4)分别连接到单片机的P1.0、P1.1、P1.2、P1.3口。
(2)将按键的输入端连接到单片机的P3.0口。
(3)将数码管的段选端连接到单片机的P2口。
(4)将步进电机驱动模块的电源端连接到电源。
(5)将步进电机连接到驱动模块的输出端。
2. 编写程序(1)初始化单片机I/O端口,设置P1口为输出端口,P3.0口为输入端口,P2口为输出端口。
(2)编写按键扫描函数,用于读取按键状态。
(3)编写步进电机控制函数,实现正反转、转速和定位控制。
(4)编写主函数,实现以下功能:a. 初始化数码管显示;b. 读取按键状态;c. 根据按键状态调用步进电机控制函数;d. 更新数码管显示。
3. 调试程序(1)将程序烧写到单片机中;(2)打开电源,观察数码管显示和步进电机运行状态;(3)根据需要调整程序,实现不同的控制效果。
基于51单片机的PWM直流电机调速

基于51单片机的PWM直流电机调速在现代社会,PWM直流电机已经成为各类机械设备不可或缺的动力源。
为了更好地控制电机的转速和输出功率,我们需要进行PWM调速操作。
本文将简要介绍如何基于51单片机实现PWM直流电机的调速。
一、PWM调速原理PWM调速是一种通过改变电机供电电压的占空比来调整电机转速和功率的方法。
当一个周期内高电平所占的时间比较短时,电机得到的平均电流和平均转矩也相应减小,电机的速度和功率也随之降低。
反之,当高电平所占的时间比较长时,电机得到的平均电流和平均转矩也相应增大,电机的速度和功率也随之提高。
因此,通过改变PWM信号的高电平占空比,可以实现直流电机的调速、调功等功能,极大地提高了电机的效率和可控性。
二、硬件电路搭建根据上述PWM调速原理,我们需要搭建一个控制板,将51单片机的PWM输出与直流电机相连。
具体电路如下:1、选择合适的电源供电,一般为12V/24V直流电源。
2、使用L298N模块作为直流电机驱动模块,将模块的电源接到电源供电上,将模块的IN1和IN2引脚分别接到51单片机的P1^0和P1^1引脚上,将直流电机的正负极分别接到模块的OUT1和OUT2引脚上。
3、将51单片机的P1^2引脚连接到一个脉冲宽度计波形滤波器(LCF)的输入端,并将输出端接到L298N模块的ENA引脚上。
4、调整脉冲宽度计波形滤波器的参数,以达到合理的PWM输出波形。
5、建立一个按键,将按键的一端接到51单片机的P3^2引脚上,将另一端接到单片机的地端。
6、根据需要进行其他接线。
三、软件程序设计根据上述硬件电路,我们需要进行相应的软件程序设计,以实现基于51单片机的PWM 直流电机调速。
以下是程序设计的主要步骤:1、在程序中定义需要使用的IO口。
2、调用定时器初始化程序,设置定时器的时钟频率、计数器值和工作方式等参数。
3、编写一个PWM输出函数,实现对PWM信号的输出。
4、编写一个ADC采样函数,读取ADC转换器的值,并根据采样值输出一定的PWM信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆邮电大学综合实验报告——单片机控制步进电机调速学生姓名:组长:AAAA组员:AAAAAAAA学号:XXXXXXXXXXXXXXXXXX所在学院:自动化班级:XXXXX专业:机械设计制造及其自动化指导老师:XXXX成绩评定:检测与控制实验中心目录一、实验要求与目的 (3)1、设计要求 (3)2、实验目的 (3)二、设计思路 (3)三、实验原理 (4)1、步进电机 (4)2、步进电机控制系统结构 (4)3、速度控制算法 (5)四、功能概述及方案设计 (5)1、显示模块 (5)2、AD转换模块 (6)3、步进电机细分驱动模块 (6)五、实验运行程序 (7)六、实验心得 (13)参考文献 (13)一、实验要求与目的1、设计要求1、步进电机的给定速度由电位器通过AD转换输入2、只有给定速度和实际速度显示功能3、实际速度通过红外光电开关(或霍尔元件)检查4、步进电机具有细分功能:1/2细分 1/4细分 1/8细分5、测试步进电机的响应时间及曲线2、实验目的1、熟悉步进电机的工作原理2、熟悉51系列单片机的工作原理及调试方法3、设计基于51系列单片机控制的步进电机调速原理图4、实现51系列单片机对步进电机的速度控制5、了解霍尔元件和步进电机细分驱动芯片tb6560的使用二、设计思路主控芯片采用STC89C52单片机,显示采用1602液晶,由于步进电机速度设定由电位器输入,使用外部AD tlc5510,AD时钟源接89C52 ALE引脚,AD为并行,AD使用单片机P1口,可以直接读取,根据对应数据设定速度。
步进电机速度控制采用闭环控制,由于传统的PID控制算法波动较大,我们采用分级设定加速度的办法,并把编码器反馈回来的速度与设定速度进行比较确定是加速还是减速,软件模拟加速减速过程,步进电机细分由驱动芯片TB6560提供,由于驱动细分由m1、m2口电平决定,我们采取直接通过拨码开关设定电平,从而设定驱动细分值。
三、实验原理1、步进电机步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。
步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。
其基本原理作用如下:(1)控制换相顺序通电换相这一过程称为脉冲分配。
例如:三相步进电机的三拍工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。
(2)控制步进电机的转向如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。
(3)控制步进电机的速度如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。
两个脉冲的间隔越短,步进电机就转得越快。
调整单片机发出的脉冲频率,就可以对步进电机进行调速。
2、步进电机控制系统结构单片机在适当的时刻通过对计数器0赋初值,设置好加减速过程的频率变化(即速度、加速度变化),以防止失步。
例如,在点位控制中设置好速度曲线图,在起动和升速时,使步进电机产生足够的转矩驱动负载,跟上规定的速度和加速度;在减速时,下降特性使负载不产生过冲,停止在规定的位置。
启动细分驱动电路中的固化程序以产生一定频率的脉冲,经功率放大后驱动步进电机运动。
步进电机运动方向的改变及启动和停止均由计算机控制硬件控制电路实现。
图2 步进电机控制系统3、速度控制算法单片机控制系统通过A/D电路检测设定速度值,通过编码器得到实际速度值,当实际速度值大于设定速度值,步进电机加速,反之减速。
根据实际速度真与设定速度值的差值大小的不同,将加速度分为三个等级,相差越大,加速度越大。
从而达到既能快速达到设定速度值,又能让实际速度稳定在设定速度值左右的目的。
四、功能概述及方案设计1、显示模块显示模块采用1602液晶显示测量参数和显示所有测量数据。
程序逻辑功率驱动器步进电机编码器电源输入脉冲细分指令2、AD转换模块3、步进电机细分驱动模块TB6560步进电机驱动电路主要包括3部分电路:控制信号隔离电路、主电路和自动半流电路,可利用简单的编程实现。
五、实验运行程序/******************************************************Display.c文件******************************************************/#include <reg52.h>#include <intrins.h>#define Data P0 //数据端口#define LENGTH 7typedef unsigned char uchar;typedef unsigned int uint;code char num[] = "0123456789";char setSd[LENGTH] = "SetSpd:";char nowSd[LENGTH] = "NowSpd:";char r_min[5] = "r/min";//---------液晶显示接口------------sbit RS = P2^4;sbit RW = P2^5;sbit E = P2^6;void DelayMs(uchar ms);void DelayUs(uchar us);void InitLcd(void);void WriteData(uchar c);void WriteCommand(uchar c);void DisPlay(uint number, uchar status);void DisplayStr(char *s,uchar length);/****************************************************************** 数据显示******************************************************************/ void DisPlay(uint number, uchar status){char i;static char pre_i = 0;char temp[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);}/*******************************************字符串显示函数********************************************/void DisplayStr(char *s,uchar length){uchar j = 0;while(j < length){WriteData(s[j]);j++;}}/****************************************************************** 写入命令函数******************************************************************/ void WriteCommand(uchar c){DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/******************************************************************写入数据函数******************************************************************/ void WriteData(uchar c){DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/****************************************************************** 初始化函数******************************************************************/ void InitLcd(void){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏}/****************************************************************** 微妙级函数12MHz频率******************************************************************/ void DelayUs(uchar us){uchar uscnt;uscnt = us>>1;while(--uscnt);}/****************************************************************** 毫秒延时函数******************************************************************/ void DelayMs(uchar ms){while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}/******************************************************Init.c文件******************************************************/#include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;sbit CW = P2^1;sbit ENABLE = P2^2;extern void InitLcd(void);/************************************************ TB6560初始化*************************************************/ void InitTB6560(void){CW = 0;ENABLE = 1;}/************************************************定时器0初始化函数功能:周期定时50ms*************************************************/ void InitTime0(void){TMOD |= 0x01;EA = 1;ET0 = 1;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;TR0 = 1;}/************************************************定时器1初始化函数功能:设定为外部脉冲计数模式*************************************************/ void InitTime1(void){TMOD |= 0x50;EA = 1;ET1 = 0;TH1 = 0;TL1 = 0;TR1 = 1;}/************************************************定时器1初始化函数功能:设定为外部脉冲计数模式*************************************************/ void InitTime2(void){RCAP2H = (65536-50000)/256; //重装载计数器赋初值RCAP2L = (65536-50000)%256;ET2 = 1; //开定时器2中断EA = 1; //开总中断TR2 = 1; //开启定时器,并设置为自动重装载模式}/************************************************总初始化函数*************************************************/void InitSystem(void){InitLcd();InitTB6560();InitTime0();InitTime1();InitTime2();}/****************************************************** StepMotor.c文件******************************************************/#include <reg52.h>#include <math.h>#include "StepMotor.h"void main(void){int K;InitSystem();while(1){if(statusFlag == 0){preSetSpeed = setSpeed;setSpeed = SET_SPEED;if(setSpeed > nowSpeed){if(setSpeed - nowSpeed > 10)K = 10;else if(setSpeed - nowSpeed > 5)K = 20;else K = 60;if(adjustment < 1)adjustment = 1;adjustment = adjustment - adjustment/K;}else if(setSpeed < nowSpeed){if(setSpeed - nowSpeed > 10)K = 10;else if(setSpeed - nowSpeed > 5)K = 20;else K = 60;if(adjustment > 30000)adjustment = 30000;adjustment = adjustment + adjustment/K;}DisPlay(setSpeed,0);DisPlay(nowSpeed,1);statusFlag = 1;}}}/************************************************定时器2中断函数功能:周期定时50ms*************************************************/void Tsr_Time2(void) interrupt 5{static volatile uchar inTimes = 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*************************************************/void Tsr_Time0(void) interrupt 1{CLK = ~CLK;TH0 = (65536 - adjustment)/256; //2600一转每秒TL0 = (65536 - adjustment)%256;}/****************************************************** StepMotor.h*******************************************************/ /********************************clk p2.0 步进电机转速c/cw P2.1 正反转Enable P2.2 驱动使能singal P3.5 编码器信号反馈*********************************/#define SET_SPEED P1typedef unsigned char uchar;typedef unsigned int uint;sbit CLK = P2^0;sbit CW = P2^1;sbit ENABLE = P2^2;//--------------函数声明--------------extern void InitSystem(void);extern void WriteData(uchar c);extern void WriteCommand(uchar c);extern void DisPlay(uint number, uchar status);//------------变量定义-------------int setSpeed; //速度设定int preSetSpeed;uchar count = 0;volatile int nowSpeed; //当前速度int staticAdjustment = 0;volatile int adjustment = 30000; //周期调整volatile uchar statusFlag = 0;六、实验心得经过这次的实验,我们受益匪浅,熟悉掌握了步进电机的工作原理,对51系列单片机的工作原理及调试方法也有了更进一步的了解,对霍尔元件和步进电机细分驱动芯片tb6560的使用也有了一定的了解,经过这次实验,锻炼了我们对知识的综合能力,在动手能力方面也有了进一步的提高。