基于51单片机的电动机控制系统的设计


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

基于单片机的步进电机控制系统。步进电机是一种常用的机电元件,其转动控制是通过向相绕组输送电脉冲信号来控制电机向一定的方向转动,每个脉冲信号都能使电机转动指定的角度。步进电机的位置误差不会积累,运行可靠、结构简单、可以快速启停等优点,而且容易实现开环精确控制,所以被普遍运用于各个经济领域。
本篇毕业设计报告简单介绍了一种利用51单片机、驱动芯片ULN二零零三、LED数码管按键等元器件组成的一个单片机步进电机控制系统设计方案,并进行了深入探讨了硬件软件作用原理。步进电机是一种非常常见的电机种类,本文简单介绍了电机的发展经历和中国的各方面应用大概情况,同时也讨论最常见的应用驱动技术。通过对步进电机的工作原理探讨分析,提出了基于单片机的硬件设计总方案,并对电路各板块进行详细设计研究讨论。最终,本文重点阐述控制系统的软件设计部分,包括程序编写和如何优化等各方面,围绕步进电机控制系统的设计方案详细展开,旨在提供一种可行的实现方案和实践指南。

功能介绍

单键驱显电源控制系统(步进电机)由单片机、键盘控制模块、电机驱动模块、数码显示模块以及电源模块五个部分组成。键盘控制模块、电机驱动模块和数码显示模块是本次设计的重点。按键作为一个外部中断源,设置了步进电机的正反转、加减速、启停等功能,按键按下后,单片机检测到信号调用相应的按键程序控制驱动芯片ULN2003,进而控制步进电机,同时显示器显示正反转、速度等级等状态。设计系统框图如下图2-5.

在这里插入图片描述

图 2-3 系统设计框图

程序代码部分参考

//数码管位 高位-----低位
//四个按键控制步进电机:正转,反转,加1,减1
//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式
//电机转速一共10档,通过按键调节转速 
//电机正转时最高位数码管显示0,反转时显示1  
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define led P0//数码管段选
#define haha P2
sbit s1 = P1^0;
sbit s2 = P1^1;
sbit s3 = P3^0;
sbit s4 = P3^1;
sbit s5 = P3^2;//按键定义,s1正转,s2反转,s3加1,s4减1
sbit wei3 = P2^3;sbit wei2 = P2^2;sbit wei1 = P2^1;sbit wei0 = P2^0;//数码管位选定义
sbit a = P2^7;sbit b = P2^6;sbit c = P2^5;sbit d = P2^4;//脉冲信号输入端定义

uchar code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管驱动信号0---9,不显示
uchar code time_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xbc},  //9.7 ----1ms
                                {0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};
uchar num1 = 0;//控制取励磁信号变量                        
uchar num2 = 8;

