找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11564|回复: 7
打印 上一主题 下一主题
收起左侧

基于单片机的直流伺服电机驱动调速控制设计

  [复制链接]
跳转到指定楼层
楼主
ID:457373 发表于 2018-12-28 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是项目相关文档,基于AT86C52设计关于直流伺服电机调速的
【项目目标】
1、知识目标:
掌握直流伺服电动机工作原理 ,掌握直流伺服电动机的特性 ,掌握直流伺服电动机的调速控制方法 。
2、能力目标:
要求会通过数字逻辑芯片或者单片机技术设计该直流伺服电机的驱动电路。
【重点难点】
1、重点:直流伺服电机的工作原理及其驱动电路设计
2、难点:直流电机的驱动电路设计
【相关知识】
本设计要求用单片机实现直流电机(学生自由选择)的驱动调速控制,学生在项目进行前,有必要重新学习单片机课程。为了加快项目进度,可以选用本院学生普遍学习的AT89C51单片机为核心控制模块。
【项目实施】
一、项目任务
1.实现对电机的启动、停止、加速、减速、正转、反转的控制;
   2.通过编码器实现对电机速度的检测;
   3.实现对电机实时速度的显示;
   4.设计电机驱动的硬件电路;
   5.编制驱动电机的单片机控制程序;
   6.要求电机稳态工作性能好,电机速度可调范围宽至少达到 0-1200r/min
二、项目实施:
1、制订方案(2人一组),要求每小组方案尽量不同,如有雷同,视作抄袭
小组讨论初步拟定实施方案。各小组查阅相关资料,制定各自的可行性方案。教师提供基本设计方案,如图1,学生可在此基础上扩展其功能。
图1 基本设计方案
2、确定方案:
各小组交流、评价各个方案的优缺点,确定实施方案。
3、实施方案:
    方案实施的基本技术路线如图2所示。各小组可根据教师提供的基本技术路线,适时调整各自的计划进度。由于时间和硬件条件限制,只需做到PROTEUS联合仿真即可,有条件有兴趣的同学可以完成整个方案的设计。可利用面包板、也可以利用PCB制版。
图2基本技术路线图
【项目评价】
1、成果展示
每个项目都要求学生以团队的形式完成项目所要求的任务,在对每个团队的项目进行验收和总结时,以大赛的形式评价学生团队的作品来调动学生的积极性。学生在项目作品展示时,与同类作品进行比较,展示自己的优势并发现不足,这比课堂上教师单纯的教授知识点更具有说服力。
2、过程评价
每个项目的课程大赛成绩可作为成绩考核的主要依据,比赛采取现场实操测试、答辩的形式,根据学生表现分配一定的分值。同时,采取学生项目作品互评形式,每个完成项目的学生可以对分配到的3-5个作品进行综合评价,综合评价结果可以分配一定的比例分值。在项目实施过程中,建立学生项目过程自评表,作为成绩评定的一项依据。                                 
学生项目过程自评表
学科:控制电机     项目名称:直流电机驱动控制系统设计    班级:      姓名:
类别
出勤3
学习态度6
准备工作7
项目方案9
创新能力9
沟通协作9
项目进度10
项目报告15
项目作业30
合计成绩100
得分










项目实施方案

项目总结报告


【项目总结 】
通过本次项目训练,可以让同学们受益匪浅。一方面,学生将课堂上的理论知识应用到了实际,加强巩固了理论知识,也提高了实际动手能力,通过实践反馈,又了解到学生自身知识面的不足。另一方面,在实验过程中,遇到问题时候,各个小组列出可能问题,一一进行排查,找出问题的所在,队员之间分工明确,团结合作,本次训练正是通过队员之间的合作实现的。通过项目驱动形式,要求学生能综合运用控制电机、单片机技术、PLC技术、Protues等课程的基本知识,进行融会贯通的独立思考,充分调动学生学习的积极性和参与性。
【项目拓展】
(1)应用专用运动控制器LM629,结合单片机组成控制系统。
(2)加上一定的轻型负载,验证驱动系统的带负载能力。
案例仅为参考

