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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11663|回復: 5
打印 上一主題 下一主題
收起左側

用Adruino寫的電機測速與調速的程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:193567 發表于 2017-7-12 04:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是前一個禮拜的作品,Adruino IDE使用的是1.8.2版本,UNO板作為主控,電機使用的是最普遍的直流減速電機(帶電刷),測速碼盤是20格數的,驅動模塊采用常見的L298N,測速模塊使用槽型光電傳感器,通過輸出高低電平,來判斷有無物體經過。(大佬莫笑)

全部資料下載地址:
spees_tset_control.zip (1.79 KB, 下載次數: 86)
control_motor_speed.zip (2.04 KB, 下載次數: 51)

部分程序預覽:
  1. int k1 = 4; //啟動
  2. int k2 = 5; //停止
  3. int k3 = 6; //加速
  4. int k4 = 7; //減速
  5. int keystate = 0;     //初值=0,按鍵狀態標志位
  6. boolean ledstate = 0; //初值=0,記錄led狀態
  7. int ledpin = 11;  //按鍵指示燈
  8. int M1 = 12;       //電機引腳12
  9. int M2 = 13;      //電機引腳13
  10. int PWM_ENA = 3;  //pwm調速控制腳
  11. int motorState = 0; //電機狀態
  12. float level=0.255;       //占空比++
  13. float rate=0;         //定義占空比的數值
  14. #define rateMax 255 //PWM最大值
  15. #define rateMix 0   //PWM最小值
  16. int zkb;
  17. void setup()
  18. {
  19.   // put your setup code here, to run once:
  20.   pinMode(k1, INPUT_PULLUP);  //設置為內部上拉電阻
  21.   pinMode(k2, INPUT_PULLUP);
  22.   pinMode(k3, INPUT_PULLUP);
  23.   pinMode(k4, INPUT_PULLUP);
  24.   pinMode(M1, OUTPUT);
  25.   pinMode(M2, OUTPUT);
  26.   //pinMode(PWM_ENA,OUTPUT);  
  27.   Serial.begin(9600);
  28.   
  29.   pinMode(ledpin, OUTPUT);
  30. //  int fff=3;    //fff=2:Frequency=980.392HZ
  31. //  TCCR2B=(TCCR2B&0xF8)|fff; //timer2控制Pin 11和Pin 3  

  32. //------Set PWM frequency for D9 & D10------
  33. //TCCR1B = TCCR1B & B11111000 | B00000001;   
  34. // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz

  35. //TCCR1B = TCCR1B & B11111000 | B00000010;   
  36. // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz

  37. //TCCR1B = TCCR1B & B11111000 | B00000011;   
  38. // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)

  39. //TCCR1B = TCCR1B & B11111000 | B00000100;   
  40. // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz

  41. //TCCR1B = TCCR1B & B11111000 | B00000101;   
  42. // set timer 1 divisor to  1024 for PWM frequency of 30.64 Hz
  43. }

  44. void keyscan()  //按鍵程序
  45. {
  46.   if (digitalRead(k1) == 0) //按鍵按下
  47.   {
  48.     delay(10);  //消抖
  49.     if (digitalRead(k1) == 0) //確認按鍵按下
  50.     {
  51.       keystate = 1; //按鍵1按下狀態標志
  52.     }
  53.     while (!digitalRead(k1)); //松手檢測
  54.   }

  55.    if (digitalRead(k2) == 0) //按鍵按下
  56.   {
  57.     delay(10);  //消抖
  58.     if (digitalRead(k2) == 0) //確認按鍵按下
  59.     {
  60.       keystate = 2;   //按鍵2按下狀態標志
  61.     }
  62.     while (!digitalRead(k2)); //松手檢測
  63.   }

  64.   if (digitalRead(k3) == 0) //按鍵按下
  65.   {
  66.     delay(10);  //消抖
  67.     if (digitalRead(k3) == 0) //確認按鍵按下
  68.     {
  69.       keystate = 3; //按鍵1按下狀態標志
  70.     }
  71.     while (!digitalRead(k3)); //松手檢測
  72.   }

  73.    if (digitalRead(k4) == 0) //按鍵按下
  74.   {
  75.     delay(10);  //消抖
  76.     if (digitalRead(k4) == 0) //確認按鍵按下
  77.     {
  78.       keystate = 4;   //按鍵2按下狀態標志
  79.     }
  80.     while (!digitalRead(k4)); //松手檢測
  81.   }
  82. }

  83. void on() //占空比50%
  84. {
  85.   digitalWrite(M1,HIGH);  //保持電機一個方向轉動
  86.   digitalWrite(M2,LOW);  
  87.   analogWrite(PWM_ENA,rateMax/2);  //輸入模擬值,控制占空比(速度)
  88. }

  89. void off()  
  90. {
  91.   analogWrite(PWM_ENA,LOW);  //輸入模擬值,控制占空比(速度)
  92. }

  93. void loop()
  94. {
  95.   // put your main code here, to run repeatedly:   
  96.   keyscan();  //調用鍵值掃描程序
  97.   if(keystate==1)
  98.   {
  99.     keystate = 0; //恢復初值,以讀取下一次鍵值
  100.     on();
  101.   }
  102.   if(keystate==2)
  103.   {
  104.     keystate = 0; //恢復初值,以讀取下一次鍵值
  105.     off();
  106.   }

  107.   if (keystate == 3) //記錄按鍵已被按下
  108.   {
  109.     keystate = 0; //恢復初值,以讀取下一次鍵值   
  110.     rate+=level; //PWM占空比加速級別
  111.     zkb+=1;
  112.     Serial.print("The pwm=");
  113.     Serial.print(rate);  //實時顯示占空比值
  114.     Serial.println("/255");
  115.    
  116.     Serial.print(zkb);
  117.     Serial.println("/1000");
  118.     if(rate>=rateMax) //如果到最大值
  119.     {
  120.       rate=rateMax;   //保持當前最大速度
  121.       Serial.print("The pwmMax=");
  122.       Serial.print(zkb);   //達到最大限值
  123.       Serial.println("/1000\n");
  124.     }      
  125.     if(zkb>=999)  zkb=999;
  126.     digitalWrite(M1,HIGH);//保持電機一個方向轉動  
  127.     digitalWrite(M2,LOW);   
  128.     analogWrite(PWM_ENA,rate);  //輸入模擬值控制占空比(速度)      
  129.   }
  130.   
  131.   if (keystate == 4) //記錄按鍵已被按下
  132.   {
  133.     keystate = 0; //恢復初值,以讀取下一次鍵值  
  134.     rate-=level; //PWM占空比加速級別
  135.     zkb-=1;
  136.     Serial.print("The pwm=");
  137.     Serial.print(rate);     //實時顯示占空比值
  138.     Serial.println("/255");
  139.    
  140.     Serial.print(zkb);
  141.     Serial.println("/1000");
  142.     if(rate<=rateMix) //如果到最小值
  143.     {
  144.       rate=rateMix;   //保持當前最小速度     
  145.       Serial.print("The pwmMin=");
  146.       Serial.print(zkb);   //達到最小限值
  147.       Serial.println("/1000\n");
  148.     }
  149.     if(zkb<=1)  zkb=1;   
  150.     digitalWrite(M1,HIGH);  //保持電機一個方向轉動
  151.     digitalWrite(M2,LOW);  
  152.     analogWrite(PWM_ENA,rate);  //輸入模擬值,控制占空比(速度)  
  153.   }  
  154. }

  155. //void setPwmFrequency(int pin, int divisor)
  156. //{
  157. //  byte mode;
  158. //  if(pin == 5 || pin == 6 || pin == 9 || pin == 10)
  159. //  {
  160. //    switch(divisor)
  161. //    {
  162. //      case 1: mode = 0x01; break;
  163. //      case 8: mode = 0x02; break;
  164. //      case 64: mode = 0x03; break;
  165. //      case 256: mode = 0x04; break;
  166. //      case 1024: mode = 0x05; break;
  167. //      default: return;
  168. //    }
  169. //    if(pin == 5 || pin == 6)
  170. //    {
  171. //      TCCR0B = TCCR0B & 0b11111000 | mode;
  172. //    } else {
  173. //      TCCR1B = TCCR1B & 0b11111000 | mode;
  174. //    }
  175. //  }
  176. //  
  177. //  else if(pin == 3 || pin == 11)
  178. //  {   
  179. //    switch(divisor)
  180. //    {
  181. //      case 1: mode = 0x01; break;
  182. //      case 8: mode = 0x02; break;
  183. //      case 32: mode = 0x03; break;
  184. //      case 64: mode = 0x04; break;
  185. //      case 128: mode = 0x05; break;
  186. //      case 256: mode = 0x06; break;
  187. //      case 1024: mode = 0x7; break;
  188. //      default: return;
  189. //    }
  190. //    TCCR2B = TCCR2B & 0b11111000 | mode;
  191. //  }
  192. //}