char k=0;//加减档位控制,1为最小档
char pause=1;//暂停时保存之前的转速,开机默认1
bit flag1 = 0;//初始正转,正反转标志
uchar buf[4]={0,10,0,0};//数码管显示缓存,正转,不显示,不显示,显示1档位,高----低  
//================================定时器0/1初始化函数================================
void T0_T1_init()
{
    TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式
    TH1 = time_counter[k-1][0];
    TL1 = time_counter[k-1][1];//定时器1,定时10ms用于步进电机转速控制
    TR1 = 0;
    ET1= 1;//开定时器中断
    EA = 1;//开总中断
}
//================================ms级延时函数=======================================
void delay1m(uint x)
{
    uint i,j;
    for(i=0;i<x;i++)      //连数x次,约 x ms
       for(j=0;j<120;j++);   //数120 次,约1 ms
} 
void display()     //显示函数
{
    wei3=1;wei2=1;wei1=1;wei0=0;led = tab[buf[3]];delay1m(1);led=0xff;//第四个数码管点亮
    wei3=1;wei2=1;wei1=0;wei0=1;led = tab[buf[2]];delay1m(1);led=0xff;//第三个数码管点亮
    wei3=1;wei2=0;wei1=1;wei0=1;led = tab[buf[1]];delay1m(1);led=0xff;//第二个数码管点亮
    wei3=0;wei2=1;wei1=1;wei0=1;led = tab[buf[0]];delay1m(1);led=0xff;//第一个数码管点亮
}
//================================主函数=============================================
void main()//主函数
{
    T0_T1_init();//初始化定时器
    buf[1] = 10;//不显示
    a=b=c=d=0;
    while(1)
    {
        display();
        if(s1 == 0)//正转按键按下
        {
            delay1m(3);//延迟消抖
            if(s1 == 0)//正转确实按下了
            {
                flag1 = 0;//正转
                buf[0] = 0;//最高位显示0
        //      haha = 0x00;//停止
                 
            }
            while(!s1) display();//松手检测
        }
        if(s2 == 0 )//反转按键
        {
        
            delay1m(3);
            if(s2 == 0)
            {
            
                flag1 = 1;//反转
                buf[0] = 1;//最高位显示1
        //      haha = 0x00;//停止
            }
            while(!s2) display();
        }
        if(s3 == 0)    //速度加1档
        {
            delay1m(3);
            if(s3 == 0)
            {
                k++;//自加一
                TR1=1;//开启定时器
                if(k > 10 )
                {
                    k = 1;
                }
                buf[2]= k/10;//档位的十位
                buf[3]= k%10;//档位的个位
            } 
            while(!s3) display();
        }
        if(s4 == 0)  //速度减1档
        {
            delay1m(3);
            if(s4 == 0)
            {
                k--;//自减1
                TR1=1;//开定时器
                if(k <= 0)
                {
                    k = 10;
                }
                buf[2]= k/10;
                buf[3]= k%10;
            }
            while(!s4) display();
        }
        if(s5==0)//暂停启动
        {
            delay1m(3);
            if(s5==0)
            {
                if(TR1==1)//如果定时器是打开的
                {
                    pause=k;//用于暂存档位值
                    k=0;
                    TR1=0;//关定时器
                    a=b=c=d=0;
                }
                else if(TR1==0)//如果定时器是关闭的
                {
                    k=pause;//读取档位值
                    TR1=1;//打开定时器
                }
                buf[2]= k/10;
                buf[3]= k%10;
                while(!s5) display();
            }
        }
    }
}
//==================================定时器1中断函数,用于脉冲频率控制=====================================
void time1_interrupt()interrupt 3
{   
    static num1 = 0;
    static num2 = 0;
    TH1 = time_counter[k-1][0];
    TL1 = time_counter[k-1][1];//定时器1,定时1 用于步进电机转速控制
    if(flag1 == 0)//正转
    {
        switch(num1)
        {
            case 0:a = 1;b = 0;c = 0;d = 0;break;
            case 1:a = 1;b = 1;c = 0;d = 0;break;
            case 2:a = 0;b = 1;c = 0;d = 0;break;
            case 3:a = 0;b = 1;c = 1;d = 0;break;
            case 4:a = 0;b = 0;c = 1;d = 0;break;
            case 5:a = 0;b = 0;c = 1;d = 1;break;
            case 6:a = 0;b = 0;c = 0;d = 1;break;
            case 7:a = 1;b = 0;c = 0;d = 1;break;
        }
        num1++;
        if(num1 == 8)num1 = 0; 
    }
    else          //反转
    {
        switch(num2)
        {
            case 0:a = 1;b = 0;c = 0;d = 1;break;
            case 1:a = 0;b = 0;c = 0;d = 1;break;
            case 2:a = 0;b = 0;c = 1;d = 1;break;
            case 3:a = 0;b = 0;c = 1;d = 0;break;
            case 4:a = 0;b = 1;c = 1;d = 0;break;
            case 5:a = 0;b = 1;c = 0;d = 0;break;
            case 6:a = 1;b = 1;c = 0;d = 0;break;
            case 7:a = 1;b = 0;c = 0;d = 0;break;
        }
        num2++;
        if(num2 == 8)num2 = 0;  
    }
}