直流电机调速系统设计案例报告

一、前言

在所有的机电设备当中,直流电动机具有优良的调速特性,调速平滑,方便,调速范围广,过载能力大,能承受频繁的冲击负载,可实现频繁的无级快速起动、制动和反转;能满足生产过程中自动化系统各种不同的特殊运行要求。传统的晶闸管直流调速系统,其控制叫路是基于模拟器件没计的,这使得控制电路的硬件设备极其复杂,安装调试困难,相对故障牢高。电动机调速系统采用微机实现自动控制,是电气传动发展的主要方向之一。本文设计了一种基于单片机的直流电机脉宽调速控制系统,其控制方案依靠软件实现。采样、触发、控制均采用数字处理,避免了模拟控制电路对元件参数的影响,且参数调整简单方便,简化了系统,提高了电机工作稳定性,延长了系统使用寿命。采用微机控制后,整个调速系统体积小、结构简单、可靠性高、操作维护方便,电动机稳态运转时转速精度可达到较高水平,静动态各项指标均能较好地满足工业生产中高性能电气传动的要求。直流凋速技术已广泛戍用于现代工业、航天等各个领域。
二、总体方案设计
对于同一个研究的系统,根据不同的要求和精确度,所用到的方案也不一样,作出的具体要求如下:
1.实现对电机的启动、停止、加速、减速、正转、反转的控制;
   2.通过编码器实现对电机速度的检测;
   3.实现对电机实时速度的显示;
   4.设计电机驱动的硬件电路;
   5.编制驱动电机的单片机控制程序;
   6.要求电机稳态工作性能好,电机速度可调范围宽至少达到0-1200r/min  。      

通过软件产生PWM信号,并由P3.2输出,经过驱动电路处理后供给直流电机,从而使直流电机在脉冲高电平时电得电,在低电平的时候失电。程序上通过使用延时模块使得单片机在不同的时间段输出不同的电平。启动单片机,整个系统进入准备状态。按下电路板上的启动按键后,根据驱动路中由四个三极管构成的桥式电路的特点,当P2.4和P2.5为高电平,P2.6和P2.7为低电平时电机正;反之当P2.4和P2.5为低电平,P2.6和P2.7为高电平时电机反转。根据加速和减速键,调整P3.2输出脉冲的高低电平时的初始值,从而可以控制P3.2输出高低电平时的占空比,进而控制直流电机的转速。
                          图 1 系统控制简图
