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

標題: 用Adruino寫的電機測速與調速的程序 [打印本頁]

作者: 流連涅槃    時間: 2017-7-12 04:03
標題: 用Adruino寫的電機測速與調速的程序
這是前一個禮拜的作品,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. //}
復制代碼



作者: 流連涅槃    時間: 2017-7-12 04:04
等下次把一些圖片和解釋放上來,都快天亮了
作者: lm18007726198    時間: 2018-7-11 17:52
流連涅槃 發表于 2017-7-12 04:04
等下次把一些圖片和解釋放上來,都快天亮了

速度顯示用什么顯示屏
作者: lm18007726198    時間: 2018-7-11 17:54
速度顯示用什么顯示屏
作者: lm18007726198    時間: 2018-7-11 17:55
速度顯示用什么顯示屏
作者: 醉里挑燈看劍的    時間: 2019-5-19 11:51
學習學習!!!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 四虎永久免费黄色影片 | 真人一级毛片 | 91美女在线观看 | 精品久久九| 亚洲天堂精品一区 | 成人免费视频网站在线观看 | 黄色av观看 | 亚洲一区综合 | 国产成人精品久久二区二区 | 狠狠狠 | 亚洲一区国产 | 国产一区中文 | 999国产视频 | 国产久视频 | 99精品国产一区二区三区 | 日韩在线免费 | 日韩成人在线观看 | 国产在线区 | 亚洲成人免费在线观看 | 羞羞视频网站免费观看 | 成人在线h | 国产精品视频在线观看 | 欧美视频在线看 | 亚洲日韩中文字幕一区 | 欧美一级小视频 | 中文字幕av高清 | 色综合久久天天综合网 | 国产1区2区在线观看 | 国产精品亚洲精品日韩已方 | 国产在线视频在线观看 | 成人免费视频久久 | 婷婷综合网 | 免费99精品国产自在在线 | 亚洲一区自拍 | 久久免费看 | 欧美日韩成人 | 国产精品1区2区3区 国产在线观看一区 | 欧美 中文字幕 | 欧美一级在线观看 | 福利久久 | 亚洲欧洲精品在线 |