找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的L298N直流电机调速系统Proteus仿真程序

  [复制链接]
跳转到指定楼层
楼主
本此设计选择STC89C52单片机作为主控芯片,选取带有光电编码器的直流电机作为被控对象,利用单片机的T0定时器产生PWM信号并送到直流电机。在Proteus仿真环境下搭建了L298N直流电机驱动电路、矩阵键盘扫描电路以及LCD12864显示电路。实现了直流电机的启动、加速、正转、反转、制动等功能。同时,采用PID控制算法可实现电机速度在特定的场合实现自动切换。具体见附件。


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>       
  3. #include<math.h>

  4. #include "lcd.h"
  5. #include "Key.h"
  6. #include "Motor.h"
  7. #include "LCD12864.h"
  8. #include "KeyBoard.h"
  9. #include "LCD12864.h"
  10. #include "LcdShow.h"
  11. #include "PID.h"

  12. extern uchar State_Flag;
  13. extern uchar Fwd_Flag;
  14. extern uchar Rev_Flag;

  15. unsigned int  KeyValue;

  16. unsigned int idata pwm_t;//周期
  17. unsigned int idata Impluse,Time_Count,ImpluseR;
  18. uchar idata Stop_Flag,Run_Flag,Curve_Flag;

  19. uint idata Set_Speed;  //  设定转速
  20. unsigned char idata Sz_Flag,Sr_Flag;  // 记录A相触发后  ,B相高低电平的标志
  21. float idata L_Speed,R_Speed,ReaSpeed;

  22. uint idata PWM_Out,R_Duty,L_Duty,Turn_now;
  23. sbit LSB_L = P1^0;    // LSB_L
  24. sbit LSB_R = P1^1;    // LSB_R

  25. void TimerInit(void)                //@11.0592MHz
  26. {
  27.        
  28.         TMOD=0x01;                //定时器模式

  29.         TL0 = 0x18;                //初值      1ms  
  30.         TH0 = 0xFC;                //初值
  31.        
  32.         IT0 = 1;         //设置下降沿触发 还是低电平触发 0低电平
  33.         IT1 = 1;         //设置下降沿触发 还是低电平触发 0低电平
  34.   EA  = 1;
  35.         EX0 = 1;
  36.         EX1 = 1;
  37.        
  38.         ET0 = 1;
  39.         TR0 = 1;               

  40. }

  41. void main()
  42. {
  43.                   LED = 0;       
  44.        
  45.             Stop_Flag  = 0;
  46.             Lcd_Initial();
  47.                         TimerInit();
  48.                         Set_Speed = 0;
  49.          Lcd_Clear();
  50.                 while(1)
  51.                 {
  52.                         KeyValue = Get_Keyvalue();   //  矩阵键盘扫描
  53.                         if(KeyValue == 14)   // 输入速度
  54.       {
  55.                           Set_Speed = SpeedInput();       
  56.                                 KeyValue = 16;
  57.             }
  58.                         Key_Process();
  59.                         if(Run_Flag)
  60.                         {
  61.                                 Set_Speed = 80;
  62.                                 Run_Flag = 0;
  63.                         }
  64.                
  65.                         if(State_Flag && ~Stop_Flag)       
  66.                         {
  67.                           PWM_Out = PID_Calculate(Set_Speed,abs(ReaSpeed));
  68.                                 R_Duty = PWM_Out + Turn_now;
  69.                                 L_Duty = PWM_Out - Turn_now;
  70.                         }
  71.                         else
  72.                                 PWM_Out = 0;  // 停止  
  73.                         Lcd_Show();
  74.          }          
  75. }

  76.        
  77. //定时器0中断
  78. void timer0() interrupt 1
  79. {
  80.         static int i;
  81.         TL0 = 0x18;                //初值
  82.         TH0 = 0xFC;                //初值
  83.        
  84.        
  85.         pwm_t++;
  86.   Time_Count++;;
  87.         if(pwm_t == 500)   //500ms
  88.         {
  89.                 pwm_t = 0;
  90.                 if(Stop_Flag)
  91.                 {
  92.                         i++;
  93.                         L_Duty = 0;
  94.                         R_Duty = 0;
  95.                         if(i<31)
  96.                         {
  97.                      LED = ~LED;
  98.                                  if(i == 30)  
  99.                                  {
  100.                                          Stop_Flag = 0;
  101.                                          i = 0;
  102.                                          Set_Speed = 30;
  103.                                  }
  104.                         }
  105.                 }
  106.         }               
  107.         if( pwm_t<L_Duty)
  108.                   MotorL_Control();       
  109.                 else
  110.                         MotorL_Stop();
  111.        
  112.         if( pwm_t<R_Duty)
  113.                   MotorR_Control();       
  114.    else
  115.                    MotorR_Stop();
  116.         /*---------M法 测速------------*/
  117.         if(Time_Count == 100 )    //  100ms
  118.          {
  119.                  
  120.                 Control();
  121.                 Time_Count = 0;
  122.                 Impluse = 0;
  123.                 ImpluseR = 0;
  124.          }
  125. }


  126. void int0() interrupt 0
  127. {
  128.         Impluse++;
  129.          if(LSB_L == 1)
  130.                          Sz_Flag = 1;    //  正反转标志位 A相下降沿,B相高电平
  131.          
  132.          else Sz_Flag = 0;
  133.           LSB_L = 1;
  134. }


  135. void int1() interrupt 2   // 外部中断1   用于测 右轮的速度
  136. {
  137.         ImpluseR++;
  138.          if(LSB_R == 1)
  139.                          Sr_Flag = 1;       //  正反转标志位 A相下降沿,B相高电平
  140.          
  141.          else Sr_Flag = 0;
  142.           LSB_R = 1;
  143. }