三、 硬件电路设计 结合以往的设计经验,根据单片机系统的特点,针对硬件电路的设计作出以下两点要求:(1)考虑到可以尽可能地简化电路,应该尽可能使用集成度高功能性强的芯片;(2)考虑到电路修改优化的情况要留有将来修改扩展的余地。(一)单片机最小系统的设计
单片机的最小系统:所谓的单片机最小系统指的是由单片机和一些基本的外围电路所组成的一个可以工作的单片机系统。需要在单片机18,19引脚之间连接晶振,并且在晶振两边分别并联一个22UF的电容;另外还包括在单片机的复位引脚通过开关再接到地构成复位电路。通常来说,它包括单片机,复位电路和时钟电路。
1.微处理器选择及硬件介绍
图2 STC89C52单片机引脚图
    如图2所示89C52单片机一共有40个引脚,其中20引脚和40引脚分别接地和接电源VCC,以提供合适的电压给单片机工作。P0 ,P1,P2,P3这四组端口每一组都具有0到7号8个I\O口,一共是32个,这32个端口可以作为单片机的输入端也可以作为它的输出端,每一组端口的具体功能作用都有相同的部分也有不同之处,详细的用法如下:
     P0口(P0.0——P0.7):它们属于单片机上的39到32引脚,是双向8位的三态输入输出口,每一个端口都可以独立使用,在这次的设计中,P0口就是用作了驱动LED数码管(分别接在了数码管的8个阳极)。
   P1口(P1.1——P1.7):它们属于单片机上的1脚到8脚,这8个端口也是可以独立使用,但是这跟P0口有点不同,就是每一个端口内部已经接上了上拉电阻,使得端口的输出没有高阻态,输入也没有锁存功能,所以说这并不是我们常说的输入输出口,而是作为“准双向端口”。正是这些区别使得P1口的作用跟P0口有很大的区别。在本次的设计中P1.0到P1.3是用作驱动四个指示灯,而P1.4到P1.7是连接到了4个按键,用以把按键的信号输入给单片机。
     P2口(P2.0——P2.7):它们属于单片机上的21到28引脚,P2口跟P1口很相似,都是内接上拉电阻,作为“准双向端口”,可以独立使用。在本次的设计中,P2.0到P2.3分别接到了四位数码管的四个位选端口,而P2.4到P2.7则作为输出接到桥式电路的四个控制端,通过单片机实现控制电机的正反转。
    另外89C52单片机的外部引脚中还有几个是比较普遍要用到的,例如:
    第9引脚的复位引脚RST,该引脚是用于单片机的复位初始化,当该引脚输入连续两个机器周期以上的高电平时,单片机就会自动的复位,所谓的复位就是,单片机从头开始执行程序
    第18,19引脚:这两个引脚为单片机的时钟输入引脚,两脚之间可接石英晶体或者振荡电容(在本次设计中这两个引脚接上的是频率为12M的晶振,而在晶振的两边需要分别并联一个22PF的电容,以帮助起振)
     第20引脚:为程序存储器允许输出控制端,当内部ROM读取时, 程序存储器允许输出控制端不动作:外部ROM读取时,在每个机器周期会动作两次;当外部RAM读取时,两个脉冲会被跳过不会输出;外接ROM时,与ROM的OE脚相接。   
2 .复位电路及时钟电路
维持单片机最小系统运行的基本模块包括复位电路和时钟电路。复位电路通常分为两种:上电复位和手动复位,如图3,图4所示。

        

      图3 上电复位                        图4 手动复位
比较上电复位与手动复位两种方式的优缺点时,考虑到系统在运行的过程中有时会出现程序跑飞的情况,所以在程序的开发过程中,一般都需要手动复位。在这次设计同样也是选用手动复位。
给单片机提供较高频率的时钟信号可以使单片机的处理速度更快,处理事情的效率也相应的提高,但是伴之带来的是更大的功耗和更恶烈的工作环境,太高的时钟频率有可能会影响到系统的工作稳定性。考虑到在本系统中单片机只是用作控制,而不是用于高速信号的采样处理,所以只需要采用合适频率的晶振即可。合适频率的晶振对于选频信号强度准确度都有好处,本次设计选取接入XTAL1和XTAL2引脚的是12.000M无源晶振。并且在晶振两边分别并联2个22pF陶瓷电容帮助起振。
最小系统如图5所示:            
   
图5 最小系统
(二) 直流电机驱动电路设计       
        因为单片机P3口输出的电压最高才有5V,难以直接驱动直流电机。所以我们需要先把PWM信号通过一个三极管放大后才能驱动直流电机。驱动电路如图3.5所示,其中Q1和Q3都是NPN型三极管,而Q2和Q4都是PNP型三极管,Q1,Q2,Q3,Q4四个三极管共同构成了一个桥式电路,而Q0构成放大电路,把PWM信号放大到可以驱动直流电机。当P2.4和P2.5为高电平,P2.6和P2.7为低电平时,PWM信号经过三极管Q0的放大之后,从Q1端流向Q4端,实现了电机正;反之当P2.4和P2.5为低电平,P2.6和P2.7为高电平时PWM信号放大后从Q3端流向Q2,实现了电机反转。


                           图6 驱动电路
