Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 2402|回復: 5
打印 上一主題 下一主題

請問有關Arduino 停止傳送脈波的問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2017-10-6 19:41:50 | 顯示全部樓層 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 adolclistin 於 2017-10-6 19:59 編輯

各位前輩 大家好

我使用Arduino 來控制步進馬達

使用的回圈如下:

inline void microWaitUntil(unsigned long target_micros){
    yield();
    while (micros() < target_micros);
}

void loop() {

     digitalWrite(MOTOR_STEP, HIGH);        //送高電位
     unsigned long next_edge = micros() + pulse_duration;
     microWaitUntil(next_edge);                        //delay
     digitalWrite(MOTOR_STEP, LOW);        //送低電位
     microWaitUntil(next_edge + pulse_duration);        //delay
     
}

在loop中的函式是不斷的送出脈波。
其中  pulse_duration是需要delay的時間。

現在有一個問題,在執行時,有一定的機率arduino會停止送脈波,也就是loop內沒有在工作。

初步測試,我們使用外部中斷來進行測試發現,arduino 是有回應的,所以可以排除arduino當掉的問題。


煩請大大給予指教。

謝謝!
2#
 樓主| 發表於 2017-10-7 14:34:49 | 顯示全部樓層
很感謝 超新手大大的說明

我昨天發問完後,就先測試了先將yield拿掉,經過12小時的運轉是沒有問題的,也只能說剛剛好沒有問題。
今天又再開一次,進行第二輸的測試。

看了超新手大大的回覆之後,我一直上網找看看是否有reset的方式,只找到millis這個函數的reset。

在下想說是不是用 long long這個資料型態來接micros()這個函數,讓相減之後產生負數來跳脫迴圈,
或是改用delayMicroseconds()來進行暫停的動作。

3#
 樓主| 發表於 2017-10-11 17:15:14 | 顯示全部樓層
先感謝超新手回答。

這幾天我嘗試了delayMicroseconds(),並用土法練鋼的方法找到相對應的轉速。
早知道就先上來讀您的回覆了。

您的方法很好,我接下來再進行測試。

再次感謝!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-4 12:34 , Processed in 0.175392 second(s), 6 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表