2009-07-21 12 views
8

त्वरित संस्करण:एल्गोरिदम विभिन्न आवृत्तियों के साथ दो संकेतों के बीच प्रभावी "चरण अंतर" निर्धारित करने के लिए?

क्या एल्गोरिथ्म मैं अलग आवृत्तियों के साथ दो वर्ग तरंग संकेतों के बीच "चरण के अंतर" निर्धारित करने के लिए, अगर केवल जानकारी मेरे पास है उस समय जो प्रत्येक बढ़ते किनारे पर है इस्तेमाल कर सकते हैं होता है?

विस्तृत संस्करण:

मैं एक एम्बेडेड सॉफ्टवेयर परियोजना पर काम कर रहा हूँ, और मैं एक दिलचस्प समस्या के पार चला गया है। मैं meshed गियर दो hall-effect speed sensors है, जो प्रत्येक दो में से एक के उद्देश्य से कर रहे हैं से डेटा एकत्र कर रहा हूँ, जैसा कि निम्न चित्र में दिखाया गया है: इस में
Jaime के रूप में बताया, संकेत:

meshed gears and pulse signals http://img291.imageshack.us/img291/4905/gears.png

टिप्पणी आरेख वास्तव में समान आवृत्तियों होगा। असली हार्डवेयर दो लक्ष्य गियर, जिनमें से कुछ meshed दांत के बदले शाफ्ट से जुड़े हुए हैं के बीच कई और अधिक गियरिंग चरण हैं, तो मैं दो वक्त लहरों विभिन्न आवृत्तियों है कि साथ अंत तक कर , और उन दोनों के बीच अनुपात अभी भी एक है लगातार। मैं इस मामले के मांस को पाने के लिए आरेख को सरल बनाना चाहता था, लेकिन ऐसा लगता है कि मैंने इसे बहुत सरल बना दिया!
/टिप्पणी

गति सेंसर उत्पादन एक वर्ग तरंग संकेत जिसकी बारंबारता सीधे एक गियर की घूर्णन गति के लिए आनुपातिक है। स्क्वायर वेव के बढ़ते (और गिरते) किनार तब होते हैं जब एक सिंगल गियर दांत के अग्रणी (और पिछला) किनारे सेंसर द्वारा गुजरते हैं।

मुझे पता है कि कितने दांत प्रत्येक गियर पर हैं, और इस जानकारी के आधार मैं सही ढंग से वर्ग तरंग संकेत की आवृत्ति के आधार पर प्रत्येक गियर के घूर्णन की गति को मापने के लिए सक्षम हूँ।

आवृत्तियों मापने के लिए, मैं एक गति सेंसर एम्बेडेड नियंत्रक पर एक उच्च गति पर कब्जा घड़ी पिन से जुड़े संकेत है। कब्जा टाइमर स्वचालित रूप से, वर्ग तरंग संकेत की बढ़ती किनारों का पता लगाने के उस समय जिस पर संक्रमण होता प्रतिनिधित्व करता एक मूल्य के साथ एक रजिस्टर लोड, और व्यवधान ट्रिगर। प्रत्येक सिग्नल के लिए कैप्चर पॉइंट आरेख पर पीले रंग में इंगित होते हैं।

struct 
{ 
    long previousTime; 
    int frequency; 
} 
sensors[2]; 

void CaptureTimer_Interrupt(int channel, long transitionTime) 
{ 
    long timeDifference = transitionTime - sensors[channel].previousTime; 
    sensors[channel].frequency = CONVERSION_FACTOR/timeDifference; 
    sensors[channel].previousTime = transitionTime; 
} 

मैं चाहते हैं क्या करें:: बाधा सेवा दिनचर्या कुछ इस तरह दिखता

मैं रिश्तेदार इन दोनों वर्ग तरंग के समय में छोटे अंतर का पता लगाने के लिए सक्षम होना चाहते हैं संकेत है। मैं इसे बेहतर अवधि की कमी के लिए "चरण अंतर" कहता हूं। यदि दो संकेतों ठीक उसी आवृत्ति था, इस सरल होगा, और phase difference सही शब्द का उपयोग करने के लिए होगा।