(三) 7805稳压电源电路图
为了使整个系统能够顺利稳定的工作,所以必需要使各个元器件都能稳定正常地工作,为此提供一个稳定的直流电源是基本的保证,利用芯片LM7805很容易就可以构成稳压电源电路,可以实现这个功能。
    芯片 LM7805是具有三个端脚的正电源稳压电路,一个管脚接地,另外两个分别是输入电压端和输出电压端。利用它可以输出一系列固定值的电压,而7805的封装是TO-220.由于芯片7805的内部电流有所限制,并且还具有过热保护和 安全工作区保护,所以一般情况下是不会损坏的,在提供足够的散热片的情况下,芯片甚至能提供大于1.5A的输出电流。在这次设计中主要是利用7805芯片的稳压电路把电源12V的电压转化成5V的稳定电压输出。如图7即为利用芯片7805所设计的稳压电源电路(输入电压VCC为12V,而输出的稳定电压为5V)
            
图7 稳压电源电路图
(四)显示模块设计
在本设计课题中采用的是4位7段共阴极LED数码管,它的引脚图如图8所示。
七段数码管是用七段发光二极管来显示数学0到9,加外还有一根发光二极管是用来显示小数点,其中数码管可以分为共阴极和共阳极两种,共阴极指的是把数码管里面的发光二极管的阴极全部接在一起(接到地),当发光二极管的另一端接到高电平的时候,数码管中相对应的二极管就会发光,正是应用这个原理,可以先把数码管的8个输入端进行编译,只要控制这8个输入端就可以把所要显示的内容,实时显示出来。在这次设计中所要用到的是四位数码管,所以除了这8个控制显示数字的输入外,还有4位输入用来选择显示哪一位数码管工作,通过位选和段选就可以完美的实现直流电机的实时速度显示。用于线选的8位输入直接接到单片机的输出端的情况下,由于单片机输出高电平时,用于驱动数码管时需要接上拉电阻,因为需要限流,防止电流过大,但是如果上拉电阻过大的话会造成数码管的显示比较暗,经过综合考虑上拉电阻为1K即可。
其连接图如图8所示。            
                     
                        图8  7段共阴极LED连接图
(五)键盘电路设计
启停、正反转、加速、减速四个开关分别与单片机的P1.4,P1.5,P1.6,P1.7,相连接,然后再与地相连。启停是用于实现直流电机的启动与停止转动,正反转实现的是直流电机的正转和反转,加速实现直流电机的加速功能,减速实现直流电机的减速功能,为了电路的精简性,在设计硬件电路键盘的时候把正反转,启到停止这两组功能分别集成在两个不同的按键上(S1为启停功能,S2为正反转功能)其电路如图9所示。

        

                          图9  按键电路
(六) 硬件电路总图
图10为硬件电路的原理图

                              图10 硬件电路的原理图







如图11为硬件电路的PCB电路图

                           图11   硬件电路的PCB电路图
                         四、 软件编程
设计采用了模块化的编程方法,把整个作品系统分为驱动模块,显示模块,测速模块,调速模块,按钮扫描等几个部分,在设计程序的时候先把每一个模块的流程图画出来,再根据流程图编写程序,把每个模块的功能独立的实现好,再把各个模块的程序连起来,实现整个系统的功能。

在主程序的设计中要合理地调用各模块程序。模块化设计的优点是:无论是硬件还是软件,每一个模块都相对独立,故能独立地进行设计、研制、调试和修改,从而使复杂的工作得以简化。模块之间的相互独立也有助于研制任务的分解和设计人员之间的分工合作,这样可提高工作效率和仪表的研制速度。其总体流程图如图12所示 。
图12 软件设计流程图
(一)PWM波软件设计
通过程序执行的延时来实现PWM的产生,当变量CNT不为0时,PWM为高电平,当CNT自减为0后,开始输出低电平(TEMP开始自减),当TEMP自减到0时,重新输出高电平,就是通过对变量PWMCNT的控制实现了脉冲宽度的调整:
定义 OutPutPWM(u8 cnt)子程序
void OutPutPWM(u8 cnt)
   {
        u8 temp;
         temp=RESOLUTION-cnt;
         while(cnt--)PWM=0;//高电平部分
       while(temp--)PWM=1;//低电平部分
}
输出PWM脉冲的程序为:
if(power)OutPutPWM(pwmcnt);
        else PWM=1;
