標(biāo)題:
用Adruino寫的電機(jī)測速與調(diào)速的程序
[打印本頁]
作者:
流連涅槃
時間:
2017-7-12 04:03
標(biāo)題:
用Adruino寫的電機(jī)測速與調(diào)速的程序
這是前一個禮拜的作品,Adruino IDE使用的是1.8.2版本,UNO板作為主控,電機(jī)使用的是最普遍的直流減速電機(jī)(帶電刷),測速碼盤是20格數(shù)的,驅(qū)動模塊采用常見的L298N,測速模塊使用槽型光電傳感器,通過輸出高低電平,來判斷有無物體經(jīng)過。
(大佬莫笑)
全部資料下載地址:
spees_tset_control.zip
(1.79 KB, 下載次數(shù): 86)
2017-7-12 04:00 上傳
點擊文件名下載附件
碼盤測速
下載積分: 黑幣 -5
control_motor_speed.zip
(2.04 KB, 下載次數(shù): 51)
2017-7-12 03:59 上傳
點擊文件名下載附件
按控制電機(jī)調(diào)速
下載積分: 黑幣 -5
部分程序預(yù)覽:
int k1 = 4; //啟動
int k2 = 5; //停止
int k3 = 6; //加速
int k4 = 7; //減速
int keystate = 0; //初值=0,按鍵狀態(tài)標(biāo)志位
boolean ledstate = 0; //初值=0,記錄led狀態(tài)
int ledpin = 11; //按鍵指示燈
int M1 = 12; //電機(jī)引腳12
int M2 = 13; //電機(jī)引腳13
int PWM_ENA = 3; //pwm調(diào)速控制腳
int motorState = 0; //電機(jī)狀態(tài)
float level=0.255; //占空比++
float rate=0; //定義占空比的數(shù)值
#define rateMax 255 //PWM最大值
#define rateMix 0 //PWM最小值
int zkb;
void setup()
{
// put your setup code here, to run once:
pinMode(k1, INPUT_PULLUP); //設(shè)置為內(nèi)部上拉電阻
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) //確認(rèn)按鍵按下
{
keystate = 1; //按鍵1按下狀態(tài)標(biāo)志
}
while (!digitalRead(k1)); //松手檢測
}
if (digitalRead(k2) == 0) //按鍵按下
{
delay(10); //消抖
if (digitalRead(k2) == 0) //確認(rèn)按鍵按下
{
keystate = 2; //按鍵2按下狀態(tài)標(biāo)志
}
while (!digitalRead(k2)); //松手檢測
}
if (digitalRead(k3) == 0) //按鍵按下
{
delay(10); //消抖
if (digitalRead(k3) == 0) //確認(rèn)按鍵按下
{
keystate = 3; //按鍵1按下狀態(tài)標(biāo)志
}
while (!digitalRead(k3)); //松手檢測
}
if (digitalRead(k4) == 0) //按鍵按下
{
delay(10); //消抖
if (digitalRead(k4) == 0) //確認(rèn)按鍵按下
{
keystate = 4; //按鍵2按下狀態(tài)標(biāo)志
}
while (!digitalRead(k4)); //松手檢測
}
}
void on() //占空比50%
{
digitalWrite(M1,HIGH); //保持電機(jī)一個方向轉(zhuǎn)動
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(); //調(diào)用鍵值掃描程序
if(keystate==1)
{
keystate = 0; //恢復(fù)初值,以讀取下一次鍵值
on();
}
if(keystate==2)
{
keystate = 0; //恢復(fù)初值,以讀取下一次鍵值
off();
}
if (keystate == 3) //記錄按鍵已被按下
{
keystate = 0; //恢復(fù)初值,以讀取下一次鍵值
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; //保持當(dāng)前最大速度
Serial.print("The pwmMax=");
Serial.print(zkb); //達(dá)到最大限值
Serial.println("/1000\n");
}
if(zkb>=999) zkb=999;
digitalWrite(M1,HIGH);//保持電機(jī)一個方向轉(zhuǎn)動
digitalWrite(M2,LOW);
analogWrite(PWM_ENA,rate); //輸入模擬值控制占空比(速度)
}
if (keystate == 4) //記錄按鍵已被按下
{
keystate = 0; //恢復(fù)初值,以讀取下一次鍵值
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; //保持當(dāng)前最小速度
Serial.print("The pwmMin=");
Serial.print(zkb); //達(dá)到最小限值
Serial.println("/1000\n");
}
if(zkb<=1) zkb=1;
digitalWrite(M1,HIGH); //保持電機(jī)一個方向轉(zhuǎn)動
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;
// }
//}
復(fù)制代碼
作者:
流連涅槃
時間:
2017-7-12 04:04
等下次把一些圖片和解釋放上來,都快天亮了
作者:
lm18007726198
時間:
2018-7-11 17:52
流連涅槃 發(fā)表于 2017-7-12 04:04
等下次把一些圖片和解釋放上來,都快天亮了
速度顯示用什么顯示屏
作者:
lm18007726198
時間:
2018-7-11 17:54
速度顯示用什么顯示屏
作者:
lm18007726198
時間:
2018-7-11 17:55
速度顯示用什么顯示屏
作者:
醉里挑燈看劍的
時間:
2019-5-19 11:51
學(xué)習(xí)學(xué)習(xí)。!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1