यहां मैं क्या प्राप्त कर रहा हूं: यदि मैं लंबे समय तक दो संकेतों को रिकॉर्ड करना चाहता था, और फिर कृत्रिम रूप से धीमी गति से (या "खिंचाव") एक कारक द्वारा उच्च गति (नीला) संकेत 16/9, यह कम गति (लाल) के संकेत के रूप में ठीक उसी आवृत्ति है, और दो संकेतों, कुछ औसत दर्जे का चरण अंतर होता है यानी एक लाल सिग्नल बाधा और एक नीले संकेत व्यवधान के बीच समय का अंतर है।मैं लंबे समय तक सिग्नल रिकॉर्ड किए बिना इस समय अंतर (या कुछ समकक्ष) की गणना करना चाहता हूं। संसाधन एम्बेडेड नियंत्रक पर सीमित हैं, इसलिए पिछले संक्रमण समय के बड़े सरणी संग्रह करना एक विकल्प नहीं है।

क्या कोई इससे पहले इसमें भाग लेता है? वास्तविक परियोजना में ऐसे कई गियर और सेंसर व्यवस्थाएं हैं, इसलिए मैं एक सुरुचिपूर्ण एल्गोरिदम की तलाश में हूं जिसका मैं पुन: उपयोग कर सकता हूं। अग्रिम में धन्यवाद!

+0

क्योंकि 2 कोग इंटरलॉक किए गए हैं। आप कैसे सुझाव देंगे कि वे 'चरण से बाहर' चला सकते हैं? – Toad

+0

भागों पर तनाव, गियर दांत, छोटे वास्तविक दुनिया के प्रभाव पर पहनते हैं। यह (ज़ाहिर है) एक सरलीकृत उदाहरण है। वास्तविक प्रणाली में दोनों के बीच अन्य गियरिंग चरण हो सकते हैं जिन पर सेंसर लगाए जाते हैं। दांतों के सेट के बीच की सभी छोटी सहनशीलताएं उचित मात्रा में खेल सकती हैं। आप सही हैं कि भौतिक प्रणाली में एक बड़ा टूटने के बिना गियर * चरण से बाहर * * * * प्राप्त नहीं कर सकते हैं। जो मैं मापने की कोशिश कर रहा हूं वह मानक से मामूली भिन्नता है। –

+1

यदि आप एक सिग्नल "खिंचाव" करते हैं, तो आपको मूल (टी = 0) की आवश्यकता होती है। यह मनमाने ढंग से है, लेकिन वह विकल्प आपके चरण अंतर को निर्धारित करेगा। इसलिए, भले ही आप एक "सत्य" चरण अंतर बनाते हैं, फिर भी इसका मूल्य टी = 0 – MSalters

उत्तर

2

समग्र सिग्नल, यानी जब आप लाल और नीले रंग को जोड़ते हैं, तो सिग्नल आपको 16 गुना नीला और 9 गुना लाल सिग्नल होता है। आप प्रत्येक 16 वें नीले और हर 9वीं लाल उगते हुए झुंड के बीच के समय के अंतर को माप सकते हैं।

मुझे लगता है कि आप जो मापना चाहते हैं वह गियर पर पहनना है। मुझे लगता है कि यदि कोई वर्दी कर्षण नहीं है, तो यह माप गियर की सहिष्णुता से प्रभावित हो सकता है (शोर का परिचय)।

0

मुझे लगता है कि करने के लिए सबसे अच्छी बात यह है कि के सभी एक्स-वाई आरेख बनाना होगा दांत जोड़ी समय। आप मनमाने ढंग से प्रत्येक कोग पर एक दांत चुनते हैं जैसे टी = 0 ..

+0

यह वादा करता है, अगर कुछ और नहीं तो एक सुंदर तस्वीर बनायेगी :) – Tom

1

मुझे लगता है कि यह उससे भी आसान है।

