找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 44020|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

直流電機(jī)的PWM單片機(jī)控制實(shí)例 L298N模塊ENA與ENB的說明

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
使用直流/步進(jìn)兩用驅(qū)動(dòng)器可以驅(qū)動(dòng)兩臺(tái)直流電機(jī)。分別為M1和M2。引腳A,B可用于輸入PWM脈寬調(diào)制信號(hào)對(duì)電機(jī)進(jìn)行調(diào)速控制。(如果無須調(diào)速可將兩引腳接5V,使電機(jī)工作在最高速狀態(tài),既將短接帽短接)實(shí)現(xiàn)電機(jī)正反轉(zhuǎn)就更容易了,輸入信號(hào)端IN1接高電平輸入端IN2接低電平,電機(jī)M1正轉(zhuǎn)。(如果信號(hào)端IN1接低電平, IN2接高電平,電機(jī)M1反轉(zhuǎn)。)控制另一臺(tái)電機(jī)是同樣的方式,輸入信號(hào)端IN3接高電平,輸入端IN4接低電平,電機(jī)M2正轉(zhuǎn)。(反之則反轉(zhuǎn)),PWM信號(hào)端A控制M1調(diào)速,PWM信號(hào)端B控制M2調(diào)速�?蓞⒖枷聢D表:


輸入部分接線圖