复制代码

Proteus仿真.rar

453.92 KB, 下载次数: 270, 下载积分: 黑币 -5

Proteus仿真原理图

程序.rar

107.16 KB, 下载次数: 251, 下载积分: 黑币 -5

源程序带有LCD2864底层库

设计51hei.pdf

1.15 MB, 下载次数: 196, 下载积分: 黑币 -5

详细的设计报告

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:904606 发表于 2021-4-28 21:19 | 只看该作者
发现了这个帖子,十分感谢您的分享!程序拿走学习了!
回复

使用道具 举报

板凳
ID:903667 发表于 2021-4-29 10:36 | 只看该作者
谢谢提供参考,不知道是否能仿真 FOC 模式?
回复

使用道具 举报

地板
ID:929166 发表于 2021-5-29 17:43 | 只看该作者
keyway 发表于 2021-4-29 10:36
谢谢提供参考,不知道是否能仿真 FOC 模式?

这个proteous附件是个图片
有proteous文件吗

回复

使用道具 举报

5#
ID:920848 发表于 2021-6-2 01:17 | 只看该作者
仿真要如何实现?
回复

使用道具 举报

6#
ID:328014 发表于 2021-6-2 03:46 | 只看该作者
xyqcrg 发表于 2021-6-2 01:17
仿真要如何实现?

楼主的仿真是用Proteus7.5画的,需要用这个版本才能打开,效果如图:

51hei.png (21.69 KB, 下载次数: 61)

51hei.png
回复

使用道具 举报

7#
ID:328253 发表于 2021-12-19 19:38 | 只看该作者
林小小小惜 发表于 2021-5-29 17:43
这个proteous附件是个图片
有proteous文件吗

要用protecous打开哦
回复

使用道具 举报

8#
ID:328253 发表于 2021-12-19 19:38 | 只看该作者
51hei团团 发表于 2021-6-2 03:46
楼主的仿真是用Proteus7.5画的,需要用这个版本才能打开,效果如图:

感谢回答
回复

使用道具 举报

9#
ID:415044 发表于 2022-1-6 15:43 | 只看该作者
这个怎么启动,没按键开始啊
回复

使用道具 举报

10#
ID:878353 发表于 2022-1-9 19:39 | 只看该作者
很不错!看起来很高大上!
回复

使用道具 举报

11#
ID:373253 发表于 2022-4-3 16:57 | 只看该作者
觉得真不错,下载阅读看看
回复

使用道具 举报

12#
ID:1086796 发表于 2023-7-1 22:33 | 只看该作者
下载了你的三个文件,质量很高。但是,仿真时发现电机不能正转,同时,提示:Parameter <INVERT> not defined in INVERT of U1. [LCD2]和Non-existant pin [<INVERT>] specified by [INVERT]. [LCD2_U1]
不知道怎么解决?
回复

使用道具 举报

13#
ID:1118367 发表于 2024-4-27 18:29 | 只看该作者
拿走去做研究啦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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