(二) 电机启停,正反转,加速,减速的软件设计
     直流电机的正反转可以通过纯软件就可以实现了,但是考虑到个人的能力问题,如果是用纯硬件来实现的话,对程序的能力就要更高一点,对我本人而言这是一个难题,所以在设计硬件电路的时候,针对这个问题,设计了一个桥式电路,有了该电路,程序上只要简单的控制桥式电路的四个控制端就可了。
    变量key=Key_Scan(),通过子程序Key_Scan()对启停,正反转,加速,减速,四个按键进行扫描,然后将扫描后的值赋给KEY,再根据Switch(key)程序实现电机启停,正反转,加速,减速的控制。
        Switch(key)
        {
            case 0:break;
            case 1://启停控制
                power=!power;
                if(power)LED1=0;
                else
                {
                    LED1=1;
                    MotorCtrl(0);
                }
                break;
            case 2://正反转控制
                direct=!direct;
                if(direct)
                {
                    LED2=0;LED3=1;
                    MotorCtrl(1);
                }
                else
                {
                    LED2=1;LED3=0;
                    MotorCtrl(2);
                }           
                break;
            case 3://加速控制
                if(pwmcnt<RESOLUTION)pwmcnt++;
                value=pwmcnt;
                break;           
                case 4://减速控制
                if(pwmcnt>0)pwmcnt--;
                value=pwmcnt;
                break;            
                default:break;
        }

图13 直流电机启停  正反转  加速  减速程序设计流程图      

