久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 24182|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

arduino+L298N直流電機(jī)調(diào)速程序(注釋很詳細(xì))

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:489436 發(fā)表于 2019-3-12 19:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. //定義變量程序段
  2. //把小車左輪電機(jī)編碼器碼盤的OUTA信號(hào)連接到Arduino控制器的數(shù)字端口2,
  3. //數(shù)字端口2是Arduino的外部中斷0的端口。
  4. #define PinA_left 2 //外部中斷0
  5. #define PinB_left 8 //小車左車輪電機(jī)編碼器碼盤的OUTB信號(hào)連接到數(shù)字端口8
  6. //把小車右車輪電機(jī)編碼器碼盤的OUTA信號(hào)連接到Arduino控制器的數(shù)字端口3,
  7. //數(shù)字端口3是Arduino的外部中斷1的端口。
  8. #define PinA_right 3 //外部中斷1
  9. #define PinB_right 9 //小車右車輪電機(jī)編碼器碼盤的OUTB信號(hào)連接到數(shù)字端口9
  10. int E_left =5; //L298P直流電機(jī)驅(qū)動(dòng)板的左輪電機(jī)使能端口連接到數(shù)字接口5
  11. int M_left =4; //L298P直流電機(jī)驅(qū)動(dòng)板的左輪電機(jī)轉(zhuǎn)向端口連接到數(shù)字接口4
  12. int E_right =6; //連接小車右輪電機(jī)的使能端口到數(shù)字接口6
  13. int M_right =7; //連接小車右輪電機(jī)的轉(zhuǎn)向端口到數(shù)字接口7
  14. int val_right; //小車右輪電機(jī)的PWM功率值
  15. int val_start;//上位機(jī)控制字節(jié),用于控制電機(jī)是否啟動(dòng);
  16. int val_FB;   //上位機(jī)控制字節(jié),用于控制電機(jī)是正轉(zhuǎn)還是反轉(zhuǎn);
  17. int val_left;//上位機(jī)控制字節(jié),用于提供給左輪電機(jī)PWM功率值。
  18. int count1 = 0;  //左輪編碼器碼盤脈沖計(jì)數(shù)值
  19. int count2= 0; //右輪編碼器碼盤脈沖計(jì)數(shù)值
  20. int rpm1 = 0;  //左輪電機(jī)每分鐘(min)轉(zhuǎn)速(r/min)
  21. int rpm2 = 0;  //右輪電機(jī)每分鐘(min)轉(zhuǎn)速(r/min)
  22. int rpm1_HIGH = 0;//左輪電機(jī)轉(zhuǎn)速分解成高、低兩個(gè)字節(jié)數(shù)據(jù),以方便上傳給PC機(jī)
  23. int rpm1_LOW = 0;
  24. int rpm2_HIGH = 0;//右輪電機(jī)轉(zhuǎn)速分解成高、低兩個(gè)字節(jié)數(shù)據(jù)
  25. int rpm2_LOW = 0;
  26. int flag;//設(shè)置小車行車狀態(tài),是前進(jìn)、后退還是停止
  27. unsigned long time = 0, old_time = 0; // 時(shí)間標(biāo)記
  28. unsigned long time1 = 0, time2 = 0; // 時(shí)間標(biāo)記


  29. //初始化程序段
  30. void setup()
  31. {
  32.   Serial.begin(9600);    // 啟動(dòng)串口通信,波特率為9600b/s
  33.   pinMode(M_left, OUTPUT);   //L298P直流電機(jī)驅(qū)動(dòng)板的控制端口設(shè)置為輸出模式
  34.   pinMode(E_left, OUTPUT);
  35.   pinMode(M_right, OUTPUT);
  36.   pinMode(E_right, OUTPUT);
  37.   pinMode(PinA_left,INPUT); //伺服電機(jī)編碼器的OUTA和OUTB信號(hào)端設(shè)置為輸入模式
  38.   pinMode(PinB_left,INPUT);
  39.   pinMode(PinA_right,INPUT);
  40.   pinMode(PinB_right,INPUT);
  41.   //定義外部中斷0和1的中斷子程序Code(),中斷觸發(fā)為下跳沿觸發(fā)
  42.   //當(dāng)編碼器碼盤的OUTA脈沖信號(hào)發(fā)生下跳沿中斷時(shí),
  43.   //將自動(dòng)調(diào)用執(zhí)行中斷子程序Code()。
  44.   attachInterrupt(0, Code1, FALLING);//小車左車輪電機(jī)的編碼器脈沖中斷函數(shù)
  45.   attachInterrupt(1, Code2, FALLING);//小車右車輪電機(jī)的編碼器脈沖中斷函數(shù)
  46. }


  47. //子程序程序段
  48. void advance()//小車前進(jìn)
  49. {
  50.      digitalWrite(M_left,HIGH);
  51.      analogWrite(E_left,val_left);
  52.      digitalWrite(M_right,LOW);
  53.      analogWrite(E_right,val_right);
  54. }
  55. void back()//小車后退
  56. {
  57.      digitalWrite(M_left,LOW);
  58.      analogWrite(E_left,val_left);
  59.      digitalWrite(M_right,HIGH);
  60.      analogWrite(E_right,val_right);
  61. }
  62. void Stop()//小車停止
  63. {
  64.      digitalWrite(E_right, LOW);
  65.      digitalWrite(E_left, LOW);
  66. }
  67.   
  68. //主程序段
  69. void loop()
  70. {
  71.   if (Serial.available()>0) //如果Arduino控制器讀緩沖區(qū)中存在上位機(jī)下達(dá)的字節(jié)
  72.   {
  73.       val_start= Serial.read(); //從讀緩沖區(qū)中讀取上位機(jī)的三個(gè)控制字節(jié)
  74.       delay(5);
  75.       val_FB = Serial.read();
  76.       delay(5);  
  77.       val_left= Serial.read();
  78.       delay(5);      
  79.      if(val_start==0x11)     //如果讀出的第一個(gè)字節(jié)為小車啟動(dòng)標(biāo)志字節(jié)0x11
  80.      {
  81.        if(val_FB ==0xAA)   //如果讀出的第二個(gè)字節(jié)為小車前進(jìn)標(biāo)志字節(jié)0xAA
  82.        {
  83.          //讀出的第三個(gè)字節(jié)為小車左車輪電機(jī)的PWM功率值,把它賦值給右車輪電機(jī)功率變量
  84.          val_right=val_left;
  85.          advance(); //小車前進(jìn)
  86.          flag='a';   //設(shè)置小車前進(jìn)標(biāo)志字符     
  87.          count1 = 0; //恢復(fù)到編碼器測速的初始狀態(tài)
  88.          count2 = 0;
  89.          old_time=  millis();   
  90.        }
  91.        else if(val_FB ==0xBB) //如果讀出的第二個(gè)字節(jié)為小車后退標(biāo)志字節(jié)0xBB   
  92.        {
  93.          val_right=val_left;
  94.          back();  //小車后退
  95.          flag='b'; //設(shè)置小車后退標(biāo)志字符      
  96.          count1 = 0; //恢復(fù)到編碼器測速的初始狀態(tài)
  97.          count2 = 0;
  98.          old_time=  millis();        
  99.        }
  100.      }
  101.       else if(val_start==0x22) //如果讀出的第一個(gè)字節(jié)為小車停止標(biāo)志字節(jié)0x22
  102.       {
  103.          Stop(); //小車停止
  104.          flag='s'; //設(shè)置小車停止標(biāo)志字符         
  105.       }
  106.   }


  107.   
  108.   time = millis();//以毫秒為單位,計(jì)算當(dāng)前時(shí)間
  109.   //計(jì)算出每一秒鐘編碼器碼盤計(jì)得的脈沖數(shù),
  110.   if(abs(time - old_time) >= 1000) // 如果計(jì)時(shí)時(shí)間已達(dá)1秒
  111.   {
  112.     detachInterrupt(0); // 關(guān)閉外部中斷0
  113.     detachInterrupt(1); // 關(guān)閉外部中斷1   
  114.      //把每一秒鐘編碼器碼盤計(jì)得的脈沖數(shù),換算為當(dāng)前轉(zhuǎn)速值
  115.      //轉(zhuǎn)速單位是每分鐘多少轉(zhuǎn),即r/min。這個(gè)編碼器碼盤為12個(gè)齒。
  116.     rpm1 =(float)count1*60/12;//小車左車輪電機(jī)轉(zhuǎn)速
  117.     rpm2 =(float)count2*60/12; //小車右車輪電機(jī)轉(zhuǎn)速
  118.     rpm1_HIGH=rpm1/256;//把轉(zhuǎn)速值分解為高字節(jié)和低字節(jié)
  119.     rpm1_LOW=rpm1%256;
  120.     rpm2_HIGH=rpm2/256;
  121.     rpm2_LOW=rpm2%256;
  122.    //根據(jù)左右車輪轉(zhuǎn)速差rpm1-rpm2,乘以比例因子0.4,獲得比例調(diào)節(jié)后的右車輪電機(jī)PWM功率值
  123.     val_right=(float)val_right+(rpm1-rpm2)*0.4;
  124.     Serial.print(rpm1_HIGH,BYTE);//向上位計(jì)算機(jī)上傳左車輪電機(jī)當(dāng)前轉(zhuǎn)速的高、低字節(jié)
  125.     Serial.print(rpm1_LOW,BYTE);
  126.     Serial.print(rpm2_HIGH,BYTE);//向上位計(jì)算機(jī)上傳右車輪電機(jī)當(dāng)前轉(zhuǎn)速的高、低字節(jié)
  127.     Serial.print(rpm2_LOW,BYTE);
  128.     Serial.print(val_right,BYTE);// 向上位計(jì)算機(jī)上傳PID調(diào)節(jié)后的右輪電機(jī)PWM功率值   
  129.     if(flag=='a') //根據(jù)剛剛調(diào)節(jié)后的小車電機(jī)PWM功率值,及時(shí)修正小車前進(jìn)或者后退狀態(tài)
  130.     advance();
  131.     if(flag=='b')
  132.     back();   
  133.    //恢復(fù)到編碼器測速的初始狀態(tài)
  134.     count1 = 0;   //把脈沖計(jì)數(shù)值清零,以便計(jì)算下一秒的脈沖計(jì)數(shù)
  135.     count2 = 0;
  136.     old_time=  millis();     // 記錄每秒測速時(shí)的時(shí)間節(jié)點(diǎn)   
  137.     attachInterrupt(0, Code1,FALLING); // 重新開放外部中斷0
  138.     attachInterrupt(1, Code2,FALLING); // 重新開放外部中斷1
  139.   }
  140. }


  141. // 左側(cè)車輪電機(jī)的編碼器碼盤計(jì)數(shù)中斷子程序
  142. void Code1()//算編碼器脈沖


  143. {  
  144.   //為了不計(jì)入噪音干擾脈沖,
  145.    //當(dāng)2次中斷之間的時(shí)間大于5ms時(shí),計(jì)一次有效計(jì)數(shù)
  146.   if((millis()-time1)>5)
  147.   //當(dāng)編碼器碼盤的OUTA脈沖信號(hào)下跳沿每中斷一次,
  148.   count1 += 1; // 編碼器碼盤計(jì)數(shù)加一  
  149.   time1==millis();
  150. }
  151. // 右側(cè)車輪電機(jī)的編碼器碼盤計(jì)數(shù)中斷子程序
  152. void Code2()
  153. {  
  154.   if((millis()-time2)>5)
  155.   //當(dāng)編碼器碼盤的OUTA脈沖信號(hào)下跳沿每中斷一次,
  156.   count2 += 1; // 編碼器碼盤計(jì)數(shù)加一
  157.   time2==millis();  
  158. }

