找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4001|回復(fù): 4
收起左側(cè)

arduino delay堵塞延時(shí)問(wèn)題,大家進(jìn)來(lái)看看吧,哭唧唧

[復(fù)制鏈接]
ID:894800 發(fā)表于 2021-5-18 22:44 | 顯示全部樓層 |閱讀模式
  1. #include <Metro.h>
復(fù)制代碼
  arduino單片機(jī)驅(qū)動(dòng)步進(jìn)電機(jī),同時(shí)通過(guò)單片機(jī)的軟串口讀取一臺(tái)設(shè)備的數(shù)據(jù),
   因?yàn)檫@兩個(gè)任務(wù)要同時(shí)進(jìn)行,每個(gè)任務(wù)都有delay,delay堵塞影響其它任務(wù),所以我使用了多線程。
  嘗試過(guò)scoop庫(kù),chrono庫(kù)定義節(jié)拍,Mstimer中斷,只有這個(gè)metro庫(kù)初步調(diào)試成功,電機(jī)可正常運(yùn)行,但產(chǎn)生脈沖的時(shí)間6.4s還是影響了讀取數(shù)據(jù),本想500毫秒讀取一次數(shù)據(jù),結(jié)果7秒一次。

附幾個(gè)疑問(wèn):
1.使用單片機(jī)的軟串口庫(kù)讀數(shù)據(jù),無(wú)論設(shè)置采樣周期多少,都會(huì)加上1秒,這是為何?詳見(jiàn)我求助帖子
2.tone函數(shù)產(chǎn)生脈沖   tone(pin, frequency, duration),第三個(gè)參數(shù)設(shè)置周期,為何要再加延時(shí)才生效?
  1. tone(7, 440, 200);  //7號(hào)引腳發(fā)聲200毫秒 ,440HZ
  2. delay(200);
復(fù)制代碼
這個(gè)delay函數(shù)卡了我一個(gè)星期了,我這個(gè)菜雞崩潰了。馬上去學(xué)中斷,聽(tīng)說(shuō)這個(gè)也是一種方法。


< 刷到這個(gè)帖子大家隨便留言,你的任何留言都是對(duì)我的鼓勵(lì),十分感謝大家指導(dǎo)。 (鞠躬)>
1.png





回復(fù)

使用道具 舉報(bào)

ID:277550 發(fā)表于 2021-5-19 09:20 | 顯示全部樓層
要做到高精度,就不是那么簡(jiǎn)單的了。 中斷可以減少延時(shí)帶來(lái)的壞處。
回復(fù)

使用道具 舉報(bào)

ID:844772 發(fā)表于 2021-5-19 11:07 | 顯示全部樓層
arduino的delay()和軟串口應(yīng)該都用了time0,也就是說(shuō)你要是使用軟串口等中斷服務(wù),就別使用delay(),這也不麻煩,可以用循環(huán)替代。
回復(fù)

使用道具 舉報(bào)

ID:894800 發(fā)表于 2021-5-19 12:35 | 顯示全部樓層
devcang 發(fā)表于 2021-5-19 09:20
要做到高精度,就不是那么簡(jiǎn)單的了。 中斷可以減少延時(shí)帶來(lái)的壞處。

請(qǐng)問(wèn)中斷是通過(guò)attachInterrupt()函數(shù)實(shí)現(xiàn)嗎?還是通過(guò)定時(shí)器
回復(fù)

使用道具 舉報(bào)

ID:894800 發(fā)表于 2021-5-19 12:39 | 顯示全部樓層
程序在這里,粗心的我
  1. [em01]
  2. #include <Metro.h>
  3. #include <SoftwareSerial.h>      
  4. SoftwareSerial DLSerial(2, 3); // 軟串口 RX(D2), TX(D3) 紅
  5. String stringOne="";//存儲(chǔ)接收的“+5.5019e+06,BIN00”      

  6. Metro blink1Metro = Metro(1000);   //把 blink1Metro 實(shí)例化 Metro 對(duì)象 ,并設(shè)置間隔時(shí)間
  7. Metro blink2Metro = Metro(1000);     //把 blink2Metro 實(shí)例化 Metro 對(duì)象 ,并設(shè)置間隔時(shí)間

  8. void setup(){
  9. DLSerial.begin(38400); //設(shè)備波特率38400     
  10. Serial.begin(9600) ;//默認(rèn)串口波特率9600   
  11. pinMode(7,OUTPUT); // Step   
  12. pinMode(6,OUTPUT); // Dir  方向
  13. }

  14. void loop(){

  15.   if(blink1Metro.check()){  //檢查blink1Metro間隔(我的理解是計(jì)時(shí)器每隔100毫秒就會(huì)返回true,就執(zhí)行以下程序)
  16.   digitalWrite(6,HIGH); // 方向拉高     
  17.     for(int x = 0; x < 6400; x++) // Loop 2000 times     //6400  
  18.     {     
  19.         digitalWrite(7,HIGH); //  
  20.      delayMicroseconds(250); // Wait   ms  
  21.     digitalWrite(7,LOW); //  
  22.      delayMicroseconds(250); // Wait  ms  250 2000HZ 周期0.5ms
  23.      //正轉(zhuǎn)   
  24.     }  
  25.       //delay(1000); //  
  26.             
  27.      digitalWrite(6,LOW); // Set Dir high      
  28.     for(int x = 0; x < 6400; x++) // Loop 6400 times   
  29.     {     
  30.         digitalWrite(7,HIGH); //  
  31.      delayMicroseconds(250); // Wait  ms     
  32.     digitalWrite(7,LOW); //  
  33.      delayMicroseconds(250); // Wait   ms   
  34.     }  
  35.      // delay(1000);
  36. }

  37.   
  38.   if(blink2Metro.check()){  
  39.     int val=analogRead(0);//讀取模擬接口0 的值,并將其賦給val
  40. Serial.println(val);//顯示出val 的值 Serial.println(val,DEC);     

  41. DLSerial.write("fetch?"); //發(fā)送字節(jié)數(shù)據(jù)      
  42. delay(500); //延時(shí)500ms   
  43. if (DLSerial.available()>0) //如果緩存中有接收到的數(shù)據(jù)     
  44. {      
  45.     String stringOne = DLSerial.readString(); //讀取軟串口數(shù)據(jù)賦給字符串stringOne      
  46.     Serial.print(stringOne);  //通過(guò)串口發(fā)到PC      
  47. }         
  48.   }
  49. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表