(三) 电机速度的计算方法
在检测直流电机的速度上,有两种方法可以实现,一种是利用霍尔元件,另一种是利用编码器。选用霍尔元件测速的原理是根据霍尔元件属于带有磁性的元件,当电机转动的时候,霍尔元件会产生相应的输出信号,把这个信号整理之后形成矩形脉冲信号,再把这个信号输给单片机,经单片机计数器计数处理,便可得到电机的转速。对比两种方法,个人觉得选用编码器更加适合我,因为我对编码器测速比较熟悉。本次设计选用的是334线编码器,直流电机每转一圈,编码器便产生334个脉冲,经过处理可以整形为矩形脉冲。通过对编码器采集到的信号进行处理后,将处理后的脉冲信号从编码器输出到单片机,通过用计数器对输出脉冲进行计数,单片机计算每半秒时间内接收到的脉冲个数N,根据N乘以120再除以码盘数就可以求出此时直流电机的转速是多少了。
if(a==50)                                                                      //50次中断等于0.5S
    {
                            zhuansu=(TH1*256+TL1)/334*120;              //每分钟转速等于T1一秒计数脉冲值乘60秒除以码盘数
                            TL1=0;                                                                                                     //定时器重新赋初值,从0开始计数
                            TH1=0;               a=0;                                                                      //a0,为下一秒开始计数赋值    }(四) 电机速度的显示
1.共阴极七段数码管的编码
共阴极数码管的8个段选位需要编码后才方便显示,经过分析便可以得到如下段码数据组:
uchar duan_code[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段码数据组0---9
2.定义电机的显示子程序void display(uint zhuansu)
void display(uint zhuansu)
{
              P0=duan_code[zhuansu/1000];                                          //显示千位数值
              P1=wei_code[0];                                                                                    //点亮第一位数码管
              delay_ms(3);                                                                                                  //延时,给数码管一定的显示时间
              P0=duan_code[zhuansu%1000/100];                            //显示百位数值
              P1=wei_code[1];                                                                                    //点亮第二位数码管
              delay_ms(3);                                                                                                  //延时,给数码管一定的显示时间
              P0=duan_code[zhuansu%1000%100/10];              //显示十位数值
              P1=wei_code[2];                                                                                    //点亮第三位数码管
              delay_ms(3);                                                                                                  //延时,给数码管一定的显示时间
              P0=duan_code[zhuansu%10];                                                        //显示个位数值
              P1=wei_code[3];                                                                                    //点亮第四位数码管
              delay_ms(3);                                                                                                  //延时,给数码管一定的显示时间            
}

图14所示是数码管显示模块的程序设计流程图。

图14    数码管显示流程图


  • 系统调试与分析
系统的调试属于整个设计的最后一个环节,但是却十分的重要,在这个环节可以把整个系统中的不足之处通过修正改进达到正常,因为软件跟硬件都有可能会出现问题,所以必需把软件调试跟硬件调试分开来完成,这样更加有利于发现问题的所在和有针对性的解决问题。硬件的调试主要是检测电路板有没有短路现象或者接线接错了。严重一点的话会出现功能上的错误,这些问题都会影响到整个系统的功能,所以硬件调试必需首先进行,在确保硬件电路没问题的情况下再写程序和修改程序。至于软件调试的话,需要分模块来进行,这次设计一共有驱动模块,显示模块,测速模块,还有就是各指示灯的指示功能,在编写程序或者修改程序的时候必需要根据模块来修改,这样才会有针对性和效率。确保系统的稳定正常运行。
(一)硬件调试
    这次设计所用到的硬件电路是用Protel软件画好原理图和PCB电路,然后寄到其他专业做版的公司做出来的电路版,经过硬件调试,发现板还是出现了一点问题,在画图的时候由于过于粗心,在画PCB版的时候把PNP三极管和NPN三极管的封装调乱了,等到电路版做出来了,用程序测试的时候才发现,所以要在电路版上面改。还有就是在画板的时候还有一条线没有连好,所以电路板做出来后,需要另外飞线把这根线连好,这些虽然是小问题,还可以通过修改电路板,但是都是因为在画板时因为粗心而犯下的错误,是完全可以避免的。通过分模块的用程序来检测硬件,经过几次的修改,基本是没有什么问题了,但是发现数码管的显示感觉有点暗,原来是因为数码管所用的排阻是15K的,电阻过大,致使驱动数码管的电流偏小。为了最求完美,所以换了10K的排阻。几经修改,终于把硬件电路调好。如图15为调试好了的硬件电路:

                            图15  调试好的硬件电路图

(二)软件调试
软件调试指的是通过仿真软件模拟设计的硬件电路,加载上程序后的运行情况,这次设计所用的仿真软件是keil软件,这是一款功能很强大的软件,其中的仿真功能也是非常实用的,可以通过执行单步运行检测每一句程序的问题,可以把程序按功能模块来检测功能性的错误,最后可以实时检测整个程序运行时,硬件电路的执行情况。可以定位到每一句程序是否正确,这样对于检测修改程序提供了很大的方便,所以说这一步是非常实用必要的一步。
通过KEIL软件,程序单步运行,模块化调试,整体执行,在调试的过程中观察存储单元的数据变化,查找出程序的语法和逻辑错误,每一句,每一个模块地修改好,具体的调试步骤如下:
    1. 把系统分为驱动模块,测速模块,显示模块,调速模块独立地在仿真软件中调试。
2. 对于需要赋值的那几个模块,在调试的时候,要检测在赋予不同的初值时各参数的变化情况,确定好最佳的赋值
3. 把前面分开独立检测的所有模块综合起来,执行全速调试,观察模拟的结果,看看是否已经符合系统的要求和目的,如果还是没有实现所要达到的要求,就要重新分模块来调试。

附作品和程序

硬件电路实物照片:


总程序:
/*--------------------------------------------------------
              名称:基于单片机控制直流电机调速系统
    单片机:STC89C52RC
              晶振:12M
              光栅盘:334格
              输入:P3.5(定时器T1计数输入口)
              输出数码管显示:位选接P1的0,1,2,3端口;段选接P0口
              内容:数码管显示所测电机转速
--------------------------------------------------------*/
  1. //#include <reg52.h>                                                        //包含单片机寄存器的头文件
  2. #include <REGX52.H>

  3. #define uchar unsigned char              //定义uchar为无符号字符型变量
  4. #define uint  unsigned int              //定义uint为无符号整型变量
  5. #define ulong unsigned long            
  6. //uchar wei_code[]={0xfe,0xfd,0xfb,0xf7};              //位码数据组
  7. #define  wei1  P2_1=1;P2_2=1;P2_3=1;P2_0=0;
  8. #define  wei2  P2_0=1;P2_2=1;P2_3=1;P2_1=0;
  9. #define  wei3  P2_0=1;P2_1=1;P2_3=1;P2_2=0;
  10. #define  wei4  P2_0=1;P2_1=1;P2_2=1;P2_3=0;
  11. #define  RESOLUTION      200//PWM量化精度


  12. sbit  LED1=P1^0;
  13. sbit  LED2=P1^1;
  14. sbit  LED3=P1^2;
  15. sbit  LED4=P1^3;
  16. sbit  KEY1=P1^4;
  17. sbit  KEY2=P1^5;
  18. sbit  KEY3=P1^6;
  19. sbit  KEY4=P1^7;
  20. sbit  PWM=P3^2;


  21. void  Delay(uint x);
  22. void  Init(void);
  23. void  MotorCtrl(uchar cmd);
  24. uchar Key_Scan(void);

  25. uchar duan_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//段码数据组0---9
  26. uint  zhuansu,a=0;                                                                      //定义变量名称
  27. bit flag,power,direct;                                                                                                  //计时一秒标志位                           
  28. /**************************************
  29. 主函数
  30. ***************************************/
  31. void main()
  32. {               
  33.     uchar key;
  34.     uint  cnt,pwmcnt;   

  35.               Init();                  //定时计数器初始化
  36.     cnt=0;
  37.     power=0;
  38.     direct=0;
  39.     pwmcnt=0;
  40.     MotorCtrl(1);
  41.               while(1)                                                                                   
  42.               {                           
  43.         key=Key_Scan();
  44.         switch(key)
  45.         {
  46.             case 1://启停控制
  47.                 power=!power;
  48.                 if(power)LED1=0;
  49.                 else
  50.                 {
  51.                     LED1=1;
  52.                     MotorCtrl(0);
  53.                     PWM=1;
  54.                 }
  55.                 break;
  56.             case 2://正反转控制
  57.                 direct=!direct;
  58.                 if(direct)MotorCtrl(1);
  59.                 else MotorCtrl(2);           
  60.                 break;
  61.             case 3:
  62.                 if(pwmcnt<RESOLUTION)pwmcnt++;
  63.                 break;//加速控制
  64.             case 4:
  65.                 if(pwmcnt>0)pwmcnt--;
  66.                 break;//减速控制
  67.             default:break;
  68.         }
  69.         if(power)
  70.         {
  71.             cnt++;
  72.             if(cnt<pwmcnt)PWM=0;
  73.             else PWM=1;
  74.             if(cnt>=RESOLUTION)cnt=0;
  75.         }     
  76.               }
  77. }
  78. /**************************************
  79. T0定时中断服务程序
  80. ***************************************/
  81. void timer0() interrupt 1 using 1//10MS中断一次
  82. {
  83.     static uchar wei=0;
  84.     uchar temp;

  85.               a++;                                                                                                  //每中断一次a加1
  86.               if(a==50)                                                                      //50次中断等于0.5S
  87.     {
  88.                             zhuansu=(TH1*256+TL1)/334*120;              //每分钟转速等于T1一秒计数脉冲值乘60秒除以码盘数
  89.                             TL1=0;                                                                                                     //定时器重新赋初值,从0开始计数
  90.                             TH1=0;      
  91.         a=0;                                                                      //a置0,为下一秒开始计数赋值
  92.     }
  93.               if(wei==0)
  94.               {
  95.         temp=zhuansu/1000;
  96.                             wei4;      
  97.         P0=duan_code[temp];
  98.         wei=1;
  99.               }
  100.               else if(wei==1)
  101.               {            
  102.         temp=zhuansu/100%10;
  103.                             wei3;                     
  104.                             P0=duan_code[temp];
  105.         wei=2;
  106.               }
  107.               else if(wei==2)
  108.               {
  109.         temp=zhuansu/10%10;
  110.                             wei2;                           
  111.                             P0=duan_code[temp];
  112.         wei=3;
  113.               }
  114.               else if(wei==3)
  115.               {
  116.         temp=zhuansu%10;
  117.                             wei1;                           
  118.                             P0=duan_code[temp];
  119.         wei=0;
  120.               }   
  121.               TH0=(65536-10000)/256;
  122.               TL0=(65536-10000)%256;              //重装初值
  123. }
  124. /**************************************
  125. 延时,大约1ms
  126. ***************************************/
  127. void Delay(uint x)                                                                                                                                          
  128. {
  129.     uchar i;
  130.     while(x--)            
  131.     for(i=0;i<120;i++);            
  132. }
  133. /**************************************
  134. 定时器计数器初始化
  135. ***************************************/
  136. void Init(void)
  137. {
  138.     MotorCtrl(0);
  139.               TMOD=0x51;              //定时器T1工作于计数模式1,定时器T0工作于计时模式1
  140.               TH0=(65536-10000)/256;              //定时器T0的高8位设置初值,每10ms产生一次中断
  141.               TL0=(65536-10000)%256;              //定时器T0的低8位设置初值,每10ms产生一次中断            
  142.               TH1=0;              //定时器T1高8位赋初值0
  143.               TL1=0;              //定时器T1低8位赋初值0
  144.               EA=1;                            //开总中断
  145.               ET0=1;              //定时器T0中断允许
  146.               TR1=1;              //定时器T1启动
  147.               TR0=1;              //定时器T0启动            
  148. }
  149. /**************************************
  150. 电机正反转及停止控制
  151. ***************************************/
  152. void MotorCtrl(uchar cmd)
  153. {
  154.     uchar temp;
  155.     temp=P2&0x0f;
  156.     if(cmd==0)
  157.     {
  158.         temp|=0xa0;//停止
  159.         LED2=1;LED3=1;
  160.     }
  161.     else if(cmd==1)
  162.     {
  163.         temp|=0x30;//正转
  164.         LED2=0;LED3=1;
  165.     }
  166.     else if(cmd==2)
  167.     {
  168.         temp|=0xc0;//反转
  169.         LED2=1;LED3=0;      
  170.     }
  171.     P2=temp;
  172. }
  173. /**************************************
  174. 按键扫描
  175. ***************************************/
  176. uchar Key_Scan(void)
  177. {
  178.               static uchar key_up=1;//按键按松开标志
  179.               if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
  180.               {
  181.                             Delay(10);//去抖动
  182.                             key_up=0;
  183.                             if(KEY1==0)return 1;
  184.                             if(KEY2==0)return 2;
  185.                             if(KEY3==0)return 3;
  186.                             if(KEY4==0)return 4;
  187.               }
  188.               else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
  189.               return 0;
  190. }
  191. 0)return 3;
  192.                             if(KEY4==0)return 4;
  193.               }
  194.               else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
  195.               return 0;
  196. }
