這是前一個禮拜的作品,Adruino IDE使用的是1.8.2版本,UNO板作為主控,電機使用的是最普遍的直流減速電機(帶電刷),測速碼盤是20格數的,驅動模塊采用常見的L298N,測速模塊使用槽型光電傳感器,通過輸出高低電平,來判斷有無物體經過。 (大佬莫笑)
全部資料下載地址:
spees_tset_control.zip
(1.79 KB, 下載次數: 86)
2017-7-12 04:00 上傳
點擊文件名下載附件
碼盤測速 下載積分: 黑幣 -5
control_motor_speed.zip
(2.04 KB, 下載次數: 51)
2017-7-12 03:59 上傳
點擊文件名下載附件
按控制電機調速 下載積分: 黑幣 -5
部分程序預覽:
- int k1 = 4; //啟動
- int k2 = 5; //停止
- int k3 = 6; //加速
- int k4 = 7; //減速
- int keystate = 0; //初值=0,按鍵狀態標志位
- boolean ledstate = 0; //初值=0,記錄led狀態
- int ledpin = 11; //按鍵指示燈
- int M1 = 12; //電機引腳12
- int M2 = 13; //電機引腳13
- int PWM_ENA = 3; //pwm調速控制腳
- int motorState = 0; //電機狀態
- float level=0.255; //占空比++
- float rate=0; //定義占空比的數值
- #define rateMax 255 //PWM最大值
- #define rateMix 0 //PWM最小值
- int zkb;
- void setup()
- {
- // put your setup code here, to run once:
- pinMode(k1, INPUT_PULLUP); //設置為內部上拉電阻
- pinMode(k2, INPUT_PULLUP);
- pinMode(k3, INPUT_PULLUP);
- pinMode(k4, INPUT_PULLUP);
- pinMode(M1, OUTPUT);
- pinMode(M2, OUTPUT);
- //pinMode(PWM_ENA,OUTPUT);
- Serial.begin(9600);
-
- pinMode(ledpin, OUTPUT);
- // int fff=3; //fff=2:Frequency=980.392HZ
- // TCCR2B=(TCCR2B&0xF8)|fff; //timer2控制Pin 11和Pin 3
- //------Set PWM frequency for D9 & D10------
- //TCCR1B = TCCR1B & B11111000 | B00000001;
- // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
- //TCCR1B = TCCR1B & B11111000 | B00000010;
- // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
-
- //TCCR1B = TCCR1B & B11111000 | B00000011;
- // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
- //TCCR1B = TCCR1B & B11111000 | B00000100;
- // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
- //TCCR1B = TCCR1B & B11111000 | B00000101;
- // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz
- }
- void keyscan() //按鍵程序
- {
- if (digitalRead(k1) == 0) //按鍵按下
- {
- delay(10); //消抖
- if (digitalRead(k1) == 0) //確認按鍵按下
- {
- keystate = 1; //按鍵1按下狀態標志
- }
- while (!digitalRead(k1)); //松手檢測
- }
- if (digitalRead(k2) == 0) //按鍵按下
- {
- delay(10); //消抖
- if (digitalRead(k2) == 0) //確認按鍵按下
- {
- keystate = 2; //按鍵2按下狀態標志
- }
- while (!digitalRead(k2)); //松手檢測
- }
- if (digitalRead(k3) == 0) //按鍵按下
- {
- delay(10); //消抖
- if (digitalRead(k3) == 0) //確認按鍵按下
- {
- keystate = 3; //按鍵1按下狀態標志
- }
- while (!digitalRead(k3)); //松手檢測
- }
- if (digitalRead(k4) == 0) //按鍵按下
- {
- delay(10); //消抖
- if (digitalRead(k4) == 0) //確認按鍵按下
- {
- keystate = 4; //按鍵2按下狀態標志
- }
- while (!digitalRead(k4)); //松手檢測
- }
- }
- void on() //占空比50%
- {
- digitalWrite(M1,HIGH); //保持電機一個方向轉動
- digitalWrite(M2,LOW);
- analogWrite(PWM_ENA,rateMax/2); //輸入模擬值,控制占空比(速度)
- }
- void off()
- {
- analogWrite(PWM_ENA,LOW); //輸入模擬值,控制占空比(速度)
- }
- void loop()
- {
- // put your main code here, to run repeatedly:
- keyscan(); //調用鍵值掃描程序
- if(keystate==1)
- {
- keystate = 0; //恢復初值,以讀取下一次鍵值
- on();
- }
- if(keystate==2)
- {
- keystate = 0; //恢復初值,以讀取下一次鍵值
- off();
- }
-
- if (keystate == 3) //記錄按鍵已被按下
- {
- keystate = 0; //恢復初值,以讀取下一次鍵值
- rate+=level; //PWM占空比加速級別
- zkb+=1;
- Serial.print("The pwm=");
- Serial.print(rate); //實時顯示占空比值
- Serial.println("/255");
-
- Serial.print(zkb);
- Serial.println("/1000");
- if(rate>=rateMax) //如果到最大值
- {
- rate=rateMax; //保持當前最大速度
- Serial.print("The pwmMax=");
- Serial.print(zkb); //達到最大限值
- Serial.println("/1000\n");
- }
- if(zkb>=999) zkb=999;
- digitalWrite(M1,HIGH);//保持電機一個方向轉動
- digitalWrite(M2,LOW);
- analogWrite(PWM_ENA,rate); //輸入模擬值控制占空比(速度)
- }
-
- if (keystate == 4) //記錄按鍵已被按下
- {
- keystate = 0; //恢復初值,以讀取下一次鍵值
- rate-=level; //PWM占空比加速級別
- zkb-=1;
- Serial.print("The pwm=");
- Serial.print(rate); //實時顯示占空比值
- Serial.println("/255");
-
- Serial.print(zkb);
- Serial.println("/1000");
- if(rate<=rateMix) //如果到最小值
- {
- rate=rateMix; //保持當前最小速度
- Serial.print("The pwmMin=");
- Serial.print(zkb); //達到最小限值
- Serial.println("/1000\n");
- }
- if(zkb<=1) zkb=1;
- digitalWrite(M1,HIGH); //保持電機一個方向轉動
- digitalWrite(M2,LOW);
- analogWrite(PWM_ENA,rate); //輸入模擬值,控制占空比(速度)
- }
- }
- //void setPwmFrequency(int pin, int divisor)
- //{
- // byte mode;
- // if(pin == 5 || pin == 6 || pin == 9 || pin == 10)
- // {
- // switch(divisor)
- // {
- // case 1: mode = 0x01; break;
- // case 8: mode = 0x02; break;
- // case 64: mode = 0x03; break;
- // case 256: mode = 0x04; break;
- // case 1024: mode = 0x05; break;
- // default: return;
- // }
- // if(pin == 5 || pin == 6)
- // {
- // TCCR0B = TCCR0B & 0b11111000 | mode;
- // } else {
- // TCCR1B = TCCR1B & 0b11111000 | mode;
- // }
- // }
- //
- // else if(pin == 3 || pin == 11)
- // {
- // switch(divisor)
- // {
- // case 1: mode = 0x01; break;
- // case 8: mode = 0x02; break;
- // case 32: mode = 0x03; break;
- // case 64: mode = 0x04; break;
- // case 128: mode = 0x05; break;
- // case 256: mode = 0x06; break;
- // case 1024: mode = 0x7; break;
- // default: return;
- // }
- // TCCR2B = TCCR2B & 0b11111000 | mode;
- // }
- //}
復制代碼
|