復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-3-13 02:48 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

板凳
ID:98249 發(fā)表于 2019-3-22 13:23 | 只看該作者
有用,正要做相關(guān)的應(yīng)用,參考參考.感謝樓主
回復(fù)

使用道具 舉報(bào)

地板
ID:688391 發(fā)表于 2021-2-6 20:45 | 只看該作者
非常有用
回復(fù)

使用道具 舉報(bào)

5#
ID:932910 發(fā)表于 2021-11-12 22:06 | 只看該作者
    Serial.write(rpm1_HIGH);
    Serial.write(rpm1_LOW);
    Serial.write(rpm2_HIGH);
    Serial.write(rpm2_LOW);
    Serial.write(val_right);
1.0版本后沒有BYTE這個(gè)關(guān)鍵字     130行到134行用這段替換可通過編譯
回復(fù)

使用道具 舉報(bào)

6#
ID:985357 發(fā)表于 2021-11-27 18:43 | 只看該作者
謝謝大佬指點(diǎn)
回復(fù)

使用道具 舉報(bào)

7#
ID:1055770 發(fā)表于 2022-12-5 14:12 | 只看該作者
這不是L298P的代碼嗎?請問有無L298N的代碼
回復(fù)

使用道具 舉報(bào)

8#
ID:138707 發(fā)表于 2023-7-29 17:51 | 只看該作者
謝謝大佬指點(diǎn)
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级欧美三级在线观看 | 一级黄色片在线看 | 狠狠做深爱婷婷综合一区 | 最新中文字幕久久 | 久久久视频在线 | 狠狠夜夜 | 精品国产第一区二区三区 | av特级毛片 | 99这里只有精品视频 | 日本a v在线播放 | 日韩欧美操 | 中文天堂网| 久草视频在线播放 | 久久精品国产一区二区三区不卡 | 国产成人在线视频免费观看 | 阿v视频在线观看 | 久久国品片 | 在线一区视频 | 国产网站在线播放 | 精品一区二区三区四区视频 | 国产精品夜间视频香蕉 | 波霸ol一区二区 | 国家一级黄色片 | 日韩欧美国产精品 | 最新黄色毛片 | 一区二区三区免费 | 久久久久久久久国产精品 | 免费一区在线 | 亚洲国产精品人人爽夜夜爽 | 亚洲视频一区二区三区 | 九九亚洲 | 久久国产一区二区 | 成人av免费| 亚洲欧美一区二区在线观看 | 久久国品片 | 天天操夜夜爽 | 九九久久久 | 亚洲精品一 | 欧美乱大交xxxxx另类电影 | 中文字幕在线视频精品 | 亚洲视频中文 |