復制代碼


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

使用道具 舉報

沙發
ID:193567 發表于 2017-7-12 04:04 | 只看該作者
等下次把一些圖片和解釋放上來,都快天亮了
回復

使用道具 舉報

板凳
ID:258474 發表于 2018-7-11 17:52 | 只看該作者
流連涅槃 發表于 2017-7-12 04:04
等下次把一些圖片和解釋放上來,都快天亮了

速度顯示用什么顯示屏
回復

使用道具 舉報

地板
ID:258474 發表于 2018-7-11 17:54 | 只看該作者
速度顯示用什么顯示屏
回復

使用道具 舉報

5#
ID:258474 發表于 2018-7-11 17:55 | 只看該作者
速度顯示用什么顯示屏
回復

使用道具 舉報

6#
ID:218324 發表于 2019-5-19 11:51 | 只看該作者
學習學習!!!
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线播放 | 亚洲综合在线视频 | 色综合天天天天做夜夜夜夜做 | 一区二区精品 | 天天插天天射天天干 | 日韩精品成人免费观看视频 | 欧美日韩一 | 久久久久久亚洲精品不卡 | 成年人在线观看视频 | 亚洲欧美日韩在线 | 国产三级国产精品 | 51ⅴ精品国产91久久久久久 | 日韩毛片 | 欧美日韩国产一区二区三区不卡 | 天天综合干 | 999免费观看视频 | 欧美精品一区在线发布 | 国产精品久久久久久久久免费相片 | 国产精品视频网 | 国产a区 | 欧美亚洲高清 | 日本电影一区二区 | 青青草华人在线视频 | 国产成人一区二区三区精 | 午夜播放器在线观看 | 国产欧美日韩视频 | 亚洲精品在线观 | 久久综合国产精品 | 中文字幕免费在线 | 国产一区2区 | 国产精品v | 国产一区二区黑人欧美xxxx | 狠狠的操| 99久久久99久久国产片鸭王 | 国产在线精品一区二区三区 | 黄色片免费看视频 | 日韩视频一区在线观看 | 日韩欧美国产一区二区三区 | 99久久亚洲 | 久久久久久久香蕉 | 大陆一级毛片免费视频观看 |