找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6889|回复: 4
收起左侧

基于51单片机的直流电机驱动(L298)

[复制链接]
ID:114642 发表于 2016-4-18 00:21 | 显示全部楼层 |阅读模式
L298SGS公司的产品,L298N15个管角的单块集成电路,高电压,高电流,四通道驱动,设计用L298N来接收DTL或者TTL逻辑电平,驱动感性负载(比如继电器,直流和步进马达)和开关电源晶体管。内部包含4通道逻辑驱动电路,其额定工作电流为 1 A,最大可达 1.5 AVss 电压最小 4.5 V,最大可达 36 VVs 电压最大值也是 36 VL298N可直接对电机进行控制,无须隔离电路,可以驱动双电机。
1,L298内部的原理图


2,L298 引脚符号及功能


3,L298的逻辑功能


当使能端为高电平时,输入端IN1为PWM信号,IN2为低电平信号时,电机正转;输入端IN1为低电平信号,IN2为PWM信号时,电机反转;;IN1与IN2相 同时,电机快速停止。当使能端为低电平时,电动机停止转动。
在对直流电动机电压的控制和驱动中,半导体功率器件(L298)在使用上可以分为两种方式:线性放大驱动方式和开关驱动方式在线性放大驱动方式。
半导体功率器件工作在线性区优点是控制原理简单,输出波动小,线性好,对邻近电路干扰小,缺点为功率器件工作在线性区,功率低和散热问题严重。开关驱动方式是使半导体功率器件工作在开关状态,通过脉调制(PWM)来控制电动机的电压,从而实现电动机转速的控制。


  1. #include<reg51.h>   
  2. #include<intrins.h>
  3. #define uchar unsigned char

  4. #define uint unsigned int


  5. sbit MOTOR_A_1=P3^6;

  6. sbit MOTOR_A_2=P3^7;   

  7. sbit k1=P1^0; //定义k1为p1.0口

  8. sbit k2=P1^1;   //定义k2为p1.1口

  9. sbit k3=P1^2;   //定义k3为p1.2口

  10. sbit k4=P1^3;   //定义k4为p1.3口

  11. uchar T=0;   //定时标记

  12. uchar W=0;   //脉宽值 0~100

  13. uchar A=0;   //方向标记 0,1

  14. uchar k=0;   //按键标记

  15. uchar i=0;     //计数变量


  16. uchar code table1[]={

  17. 0x3f,0x06,0x5b,0x4f,

  18. 0x66,0x6d,0x7d,0x07,

  19. 0x7f,0x6f,0x77,0x7c,

  20. 0x39,0x5e,0x79,0x71};


  21. uchar code table2[]={0xfe,0xfb,0xfd,0xf7};



  22. void delayms(uint t);  



  23. void disp(void)

  24. {

  25. P2=table2[3];

  26. P0=table1[W]; //显示占空比个位

  27. delayms(1); //延时1ms

  28. P2=0xff; //P0清1


  29. P2=table2[2];

  30. P0=table1[W/100]; //显示占空比百位

  31. delayms(1); //延时1ms

  32. P2=0xff; //P0清1

  33.   

  34. P2=table2[1];

  35. P0=table1[W/10];  //显示占空比十位

  36. delayms(1); //延时1ms

  37. P2=0xff;   //P0清1


  38. P2=table2[0];

  39. P0=table1[A];   //显示方向

  40. delayms(1); //延时1ms

  41. P2=0xff; //P0清1

  42. }






  43. void init(void)

  44. {

  45. //启动中断

  46. TMOD=0x01;

  47. EA=1;

  48. ET0=1;

  49. TR0=1;

  50. //设置定时时间

  51. TH0=0xff;

  52. TL0=0xf6;

  53. }


  54. void timer0() interrupt 1

  55. {     

  56. //重置定时器时间

  57. TH0=0xff;

  58. TL0=0xf6;

  59. T++; //定时标记加1

  60. disp(); //数码管显示

  61. if(k==0)

  62. {

  63. if(T>W)

  64. MOTOR_A_1 =0;

  65. else

  66. MOTOR_A_1 =1;

  67. }

  68. else

  69. {

  70. if(T>W)

  71. MOTOR_A_2 =0;

  72. else

  73. MOTOR_A_2 =1;

  74. }



  75. if(T==100)

  76. T=0;

  77. }



  78. void delayms(uint t)

  79. {

  80. uchar j;

  81. while(t--)

  82. {

  83. for(j=0;j<250;j++) //循环250次

  84. {

  85.   _nop_();             //系统延时         

  86.       _nop_(); //系统延时

  87.       _nop_(); //系统延时

  88.       _nop_(); //系统延时

  89. }

  90. }

  91. }



  92. void key(void)           //按键判断程序

  93. {

  94. if(k1==0) //按键1按下

  95. {

  96. while(k1==0); //按键1抬起

  97. if(W==100) //如果脉宽为100

  98. W=0; //脉宽置0

  99. else

  100. W+=1; //否则加1

  101. }

  102. else if(k2==0) //按键2按下

  103. {  

  104. while(k2==0); //按键2抬起

  105. if(W==0) //如果脉宽为0

  106. W=100; //脉宽设置成100

  107. else

  108. W-=1; //否则减1

  109. }

  110. else if(k3==0) //按键3按下

  111. {   

  112. while(k3==0); //按键3抬起

  113. A=!A; //方向标记取反

  114. k=!k; //按键标记取反

  115. }

  116. else if(k4==0) //按键4按下

  117. {   

  118. while(k4==0); //按键4抬起

  119. W=0; //脉宽清0

  120. }

  121. }


  122. void main(void)

  123. {


  124. init(); /////////系统初始化

  125. while(1)  

  126. {

  127. if(k==0)

  128.    MOTOR_A_2=0;

  129. else

  130. MOTOR_A_1=0;

  131. key(); ////////查询按键

  132. }

  133. }
复制代码



评分

参与人数 1黑币 +5 收起 理由
单单单片机就好 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:123712 发表于 2016-7-7 20:08 | 显示全部楼层
谢谢楼主分享资料,学习中
回复

使用道具 举报

ID:57149 发表于 2016-7-11 16:03 | 显示全部楼层
谢谢楼主分享资料!
回复

使用道具 举报

ID:161494 发表于 2017-1-12 17:44 | 显示全部楼层
O(∩_∩)O谢谢,楼主分享。
回复

使用道具 举报

ID:238367 发表于 2017-10-10 18:25 | 显示全部楼层
PWM的EN A接单片机哪个借口?你的程序里看不出啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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