求助控制直流电机的程序,各位大师请入,感谢~
做了一个程序,要求电机一个方向有间隔的旋转,而且有两种旋转模式,一种每隔30秒转10秒,一种每隔50秒转10秒。而且要求LCD上显示计时,昨儿折腾了一晚上,发现几个问题没办法解决
1,只能单线程执行,如果要中断循环要等最后一个delay延时完成,不知道怎么直接中断,求解。。。
2,计时器的问题,按下按钮开始计时,本来想做一个for或者while的循环语句增量,这个增量的循环没办法和电机的循环一起执行。。彻底没招了,求解。。。
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int pinA1 = 4;
int pinA2 = 5;
int C41_Switch = 7; //右边按键引脚编号
int D76_Switch = 8; //左边按键引脚编号
int ST_Switch = 9; //停止按键引脚编号
boolean C41onoff = LOW;
boolean D76onoff = LOW;
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd .
lcd.setCursor(0,0); //newline
lcd.print("ASH Film ");// Print a message to the LCD
lcd.setCursor(5,1);
lcd.print("V0.01");
lcd.backlight();
delay(1500); //延时显示2000
lcd.clear();
lcd.print("Select Button ");
lcd.setCursor(0,1);
lcd.print("B:C41 G:D76 ");
pinMode(pinA1,OUTPUT);
pinMode(pinA2,OUTPUT);
pinMode(C41_Switch,INPUT);
pinMode(D76_Switch,INPUT);
pinMode(ST_Switch,INPUT);
}
void loop()
{
if(digitalRead(C41_Switch)==HIGH)
{
delay(10);
if(digitalRead(C41_Switch)==HIGH)
{
C41();
C41onoff=(!C41onoff);
delay(10);
}
}
if(digitalRead(D76_Switch)==HIGH)
{
delay(10);
if(digitalRead(D76_Switch)==HIGH)
{
D76();
D76onoff=(!D76onoff);
delay(10);
}
}
}
void C41()
{
int i = 0;
while (i<1000)
{
digitalWrite(pinA1,HIGH);
digitalWrite(pinA2,LOW);
delay(10000);//10s
digitalWrite(pinA1,LOW);
digitalWrite(pinA2,LOW);
delay(30000);//30s
if(digitalRead(ST_Switch)==HIGH)
{
digitalWrite(pinA1,LOW);
digitalWrite(pinA2,LOW);;
break;
STlcd();
}
}
}
void D76()
{
int i = 0;
while (i<1000)
{
digitalWrite(pinA1,HIGH);
digitalWrite(pinA2,LOW);
delay(10000);//10s
digitalWrite(pinA1,LOW);
digitalWrite(pinA2,LOW);
delay(50000);//50s
if(digitalRead(ST_Switch)==HIGH)
{
digitalWrite(pinA1,LOW);
digitalWrite(pinA2,LOW);
break;
STlcd();
}
}
}
void Jtime() //本来希望用这个计时,结果发现无法这样循环。。。
{
for(int k=0;k<60;k++)
{
delay(1000);
lcd.setCursor(5,1);
lcd.print(k);
}
}
void STlcd()
{
lcd.clear();
lcd.print("Ok...Stop!");
delay(3000);
lcd.clear();
lcd.print("Select Button ");
lcd.setCursor(0,1);
lcd.print("B:C41 G:D76 ");
}
用定时器,不过你的代码要全部重写了 本帖最后由 hsr18299 于 2014-6-11 05:13 编辑
幾點建議
1. 一般boolean比較習慣用true及false
2. 如果沒有要控制電機正反轉,直接把電機pinA2接地,用pinA1控制就好,這樣程序跟接線看起來比較清爽
3. 如果要用外部中斷,只能接在第2或3腳
4. 如果delay(10)是為了消除按鈕開關的彈跳效應的話,直接並連一個電容就好了,下拉電阻還是要的
int pinA1 = 4;
int C41_Switch = 7; //右边按键引脚编号
int D76_Switch = 8; //左边按键引脚编号
int c41state = 0;
int d76state = 0;
//ST_Switch = 2; 停止按键引脚编号
void setup() {
pinMode(pinA1,OUTPUT);
pinMode(C41_Switch,INPUT);
pinMode(D76_Switch,INPUT);
attachInterrupt(0,st,RISING);//RISING是上升觸發,依照你的設計去更改模式
}
void st() { //中斷函數
digitalWrite(pinA1,LOW);
}
void c41() { //c41運行模式函數
digitalWrite(pinA1,HIGH);
delay(10000);
digitalWrite(pinA1,LOW);
delay(30000);
}
void d76() { //d76運行模式函數
digitalWrite(pinA1,HIGH);
delay(10000);
digitalWrite(pinA1,LOW);
delay(50000);
}
void loop() {
c41state = digitalRead(C41_Switch);
if (c41state == HIGH) {c41();}
d76state = digitalRead(D76_Switch);
if (d76state == HIGH) {d76();}
}
先試試:) LCD就自己加進去吧!!
不瞭解你計時器的意義,所以沒加進去 hsr18299 发表于 2014-6-11 04:37 static/image/common/back.gif
幾點建議
1. 一般boolean比較習慣用true及false
2. 如果沒有要控制電機正反轉,直接把電機pinA2接地,用pin ...
十分感谢,计时器,我想的是按下按钮就开始执行计时,计算执行的时间。
页:
[1]