त्वरित संस्करण:एल्गोरिदम विभिन्न आवृत्तियों के साथ दो संकेतों के बीच प्रभावी "चरण अंतर" निर्धारित करने के लिए?
क्या एल्गोरिथ्म मैं अलग आवृत्तियों के साथ दो वर्ग तरंग संकेतों के बीच "चरण के अंतर" निर्धारित करने के लिए, अगर केवल जानकारी मेरे पास है उस समय जो प्रत्येक बढ़ते किनारे पर है इस्तेमाल कर सकते हैं होता है?
विस्तृत संस्करण:
मैं एक एम्बेडेड सॉफ्टवेयर परियोजना पर काम कर रहा हूँ, और मैं एक दिलचस्प समस्या के पार चला गया है। मैं 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, यह कम गति (लाल) के संकेत के रूप में ठीक उसी आवृत्ति है, और दो संकेतों, कुछ औसत दर्जे का चरण अंतर होता है यानी एक लाल सिग्नल बाधा और एक नीले संकेत व्यवधान के बीच समय का अंतर है।मैं लंबे समय तक सिग्नल रिकॉर्ड किए बिना इस समय अंतर (या कुछ समकक्ष) की गणना करना चाहता हूं। संसाधन एम्बेडेड नियंत्रक पर सीमित हैं, इसलिए पिछले संक्रमण समय के बड़े सरणी संग्रह करना एक विकल्प नहीं है।
क्या कोई इससे पहले इसमें भाग लेता है? वास्तविक परियोजना में ऐसे कई गियर और सेंसर व्यवस्थाएं हैं, इसलिए मैं एक सुरुचिपूर्ण एल्गोरिदम की तलाश में हूं जिसका मैं पुन: उपयोग कर सकता हूं। अग्रिम में धन्यवाद!
क्योंकि 2 कोग इंटरलॉक किए गए हैं। आप कैसे सुझाव देंगे कि वे 'चरण से बाहर' चला सकते हैं? – Toad
भागों पर तनाव, गियर दांत, छोटे वास्तविक दुनिया के प्रभाव पर पहनते हैं। यह (ज़ाहिर है) एक सरलीकृत उदाहरण है। वास्तविक प्रणाली में दोनों के बीच अन्य गियरिंग चरण हो सकते हैं जिन पर सेंसर लगाए जाते हैं। दांतों के सेट के बीच की सभी छोटी सहनशीलताएं उचित मात्रा में खेल सकती हैं। आप सही हैं कि भौतिक प्रणाली में एक बड़ा टूटने के बिना गियर * चरण से बाहर * * * * प्राप्त नहीं कर सकते हैं। जो मैं मापने की कोशिश कर रहा हूं वह मानक से मामूली भिन्नता है। –
यदि आप एक सिग्नल "खिंचाव" करते हैं, तो आपको मूल (टी = 0) की आवश्यकता होती है। यह मनमाने ढंग से है, लेकिन वह विकल्प आपके चरण अंतर को निर्धारित करेगा। इसलिए, भले ही आप एक "सत्य" चरण अंतर बनाते हैं, फिर भी इसका मूल्य टी = 0 – MSalters