हर 16 * 9 नमूने (बड़े कोग का) पहियों ठीक उसी स्थान पर होते हैं जो उन्होंने शुरू किया था।

  • बड़ा कॉग पर एक नमूने के साथ किसी भी समय लेने:

    तो क्या आप निम्न है। छोटे कोग का नमूना लेने से पहले समय की मात्रा को मापें। इस मूल्य को याद रखें।

  • बड़े कोग के प्रत्येक 16 * 9 नमूने (यह ध्वनि संदिग्ध क्यों है?) एक ही माप फिर से करें और इसकी तुलना अपने मूल मूल्य से करें। जब समय बदलना शुरू होता है, तो आपको एक समस्या है।

आर

+0

ओपी प्रश्न पर मेरी टिप्पणियों की चेतावनी के साथ, मुझे लगता है कि प्रत्येक चक्र में माप करने के लिए पर्याप्त नहीं है: यदि शामिल गियर में से एक दांत खो देता है माप के समय काम नहीं कर रहा है, आप कभी ध्यान नहीं देंगे। मुझे लगता है कि आपको ** पूरे ** सिग्नल के बीच कुछ तुलना की आवश्यकता है, जिसे स्थानीय स्केलिंग द्वारा बदला नहीं जाता है, यानी आप नहीं चाहते कि ड्राइव शाफ्ट की तात्कालिक गति भिन्नता आपको झूठा अलार्म दें। मैं इनपुट और आउटपुट के बीच क्रॉस-सहसंबंध की रेखाओं के साथ कुछ प्रयोग करता हूं, जो स्टोरेज बाधाओं के साथ संभवतः असुरक्षित है ... – Jaime

1

मैं कुछ परेशानी अपने हार्डवेयर सेटअप visualizing हो रहा है। और जिस व्यवहार को आप पहचानने की कोशिश कर रहे हैं। एक शाफ्ट फिसल रहा है? दांत पहने हुए?

किसी भी मामले में, मैं स्थिति का एक सिमुलेशन लिखूंगा ताकि मैं कुछ प्राप्त कर सकूं, शायद अतिरंजित, जिसके परिणामस्वरूप एल्गोरिदम का परीक्षण करने के लिए कोई शोर नहीं होता है।

एल्गोरिदम मैं के रूपांतरों होगा परीक्षण होगा निम्नलिखित:

Assign signal with lowest frequency to A 

Time A’s rising edge. => Ta1 

Time the next B rising edge . => Tb1 

Calculate time Tb1 – Ta1 => dT1 

Time next A’s rising edge. => Ta2 

Time the next B rising edge. => Tb2 

Calculate time Tb2 – Ta2 => dT2 

Calculate second order difference dT2 – dT1 => d2T1 

Repeat precious steps to get another second order difference => d2T2 

If sign of d2T1 and d2T2 are different, 

repeat previous steps 

else sign of d2T1 and d2T1 are same 

    calculate third order difference d2T2 – d2T2 => d3T1 

Repeat previous steps to get another 3rd order difference => d3T2 

If d3T2 – d3T1 > max noise 

    Raise alarm 
+0

यह एक अपवित्रता का हकदार है, लेकिन मैंने आज की सीमा को मारा है। मैं 5 घंटे या उससे भी ज्यादा समय तक उभारा होगा। –

+0

... और वहां है। +1 –

2

जब से हम "चरण" के बारे में बात कर रहे हैं, तो यह उचित को मापने के लिए "हरा" जो तब होता है जब दो waveforms प्रत्येक को सुदृढ़ लगता है अन्य।

इस तरह कुछ है, शायद:

void cog_phase_monitor2(int cog, int t) 
{ 
    static int last_a, last_b, last_beat, last_beat_delta = 0;; 
    int beat = 0; 
    if(cog == 1) { 
     if(t - last_b < 1) 
      beat = 1; 
     last_a = t; 
    } 
    if(cog == 2) { 
     if(t - last_a < 1) 
      beat = 1; 
     last_b = t; 
    } 
    if(beat) { 
     printf("**** delta beat %d \n",t-last_beat); 
     if(last_beat_delta) { 
      if(last_beat_delta != t-last_beat) { 
       printf("!!!Warning beat just changed !!!\n"); 
       last_beat_delta = 0; 
      } 
     } else { 
      last_beat_delta = t-last_beat; 
     } 
     last_beat = t; 
    } 

} 