设计清单

步进电机元件清单
1.7*9万用板
2.四位一体共阳.36数码管
3.STC89C51
4.步进电机

具体实现截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

参考文献

[1] 宋建成,石宗义,耿太荣.ZDB系列单片机电动机综合保护器[J].工矿自动化, 1993, 000(004):21-24.
[2] 曲弋.电动机热特性研究及单片机电动机热保护器的研制[D].沈阳工业大学,2002.
[3] 玄子玉,薛佳楣.基于AVR单片机电动机智能保护器的设计[J].煤矿机械, 2009, 30(6):2.DOI:10.3969/j.issn.1003-0794.2009.06.089.
[4] 秦佳.基于C51的单片机电动机控制器制作[J].科协论坛:下半月, 2013(1):3.DOI:CNKI:SUN:KXLT.0.2013-01-048.
[5] 付云强,宋凤娟,韩来吉.AT89C51单片机在步进电动机控制系统中的应用[J].煤矿机械, 2007, 28(8):3.DOI:10.3969/j.issn.1003-0794.2007.08.037.
[6] 王晓明.电动机的单片机控制[M].北京航空航天大学出版社,2002.
[7] 张强,吴红星,谢宗武.基于单片机的电动机控制技术[M].中国电力出版社,2008.
[8] 尹作菲.基于单片机PIC18F2431的无刷直流电动机控制系统[D].华中农业大学,2009.DOI:10.7666/d.y1994149.
[9] 闵次凡.基于单片机的无刷直流电动机控制系统设计[J].机电一体化, 2012.DOI:CNKI:SUN:JDTH.0.2012-08-018.
[10] 王瑾.基于单片机的直流电动机控制系统研究[J].中国科技信息, 2011.DOI:CNKI:SUN:XXJK.0.2011-02-052.
[11] CHEN De-yi.基于嵌入式单片机的电机控制系统设计[J].计算机仿真, 2010(001):027.
[12] 马宪民.采用MCS-96单片机控制的开关磁阻电动机调速系统[C]//全国煤矿自动化学术年会.2002.
[13] 黄延球.基于16位单片机的无刷直流电动机控制系统[J].世界电子元器件, 2008(05):25-26.DOI:CNKI:SUN:SDYQ.0.2008-05-008.
[14] 王华荣,李丽.基于数据分析的单片机的直流电动机正反转控制[J].科学与信息化, 2017(4):2.
[15] 丁婷.基于单片机的步进电机的最优化控制[J]. 2008.
[16] 崔晶,刘和平,郑连清,等.基于PIC单片机的同步电动机新型智能励磁控制系统的设计[J].电子设计应用, 2003(11):3.DOI:CNKI:SUN:YYDZ.0.2003-11-016.
[17] 陈德益.基于嵌入式单片机的电机控制系统设计[J].计算机仿真, 2010(1):4.DOI:10.3969/j.issn.1006-9348.2010.01.097.
[18] Dobra M , Sita I V , Dobra P .Efficient implementation of sliding mode control for BLDC PM motor using TMS320F28335 microcontroller[C]//Education & Research Conference.IEEE, 2014.DOI:10.1109/EDERC.2014.6924361.
[19] Jaziri I , Charaabi L , Jelassi K .A closed Loop DC Motor Control using low cost single-board microcontroller based on embedded Linux[C]//2016 International Conference on Electrical Sciences and Technologies in Maghreb (CISTEM).2016.DOI:10.1109/CISTEM.2016.8066800.
[20]Wardhana A W , Nugroho D T .Stepper Motor Control with DRV 8825 Driver Based on Square Wave Signal from AVR Microcontroller Timer[J]. 2019.DOI:10.1063/1.5097484.

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值