輸出部分接線圖
下面是單片機(jī)源程序:
  1. #include <reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define CYCLE 20        //周期

  5. sbit IN1 =P1^0;//右
  6. sbit IN2 =P1^1;
  7. sbit IN3 =P1^2;//左
  8. sbit IN4 =P1^3;
  9. sbit ENB =P1^4;
  10. sbit ENA =P1^5;
  11. sbit h1 = P0^0;
  12. sbit h2 = P0^1;
  13. sbit h3 = P0^2;
  14. sbit h4 = P0^3;
  15. sbit h5 = P0^4;

  16. uchar pwm1,pwm2,flag,a;
  17. void delayms(uint xms);

  18. void go();//直走
  19. void hou();
  20. void tl();//左轉(zhuǎn)
  21. void tr();//右轉(zhuǎn)
  22. void Init_Timer0(void);//定時(shí)器初始化
  23. void hou()
  24. {
  25.         IN1 = 1;//右
  26.         IN2 = 0;
  27.         IN3 = 1;//左
  28.         IN4 = 0;
  29. }
  30. void tlz()
  31. {
  32.         IN1 = 0;//右
  33.         IN2 = 1;
  34.         IN3 = 1;//左
  35.         IN4 = 0;
  36. }
  37. void tl()
  38. {
  39.         IN1 = 0;//右
  40.         IN2 = 1;
  41.         IN3 = 0;//左
  42.         IN4 = 0;
  43. }
  44. void tr()
  45. {
  46.         IN1 = 0;//右
  47.         IN2 = 0;
  48.         IN3 = 0;//左
  49.         IN4 = 1;
  50. }
  51. void go()
  52. {
  53.         IN1 = 0;
  54.         IN2 = 1;
  55.         IN3 = 0;
  56.         IN4 = 1;
  57. }
  58. void suiji()
  59. {
  60.         if(h3==0)
  61.         {
  62.                 pwm1=10;
  63.           pwm2=2;
  64.                 tl();
  65.   }
  66.         else if(h3==0&&h2==0)
  67.         {
  68.                 pwm1=10;
  69.           pwm2=3;
  70.                 tr();
  71.   }
  72.         else if(h1==0||h2==0)
  73.         {
  74.                 pwm1=10;
  75.           pwm2=5;
  76.                 tr();
  77.   }
  78.                 else if(h3==0||h4==0)
  79.         {
  80.                 pwm1=5;
  81.           pwm2=10;
  82.                 tl();
  83.   }
  84.                 else if(h5==0||h4==0)
  85.         {
  86.                 pwm1=3;
  87.           pwm2=10;
  88.                 tl();
  89.   }
  90.         else
  91.         {
  92.                 pwm1=3;
  93.           pwm2=3;
  94.                 go();
  95.   }
  96. }
  97.         

  98. void xunji()
  99. {
  100.         while(h2==1&&h3==1&&h4==1&&h5==1&&h1==1)
  101. {
  102.          pwm1=3;
  103.          pwm2=3;
  104.    go();
  105. }
  106.         
  107.                 //////////////*****************////////////////////////
  108.         
  109.                 if(h2==0||h3==0)
  110.                         {
  111.                                 pwm1=1;
  112.                                 pwm2=10;
  113.                                 tlz();
  114.                         }
  115.                         else if(h4==1&&h5==1&&h2==0&&h3==0&&h1==0)
  116.                         {
  117.                                 pwm1=10;
  118.                                 pwm2=1;
  119.                                 tr();
  120.                         }
  121.                         else if(h4==0&&h5==1)
  122.                         {
  123.                                 pwm1=3;
  124.               pwm2=3;
  125.                                 go();
  126.                         }
  127.                         else if(h5==0)
  128.                         {
  129.                                 pwm1=3;
  130.                                 pwm2=3;
  131.                                 tl();
  132.                         }
  133.                         else
  134.                         {
  135.                                 pwm1=3;
  136.               pwm2=3;
  137.                                 go();
  138.                         }

  139.                 //////////////////*************/////////////////////
  140.         
  141. }
  142. /*******初始化函數(shù)********/
  143. void init()
  144. {
  145.         TMOD=0x20;
  146.         TH1=0xfd;
  147.         TL1=0xfd;
  148.         TR1=1;
  149.         REN=1;
  150.         SM0=0;
  151.         SM1=1;
  152.         EA=1;
  153.         ES=1;
  154. }
  155. void main()
  156. {
  157.         //uchar i;
  158.         Init_Timer0();
  159.   init();
  160.         
  161.   a = SBUF;
  162.                         switch(a)
  163.            {

  164.                         case 02:
  165.                                 {
  166.                                         pwm1=5;
  167.                                         pwm2=5;
  168.                                         hou();//后
  169.                                 } break;
  170.                         case 03:
  171.                                 {
  172.                                         pwm1=8;
  173.                                         pwm2=8;
  174.                                         tr();//右
  175.                                 } break;
  176.                         case 04:
  177.                                 {
  178.                                         pwm1=8;
  179.                                         pwm2=8;
  180.                                         tl(); //左
  181.                                 } break;
  182. //                        case 05:
  183. //                        {
  184. //                                xunji();
  185. //      }break;
  186.                         case 06:
  187.                         {
  188.                                 suiji();
  189.       }break;
  190.                         case 07:
  191.                         {
  192.                                 pwm1=5;
  193.               pwm2=5;
  194.                                 go();
  195.       }break;
  196.                         case 0x08:
  197.                         {
  198.                                 IN1 = 0;//
  199.               IN2 = 0;
  200.               IN3 = 0;//
  201.               IN4 = 0;
  202.       }
  203.                         default:break;
  204.            }
  205. }

  206. ////毫秒延時(shí)
  207. //void delayms(uint xms)
  208. //{
  209. //uint i, j;
  210. //for(i=xms;i>0;i--)         //xms 毫秒
  211. //        for(j=110;j>0;j--);
  212. //}

  213. /*------------------------------------------------
  214.                     定時(shí)器初始化子程序
  215. ------------------------------------------------*/
  216. void Init_Timer0(void)
  217. {
  218. TMOD |= 0x01;          //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響                     
  219. //TH0=0x00;              //給定初值
  220. //TL0=0x00;
  221. EA=1;            //總中斷打開
  222. ET0=1;           //定時(shí)器中斷打開
  223. TR0=1;           //定時(shí)器開關(guān)打開
  224. }
  225. /*------------------------------------------------
  226.                  定時(shí)器中斷子程序
  227. ------------------------------------------------*/
  228. void Timer0_isr(void) interrupt 1
  229. {
  230. static unsigned char count;
  231. TH0=(65536-2000)/256;                  //重新賦值 2ms
  232. TL0=(65536-2000)%256;

  233.         if (count==pwm1)
  234.                         {
  235.                          ENA = 0;                           
  236.                         }
  237.         if(count==pwm2)
  238.                 {
  239.                                 ENB = 0;  
  240.                 }
  241.                 count++;
  242.         if(count == CYCLE)       //反之低電平時(shí)間結(jié)束后返回高電平
  243.                         {
  244.                         count=0;
  245.                 if(pwm1!=0)    //如果開啟時(shí)間是0 保持原來狀態(tài)
  246.                 {
  247.                         ENA = 1;              
  248.                         
  249.                 }
  250.                 if(pwm2!=0)
  251.                 {
  252.                         ENB = 1;
  253.                 }
  254.       }

  255. }
  256. void ser1() interrupt 4
  257. {
  258.         EA=0;
  259.         if(RI==1)
  260.         {
  261.                 a = SBUF;
  262.                 RI=0;
  263.         }
  264.         EA=1;
  265. }
