这是前一个礼拜的作品,Adruino IDE使用的是1.8.2版本,UNO板作为主控,电机使用的是最普遍的直流减速电机(带电刷),测速码盘是20格数的,驱动模块采用常见的L298N,测速模块使用槽型光电传感器,通过输出高低电平,来判断有无物体经过。(大佬莫笑)
全部资料下载地址:
spees_tset_control.zip
(1.79 KB, 下载次数: 86)
control_motor_speed.zip
(2.04 KB, 下载次数: 51)
部分程序预览:
- 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;
- // }
- //}
复制代码
|