找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机的直流电机测速系统设计

[复制链接]
跳转到指定楼层
楼主
ID:435895 发表于 2018-11-29 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电机测速系统
  • 设计目的

随着科技的飞速发展,计算机应用技术日益渗透到社会生产生活的各个领域,而单片机的应用则起到了举足轻重的作用。在工程实践中,经常会遇到各种需要测量转速的场合,例如在发动机、电动机、机床主轴等旋转设备的试验运转和控制中,常需要分时或连续测量、显示其转速及瞬时速度。为了能精确地测量转速,还要保证测量的实时性,要求能测得瞬时转速。因此设计一种较为理想的电机测速控制系统是非常有价值的。

  • 设计要求
1.用按键控制电机起停;
2.电机有两种速度,通过按键来改变速度;
3.通过数码管显示每分钟或每秒的转速。
三、设计器材
         器件名称
             数量
STC89C52单片机
            1
ST151光电传感器
            1
四位一体数码管
            1
电阻
各种阻值若干
电容
10uf  1个     30pf  2个
晶振12MHz
            1
按键
            1
单排排阻
            2
开关
1
直流电机
1
四、设计方案及分析(包含设计电路图)
1. STC89C52单片机介绍
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programmable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
(1)单片机最小系统

单片机最小系统电路如图所示,由主控器STC89C52、时钟电路和复位电路三部分组成。单片机STC89C52作为核心控制器控制着整个系统的工作,而时钟电路负责产生单片机工作所必需的时钟信号,复位电路使得单片机能够正常、有序、稳定地工作。

图 单片机最小系统

(2)晶振电路

(3)复位电路

复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。

2. ST151

光电转速传感器是根据光敏二极管工作原理制造的一种感应接收光强度变化的电子器件,当它发出的光被目标反射或阻断时,则接收器感应出相应的电信号。它包含调制光源,由光敏元件等组成的光学系统、放大器、开关或模拟量输出装置。光电式传感器由独立且相对放置的光发射器和收光器组成。当目标通过光发射器和收光器之间并阻断光线时,传感器输出信号。由于叶轮的旋转,当叶轮扇叶进入凹槽遮挡着发光二极管时,光敏三极管没接收光,输出为零;当叶轮扇叶通过光电传感器时,光敏三极管接收光在ST151电路输出为频率信号。

3. 设计思路
通过ST151光电传感器接收电机扇叶转动切割的次数获得脉冲,从而通过单片机T1口接收高低电平,计数器在定时器的定时范围内记录脉冲个数,通过计算将转速送给数码管并进行显示。
4. 程序框图


五. 程序
参见附录一。
六.系统仿真
    参见附录二。
七、设计体会与收获(小组成员每人一份)
XXX
本次课程设计我主要负责电路板的焊接,电路板的焊接需要先了解整个电路的各个硬件的组成,并清楚它们各自的所在功能区域,然后要做的就是在电路板上为各硬件做一个整体的规划,合适的规划很重要,既要考虑到整体看上去的美观,还要考虑到对以后的调试和调整方便的地方,本人具体是先在电路板上划分开具体的功能区域,比如单片机在左边占一块适当的位置,它的左端还要留有晶振电路和复位电路,依此做好其他模块的分配。关于电路的具体焊接,感觉只要按照电路仿真图按一定的次序焊接,本人焊接时速度较慢,但是基本比较顺利,没有出现很大问题。
XX
本次课程设计我主要负责程序的编写以及调试。编写程序的主要是利用中断来产生PWM,利用中断统计ST151产生的频率信号。
    才拿到题目时面临的一个问题是如何利用程序来改变点击的速度,请教同学后知道一种方法叫 PWM,通过改变一个周期的电信号的占空比来实现。当然,在写程序时还是遇到了不少问题,比方按键怎么判断、改变 PWM 怎么实现、怎么再继续产生等。
    程序的第二重点则是利用中断来统计电机转动后由ST151产生的频率信号。这个问题前前后后想了几种方法,如用计数器统计再读取计数值、通过计数定时时间的频率再凑成1秒等。但是由于方法不当,结果做出来的效果很差。最终选定,定时时间直接1秒再来统计频率,这样的结果还是可以的。
    程序的第三个重点,是中断程序的设计。这是我第一次编C,所以在中断方面有很多不懂的地方,参考资料、请教同学后有了一定的了解,再写程序就不再那么不顺了。


本次实习我们组是直流电机测速系统的设计,就是要通过转速的改变将其速度显示在led中,来体现其转速的增大或减小。而如何改变其速率呢,就是通过pwm改变其占空比来实现的。
    我主要负责仿真,即使用软件Proteus 7 Professional测试仿真调试。这次实习的重点就是如何编写程序以及仿真中的行骗各个管脚的连接问题,主要的芯片有89C52、uln2003、led显示、电机。首先分清各管脚起什么作用,比如说晶振要与89C 2的XTAL1和XTAL2连接等等。其次还要知道那个管脚是高电平哪个是低电平、跟谁连才能达到选通。通过同组同学所编程序,就可以清楚的知道这些芯片的连接,再细心的对照各个管脚的初始化、定义来连接各个芯片。在仿真的时,我学到的就是熟练掌握使用proteus 7 Professional软件,比如知道在proteus 7 Professional中如何正确的找出单片机、uln、led显示、电机等这些芯片,怎么将keil中运行链接好的程序烧录到proteus 7 Professional中,然后正确的运行。当同组的同学咁好板子后,接通电源时发现led显示不够亮,所以就进行改进,通过再接入放大器放大信号就可以使led更好的显示出来。