復(fù)制代碼

  1. /********************************************************************
  2. 實(shí)現(xiàn)功能:直流電機(jī)調(diào)試程序
  3. 使用芯片:AT89S52 或者 STC89C52
  4. 晶振:11.0592MHZ
  5. 編譯環(huán)境:Keil
  6. 【聲明】此程序僅用于學(xué)習(xí)與參考,引用請(qǐng)注明版權(quán)和作者信息!     
  7. *********************************************************************/
  8. #include<reg52.h>
  9. #define uchar unsigned char//宏定義無符號(hào)字符型
  10. #define uint unsigned int  //宏定義無符號(hào)整型
  11. sbit P2_0=P2^0;//M1啟動(dòng)
  12. sbit P2_1=P2^1;//M1停止
  13. sbit P2_2=P2^2;//M2啟動(dòng)
  14. sbit P2_3=P2^3;//M2停止
  15. sbit P1_0=P1^0;//M1
  16. sbit P1_1=P1^1;//M1
  17. sbit P1_2=P1^2;//M2
  18. sbit P1_3=P1^3;//M2
  19. /********************************************************************
  20.                             延時(shí)函數(shù)
  21. *********************************************************************/
  22. void delay(uchar t)//延時(shí)程序
  23. {
  24. uchar m,n,s;
  25. for(m=t;m>0;m--)
  26. for(n=20;n>0;n--)
  27. for(s=248;s>0;s--);
  28. }
  29. /********************************************************************
  30.                             主函數(shù)
  31. *********************************************************************/
  32. main()
  33. {
  34. while(1)
  35.    {
  36.        if(P2_0==0){delay(3);if(P2_0==0)//M1啟動(dòng)
  37.          {
  38.                  P1_0=1;                                    
  39.                         P1_1=0;
  40.           }}
  41.        if(P2_1==0){delay(3);if(P2_1==0)//M1停止
  42.          {
  43.                  P1_0=1;
  44.                          P1_1=1;
  45.                   }}
  46.             if(P2_2==0){delay(3);if(P2_2==0)//M2啟動(dòng)
  47.          {
  48.                  P1_2=1;
  49.                           P1_3=0;
  50.           }}
  51.        if(P2_3==0){delay(3);if(P2_3==0)//M2停止
  52.          {
  53.                  P1_2=1;
  54.                          P1_3=1;
  55.                   }}

  56. …………余下代碼請(qǐng)下載附件…………
復(fù)制代碼
問:Ena 和Enb是分別接兩個(gè)直流電機(jī)么?直流電機(jī)的剩下那端接哪兒?

答:
不是直接接連個(gè)電機(jī)  他兩端是脈寬調(diào)制  舉個(gè)例子  如果你要實(shí)現(xiàn)兩個(gè)電機(jī)不同的轉(zhuǎn)速來達(dá)到智能小車轉(zhuǎn)彎的效果你可以這樣
四個(gè)輸入端接在單片機(jī)的四個(gè)管腳   四個(gè)輸出端接在兩個(gè)直流電機(jī)  兩個(gè)使能端也接到單片機(jī)的兩管腳(就是ENA,ENB)通過寫程序來控制
電機(jī)的轉(zhuǎn)速寫程序的方法有很多的簡單說明一下定義一個(gè)變量j  然后讓j++;當(dāng)j=20ms的時(shí)候吧j清0;送給高電平定義一個(gè)i  叫i++;讓i=10ms的時(shí)候
i=0;送低電平,這就實(shí)現(xiàn)了電機(jī)轉(zhuǎn)20ms聽10ms的過程,由于掃描很快就實(shí)現(xiàn)了電機(jī)的減速,而你必須在你的單片機(jī)的使能端管腳送一個(gè)低電平
減速機(jī)要ENA=0;(讓此管教的電壓小于2.5v)他才能執(zhí)行電機(jī)調(diào)速的過程,ENB=1是另一個(gè)電機(jī)全速運(yùn)行,哪一個(gè)電機(jī)減速運(yùn)行就實(shí)現(xiàn)了差速轉(zhuǎn)彎了
    這只是我自己的理解   也不知道該怎么說希望你能看懂吧。

下載:
l298驅(qū)動(dòng)直流電機(jī)程序和教程.rar (402.08 KB, 下載次數(shù): 358)




評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
木木123 + 8 贊一個(gè)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂4 踩1

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:149167 發(fā)表于 2017-3-22 08:31 | 只看該作者
51黑有你真精彩
回復(fù)

使用道具 舉報(bào)

板凳
ID:179657 發(fā)表于 2017-3-22 09:52 | 只看該作者
厲害嘍我的歌
回復(fù)

使用道具 舉報(bào)

地板
ID:179657 發(fā)表于 2017-3-22 09:52 | 只看該作者
我也做了一個(gè)PWM的控制程序
回復(fù)

使用道具 舉報(bào)

5#
ID:179661 發(fā)表于 2017-3-22 10:00 | 只看該作者
步進(jìn)電機(jī)怎么驅(qū)動(dòng)
回復(fù)

使用道具 舉報(bào)

6#
ID:1 發(fā)表于 2017-3-22 18:09 | 只看該作者
liangminghao 發(fā)表于 2017-3-22 10:00
步進(jìn)電機(jī)怎么驅(qū)動(dòng)

L298N+光耦驅(qū)動(dòng)步進(jìn)電機(jī)測(cè)試程序和原理圖:http://www.torrancerestoration.com/bbs/dpj-79475-1.html
回復(fù)

使用道具 舉報(bào)

7#
ID:151000 發(fā)表于 2017-8-11 01:27 | 只看該作者
謝謝樓主分享   
回復(fù)

使用道具 舉報(bào)

8#
ID:140358 發(fā)表于 2017-12-1 09:54 | 只看該作者
贊,不錯(cuò),容易學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

9#
ID:305541 發(fā)表于 2018-4-20 16:14 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:318181 發(fā)表于 2018-4-27 23:34 | 只看該作者
不錯(cuò),下來看看
回復(fù)

使用道具 舉報(bào)

11#
ID:309574 發(fā)表于 2018-5-7 17:12 | 只看該作者
謝謝樓主分享‘



回復(fù)

使用道具 舉報(bào)

12#
ID:213489 發(fā)表于 2018-5-9 09:46 | 只看該作者
原理圖接線和程序不一致啊
回復(fù)

使用道具 舉報(bào)

13#
ID:185372 發(fā)表于 2018-5-24 08:18 | 只看該作者
正在使用,不過是stm32,這個(gè)來學(xué)習(xí)下,感謝
回復(fù)

使用道具 舉報(bào)

14#
ID:381204 發(fā)表于 2018-9-27 22:20 來自觸屏版 | 只看該作者
請(qǐng)問誰有完整的程序呀?我不好下載
回復(fù)

使用道具 舉報(bào)

15#
ID:381204 發(fā)表于 2018-9-28 23:09 | 只看該作者
請(qǐng)問程序中的h1,h2,h3,h4,h5是什么呀?
回復(fù)

使用道具 舉報(bào)

16#
ID:470187 發(fā)表于 2019-2-12 13:39 | 只看該作者
感謝樓主。很厲害。我的畢業(yè)設(shè)計(jì)終于可以做出來來哈哈哈哈哈哈哈哈哈哈。
回復(fù)

使用道具 舉報(bào)

17#
ID:488862 發(fā)表于 2019-3-11 21:31 | 只看該作者
學(xué)習(xí)一下。利用調(diào)速來給小車轉(zhuǎn)彎
回復(fù)

使用道具 舉報(bào)

18#
ID:556754 發(fā)表于 2019-6-6 18:52 | 只看該作者
謝謝樓主
回復(fù)

使用道具 舉報(bào)

19#
ID:421308 發(fā)表于 2019-7-23 09:34 | 只看該作者
太厲害了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表