jony7788
級(jí)別: 工控俠客
![]() |
圖片:
![]() 一圈360度,分為12個(gè)段點(diǎn),每個(gè)段點(diǎn)30度,每個(gè)段點(diǎn)都有一個(gè)開關(guān)。 當(dāng)開關(guān)打開的區(qū)間,步進(jìn)電機(jī)以正常速度旋轉(zhuǎn),并在段點(diǎn)停留0.5秒,沒有打開段點(diǎn)的區(qū)間,以快于正常速度進(jìn)行旋轉(zhuǎn),且不做停留。 以下例,1、2,5、6,9,10這幾個(gè)區(qū)間是正常速度,其它區(qū)間是快速通過。 償了下幾種方式,效果都不好,大多都是快速時(shí)跑過了頭,把正常區(qū)間都越過了。 PLC是三菱FX3U 希望老師們能指點(diǎn)下思路,感謝。 |
---|---|
|
jony7788
級(jí)別: 工控俠客
![]() |
先用你的思路試一下,感謝。 |
---|---|
|
jony7788
級(jí)別: 工控俠客
![]() |
有興趣和上班有空閑的朋友可以償試下,開關(guān)用中間繼電器代替,成功了的話個(gè)人發(fā)紅包200感謝,重賞談不上,只是一個(gè)為知識(shí)付費(fèi)的態(tài)度。 |
---|---|
|
jony7788
級(jí)別: 工控俠客
![]() |
這個(gè)轉(zhuǎn)速不高,其實(shí)在快速通過的點(diǎn)位,按三樓說的,增加轉(zhuǎn)動(dòng)的脈沖數(shù),就可以了,最后一個(gè)點(diǎn)位是原點(diǎn),每個(gè)循環(huán)的最后動(dòng)作是回原點(diǎn)。 電機(jī)驅(qū)動(dòng)前有個(gè)點(diǎn)動(dòng)開關(guān),點(diǎn)動(dòng)一次,電機(jī)就一個(gè)循環(huán)動(dòng)作,沒什么丟步的問題。 |
---|---|
|
jony7788
級(jí)別: 工控俠客
![]() |
有點(diǎn)這個(gè)意思。 |
---|---|
|
jony7788
級(jí)別: 工控俠客
![]() |
我目前的方法同你的方法有點(diǎn)類似,用電機(jī)的脈沖數(shù)來判斷區(qū)間,效果不是很好,如果前面全部是開,后面全部是斷,還可以,間隔開斷的反應(yīng)不過來。 |
---|---|
|
jony7788
級(jí)別: 工控俠客
![]() |
請(qǐng)豆包幫忙寫的,調(diào)整幾次之后,可以正常運(yùn)行,用的是Arduino板子,豆包寫梯形圖的能力還不強(qiáng),寫這種編程語言厲害些。 // 定義步進(jìn)電機(jī)控制引腳 const int stepPin = 2; const int dirPin = 3; // 定義啟動(dòng)按鍵引腳 const int startButtonPin = 4; // 定義 12 個(gè)開關(guān)引腳 const int switchPins[12] = {5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1, A2}; // 定義原點(diǎn)感應(yīng)點(diǎn)位引腳 const int originPin = A3; // 定義料件感應(yīng)點(diǎn)位引腳 const int materialSensorPin = A4; // 定義振動(dòng)盤點(diǎn)位引腳 const int vibrationDiskPin = A5; // 定義步進(jìn)電機(jī)參數(shù) const int stepsPerRevolution = 1000; // 步進(jìn)電機(jī)每轉(zhuǎn)脈沖數(shù) // 定義速度參數(shù)(毫秒) const unsigned long normalSpeedDelay = 1; // 正常速度延遲 const unsigned long fastSpeedDelay = 0.2; // 快速速度延遲 const unsigned long returnSpeedDelay = 0.5; // 返回原點(diǎn)速度延遲 // 定義停留時(shí)間(毫秒) const unsigned long pauseTime = 500; // 定義變量 bool startButtonState = false; bool lastStartButtonState = false; bool isRunning = false; bool isReturning = false; int currentSegment = 0; int remainingSteps = stepsPerRevolution; unsigned long lastStepTime = 0; unsigned long lastPauseTime = 0; bool isPausing = false; void setup() { // 初始化步進(jìn)電機(jī)控制引腳為輸出模式 pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); // 初始化啟動(dòng)按鍵引腳為輸入模式,并啟用上拉電阻 pinMode(startButtonPin, INPUT_PULLUP); // 初始化 12 個(gè)開關(guān)引腳為輸入模式,并啟用上拉電阻 for (int i = 0; i < 12; i++) { pinMode(switchPins, INPUT_PULLUP); } // 初始化原點(diǎn)感應(yīng)點(diǎn)位引腳為輸入模式,并啟用上拉電阻 pinMode(originPin, INPUT_PULLUP); // 初始化料件感應(yīng)點(diǎn)位引腳為輸入模式,并啟用上拉電阻 pinMode(materialSensorPin, INPUT_PULLUP); // 初始化振動(dòng)盤點(diǎn)位引腳為輸出模式 pinMode(vibrationDiskPin, OUTPUT); // 設(shè)置初始方向 digitalWrite(dirPin, HIGH); } void loop() { // 讀取啟動(dòng)按鍵狀態(tài) startButtonState = digitalRead(startButtonPin); // 檢測(cè)啟動(dòng)按鍵按下事件 if (startButtonState == LOW && lastStartButtonState == HIGH) { isRunning = true; currentSegment = 0; remainingSteps = stepsPerRevolution; isReturning = false; } // 保存上一次啟動(dòng)按鍵狀態(tài) lastStartButtonState = startButtonState; // 控制振動(dòng)盤 bool materialDetected = digitalRead(materialSensorPin) == LOW; digitalWrite(vibrationDiskPin, !materialDetected); // 如果電機(jī)正在運(yùn)行 if (isRunning) { if (isReturning) { unsigned long currentTime = millis(); if (currentTime - lastStepTime >= returnSpeedDelay) { digitalWrite(dirPin, LOW); // 設(shè)置返回方向 digitalWrite(stepPin, HIGH); delayMicroseconds(10); // 確保脈沖寬度 digitalWrite(stepPin, LOW); lastStepTime = currentTime; if (digitalRead(originPin) == LOW) { isRunning = false; isReturning = false; digitalWrite(dirPin, HIGH); // 恢復(fù)正向 } } } else { if (isPausing) { if (millis() - lastPauseTime >= pauseTime) { isPausing = false; } } else { unsigned long currentTime = millis(); bool switchState = digitalRead(switchPins[currentSegment]); unsigned long speedDelay = switchState ? normalSpeedDelay : fastSpeedDelay; if (currentTime - lastStepTime >= speedDelay) { if (remainingSteps > 0) { digitalWrite(stepPin, HIGH); delayMicroseconds(10); // 確保脈沖寬度 digitalWrite(stepPin, LOW); remainingSteps--; lastStepTime = currentTime; } if (remainingSteps * 12 <= (11 - currentSegment) * stepsPerRevolution) { if (switchState) { isPausing = true; lastPauseTime = currentTime; } currentSegment++; } if (currentSegment >= 12) { isReturning = true; } } } } } // 短暫延遲以減少 CPU 負(fù)載 delay(1); } |
---|---|
|