复制代码


完整的Word格式文档51黑下载地址:
控制电机综合性试验训练---直流伺服电机(5)(1).doc (2.21 MB, 下载次数: 77)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:460567 发表于 2019-1-3 06:34 来自手机 | 只看该作者
看着很不错!
回复

使用道具 举报

板凳
ID:491947 发表于 2020-3-5 18:01 | 只看该作者
可以,很不错
回复

使用道具 举报

地板
ID:499088 发表于 2020-3-23 15:18 | 只看该作者
这还是不算真正的伺服系统吧?
回复

使用道具 举报

5#
ID:719306 发表于 2020-4-18 16:08 | 只看该作者
谁写好了这个伺服电机驱动?
回复

使用道具 举报

6#
ID:993066 发表于 2021-12-20 15:43 | 只看该作者
weihongping 发表于 2020-3-23 15:18
这还是不算真正的伺服系统吧?

我觉的不是真正的伺服系统,伺服系统是闭环的,可以实现自动化控制的。你这个还真不是伺服
回复

使用道具 举报

7#
ID:1102388 发表于 2024-4-24 19:10 | 只看该作者
仿真设计的电路图可以分享一下吗
回复

使用道具 举报

8#
ID:344848 发表于 2024-4-26 09:42 | 只看该作者
电路设计缺少PID控制部分,此程序常用于教程。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表