总的来说这次实习,受益匪浅,不仅熟悉了两个软件的使用更进一步的将所学的知识实践了出来,以前没有怎么接触过这两个软件,现在发现我索要学习的还很多。合作也是我收获很多的一点。

在本次课程设计中,我们做的是“直流电机的测速系统”。
在实验中,我们最先遇到的问题是在电机驱动中的频率变化问题,一开始只使用了一个三极管,结果造成了电机转动始终处于一个较稳定状态,经过复位也没有变化,后来在原基础上增加了一个三极管,放大了频率信号,使得返回INT0口的信号更明显,得到了预想的结果使直流电机完成了变速。
在实验的最后,我们的电机已经按照要求完成了改变转速的功能,但是数码管的亮度很暗,得用手挡着才可以看到其具体显示,这是数码管亮度不够造成的,通过分析添加了第二个排阻,让他来控制片选信号,通过这个排阻使得共阳极数码管变得较亮。
这次实验是对本学期所学的单片机课程的简单应用,在实验中运用了80c52单片机。通过它完成了电机的简单驱动,调节转速使之反馈及让转速具体的体现在数码管上的功能。

附录二 系统仿真电路图



单片机源程序如下:
  1. #include <reg52.h>
  2. unsigned char code TABLE[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  3. void display();
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define V_TH1 (65535 - 1000) / 256
  7. #define V_TL1 (65535 - 1000) % 256
  8. sbit output = P2^7; //P2^7接ULN2003
  9. sbit key1 = P3^3; //P3^3接可以改变电机转速的按键

  10. int  frq = 0, frq1, flag;
  11. char pwm;
  12. int div = 0, p = 0;
  13. uchar a;
  14. uint c;
  15. void display();

  16. /*系统初始化*/
  17. void initial(void)
  18. {
  19.               TMOD = 0x10;  //设置定时器1在工作方式1下
  20.               EA = 1; //开中断
  21.               EX0 = 1; //外部中断0使能
  22.               ET1 = 1; //定时器1使能
  23.               IT0 = 1; //外部中断0下降沿触发
  24.               IT1 = 1; //外部中断1下降沿触发
  25.               TH1 = V_TH1; //装载计数值
  26.               TL1 = V_TL1;               
  27.               TR1=1; //定时器1可工作
  28. }

  29. /*延时程序*/
  30. void delay(unsigned int k)
  31. {
  32.   unsigned int i,j;
  33.   for(i = 0;i < k;i++)
  34.   {
  35.                 for(j = 0;j < 110;j++)
  36.                 {
  37.                               ;
  38.                 }
  39.    }
  40. }

  41. /*显示子程序*/
  42. void display()
  43. {
  44.               uchar qian,bai,shi,ge;
  45.               qian = 0;
  46.               bai = 0;
  47.               shi = 0;
  48.               ge = 0;
  49.               c = frq1;
  50.               qian = c / 1000;
  51.               bai = c / 100 % 10;
  52.               shi = c / 10 % 10;
  53.               ge = c % 10;
  54.               P2 = 0X01;
  55.               P0 = TABLE[qian];
  56.               delay(5);
  57.               P2 = 0X02;
  58.               P0 = TABLE[bai];
  59.               delay(5);
  60.               P2 = 0X04;
  61.               P0 = TABLE[shi];
  62.               delay(5);
  63.               P2 = 0X08;
  64.               P0 = TABLE[ge];
  65.               delay(5);
  66. }


  67. /*主函数*/
  68. void main()
  69. {

  70.               initial();
  71.               while(1)
  72.     {
  73.                             if(key1 == 0)
  74.                   delay(100);   //按键消抖
  75.                             if(key1 == 0)
  76.                             {
  77.                                           while(key1 == 0) ;                              //松手检测
  78.                                           div ++;
  79.                             }
  80.                             if(div % 2 == 0)
  81.                             flag = 0;
  82.                             if(div % 2 == 1)
  83.                             flag = 1;
  84.                             if(flag == 0)
  85.                             pwm = 30;
  86.                             if(flag == 1)
  87.                             pwm = 70;

  88.                                 display();
  89.               }
  90. }


  91. /*外部中断0*/
  92. void int0isr() interrupt 0 //统计定时时间内的个数
  93. {
  94.               frq ++;
  95. }


  96. /*定时器1中断*/
  97. void time1isr() interrupt 3 //定时器1实现pwm
  98. {
  99.               TH1 = V_TH1; //装载计数值
  100.               TL1 = V_TL1;
  101.               EA = 0;
  102.               a ++;
  103.               p ++;
  104.               if (a <= pwm)
  105.               output = 1;
  106.               else output = 0;
  107.               if(a > 100)
  108.               a = 0;
  109.               if(p > 1000)
  110.               {
  111.                             frq1 = frq;
  112.                             frq = 0;
  113.                             p = 0;
  114.               }
  115.               EA = 1;
  116. }
复制代码

全部资料51hei下载地址:
单片机的直流电机测速系统.doc (197 KB, 下载次数: 187)


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

使用道具 举报

沙发
ID:648944 发表于 2019-11-25 11:12 | 只看该作者
大佬我想问一下这个测速系统在51单片机上要怎么连线呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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