अब हम दो चक्रदन्त, 9 दांत में से एक और 16 दांत से एक है, दोनों प्रति सेकंड

B at 6 msecs 
A at 11 msecs 
B at 12 msecs 
B at 18 msecs 
A at 22 msecs 
B at 24 msecs 
B at 30 msecs 
A at 33 msecs 
B at 36 msecs 
B at 42 msecs 
A at 44 msecs 
B at 48 msecs 
B at 54 msecs 
A at 55 msecs 
B at 60 msecs 
A at 66 msecs 
B at 66 msecs 
**** delta beat 66 
B at 72 msecs 
A at 77 msecs 
B at 78 msecs 
B at 84 msecs 
A at 88 msecs 
B at 90 msecs 
B at 96 msecs 
A at 99 msecs 
B at 102 msecs 
B at 108 msecs 
A at 110 msecs 
B at 114 msecs 
B at 120 msecs 
A at 121 msecs 
B at 126 msecs 
A at 132 msecs 
B at 132 msecs 
**** delta beat 66 
B at 138 msecs 
A at 143 msecs 
B at 144 msecs 
B at 150 msecs 
A at 154 msecs 
B at 156 msecs 
B at 162 msecs 
A at 165 msecs 
B at 168 msecs 
B at 174 msecs 
A at 176 msecs 
B at 180 msecs 
B at 186 msecs 
A at 187 msecs 
B at 192 msecs 
A at 198 msecs 
B at 198 msecs 
**** delta beat 66 
10 revs में मोड़ के अनुकरण में इस प्लग अगर

और अब हम चक्रदन्त से एक के लिए 1 msec की देरी जोड़ने:

B at 6 msecs 
A at 11 msecs 
B at 12 msecs 
B at 18 msecs 
A at 22 msecs 
B at 24 msecs 
B at 30 msecs 
A at 33 msecs 
B at 36 msecs 
B at 42 msecs 
A at 44 msecs 
B at 48 msecs 
B at 54 msecs 
A at 55 msecs 
B at 60 msecs 
A at 66 msecs 
B at 66 msecs 
**** delta beat 66 
B at 72 msecs 
A at 77 msecs 
B at 78 msecs 
B at 84 msecs 
A at 88 msecs 
B at 90 msecs 
B at 96 msecs 
A at 99 msecs 
B delayed at 102 msecs 
B at 103 msecs 
B at 109 msecs 
A at 110 msecs 
B at 115 msecs 
A at 121 msecs 
B at 121 msecs 
**** delta beat 55 
!!!Warning beat just changed !!! 
B at 127 msecs 
A at 132 msecs 
B at 133 msecs 
B at 139 msecs 
A at 143 msecs 
B at 145 msecs 
B at 151 msecs 
A at 154 msecs 
B at 157 msecs 
B at 163 msecs 
A at 165 msecs 
B at 169 msecs 
B at 175 msecs 
A at 176 msecs 
B at 181 msecs 
A at 187 msecs 
B at 187 msecs 
**** delta beat 66 
B at 193 msecs 
A at 198 msecs 
B at 199 msecs 
B at 205 msecs 

यह एक उम्मीद ख की तरह लगता है eginning :-)

0

मैं सॉफ्टवेयर में दो चरण लॉक लूप लागू करता हूं। मान लीजिए गियर ए के क्रांति गियर बी के बी क्रांति के अनुरूप है। ए और बी एम: = एलसीएम (ए, बी) के कम से कम सामान्य बहुमत की गणना करें। गियर बी के साथ चरण लॉक पीएलएलए (एम/ए के कारक के साथ) और पीएलएलबी गियर बी के साथ (एम/बी के कारक के साथ)। फिर दोनों पीएलएल में एक ही आवृत्ति होनी चाहिए। नतीजतन चरण अंतर का पता लगाना आसान होना चाहिए। चूंकि आपके पास नियंत्रक है, इसलिए आप केवल दो चरण लॉक सिग्नल के संकल्प की गणना करते हैं। अधिकतम संकल्प समारोह तब आपको चरण अंतर बताता है।

संबंधित मुद्दे