पीडब्लूएम का उपयोग करके साइन सिग्नल जेनरेशन


16

हम MC68HC908GP32 माइक्रोकंट्रोलर का उपयोग करके ठीक से साइन सिग्नल उत्पन्न करने में असमर्थ हैं । PWM विवरण पृष्ठ 349 में शुरू होता है। घड़ी की आवृत्ति 2.4MHz है, जबकि हमने 7 kHz PWM का उपयोग प्रीस्कूलर का उपयोग करके और टाइमर मोड्यूलो को 350 के रूप में निम्न प्रकार से किया है:

T1SC = 0x60;    // Prescaler: Div entre 64
//Counter modulo = 0x015E = 350
T1MODH = 0x01;   // High
T1MODL = 0x5E;   // Low

PWM आउटपुट को निम्नलिखित RLC फ़िल्टर द्वारा फ़िल्टर किया जाता है, और फिर DC को एक श्रृंखला 1uF कैप का उपयोग करके हटा दिया जाता है। कटऑफ की आवृत्ति PWM के 7kHz से नीचे है।

यहाँ छवि विवरण दर्ज करें

सबसे पहले, हमने एक LUT का उपयोग करने की कोशिश की है, जो इस साइट (100 नमूने, आयाम = 250) का उपयोग करके नमूने उत्पन्न किए गए थे। इसमें एकल अवधि शामिल है।

 int seno[100]={ 125, 133, 141, 148, 156, 164, 171, 178, 185, 192, 198, 205, 211, 216, 221, 226, 231, 235, 238, 241, 244, 246, 248, 249, 250, 250, 250, 249, 248, 246, 244, 241, 238, 235, 231, 226, 221, 216, 211, 205, 198, 192, 185, 178, 171, 164, 156, 148, 141, 133, 125, 117, 109, 102, 94, 86, 79, 72, 65, 58, 52, 45, 39, 34, 29, 24, 19, 15, 12, 9, 6, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 12, 15, 19, 24, 29, 34, 39, 45, 52, 58, 65, 72, 79, 86, 94, 102, 109, 117}; 

निम्नलिखित पल्स की चौड़ाई प्रत्येक PWM चक्र की गणना की जाती है:

interrupt 4 void rsi_t1ch0 (void)
{
    //-- disable interruption flag
    T1SC0&=(~0x80);
    //-- pwm to '0' 
    PTB&=0xFD;

    //some sensor measures are done here.... 100 out of the 350 cycles are left for this                
}
/************************************************************/
/* TIM1 overflow rutine                                     */
/************************************************************/
interrupt 6 void rsi_ov1 (void)
{

    T1SC&=(~0x80);
    //-- set PWM to 1
    PTB|=0x02;
    T1CH0H = ((seno[fase])>>8);   // high bits
    T1CH0L = (seno[fase])&0xFF;   // low bits
    fase+=1;
    if (fase >= 99)
      fase=0;
}

void main(void)
{
float temp;
    int i;

    CONFIG1|=0x01;  
    DDRB=0xFF;      //-- Port B is set as output
    PTB=0x00;       
    //Timer setup
    T1SC = 0x60;    // Prescaler: Div by 64  
    T1MODH = 0x01;   //Counter modulo
    T1MODL = 0x5E;  
    T1SC0 = 0x50;  //Comparator setup
    //-- Initial width
    T1CH0H = 0x00;
    T1CH0L = 0x53;

    EnableInterrupts;
    T1SC&=~(0x20); //Run timer forever
    for(;;);   
}

जब इसे कार्यक्षेत्र में प्लग किया जाता है, तो हमें निम्नलिखित संकेत मिलते हैं। हम न्यूनतम के पास उस अजीब चोटी से बचने में असमर्थ हैं।

यहाँ छवि विवरण दर्ज करें

उस शिखर के चारों ओर ज़ूम करते समय, हम देख सकते हैं कि PWM आउटपुट (अप) वास्तव में कैसे गलत है।

यहाँ छवि विवरण दर्ज करें

इसलिए, थोड़ी देर के लिए गड़बड़ करने और इसे से छुटकारा पाने में असमर्थ होने के बाद, हमने प्रत्येक नमूने के लिए हार्ड कोडिंग के बजाय MCU में साइन सिग्नल की गणना करने की कोशिश की है। हमने सभी काउंटर सेटअप से पहले मुख्य फ़ंक्शन में निम्नलिखित कोड जोड़ा है:

 for(i=0;i<99;i++) {
     temp=100*(sin(2*3.14159*i/100)+1);
     seno[i]=(int)temp;
 }

लेकिन परिणाम भी एक sinusoid की तरह नहीं लगते हैं:

यहाँ छवि विवरण दर्ज करें

इसके साथ घंटों संघर्ष करने के बाद, हम अपनी गलती का पता नहीं लगा पाए हैं। हम सलाह के एक टुकड़े की सराहना करेंगे।


क्या आप PWM मानों की पूरी सूची पोस्ट कर सकते हैं?
pjc50

@ pjc50 यहां यह है: pastebin.com/sNyA0Hki । आपका बहुत बहुत धन्यवाद।
सर्ग

"1" के साथ बीच में सभी "0" मानों को बदलने का प्रयास करें; मुझे संदेह है कि 0 आपको कम सिग्नल के बजाय वह व्यापक उच्च संकेत देता है जो आप चाहते हैं।
pjc50

@ सर्ज - कृपया डेटा को इनलाइन करें। पेस्ट दूर जा सकता है और प्रश्न के एक भाग को ढीला करना बुरा होगा। लेकिन कृपया इसे प्रारूपित करें ताकि यह उस स्थान का उपयोग न करे। धन्यवाद।
ट्राईवेग लॉस्टस्टोएल

यह स्पष्ट रूप से फ़िल्टर नहीं है - सौभाग्य - ऐसा लगता है कि आपकी तालिका दूषित हो रही है या आप इसे करने के लिए अपना सूचक खो देते हैं।
एंडी उर्फ

जवाबों:


16

माइक्रोकंट्रोलर डेटाशीट के पृष्ठ 350 के निचले भाग में, यह उल्लेख करता है कि अतिप्रवाह के दौरान टाइमर मान रजिस्टर में एक छोटे से मान लिखने से अगली रुकावट अगले pwm पुनरावृत्ति पर ही शुरू हो सकती है, क्योंकि टाइमर की गिनती जारी है, जबकि इंटरप्ट रूटीन को अंजाम दिया जा रहा है।

पल्स चौड़ाई मान को बदलने के लिए टीआईएम चैनल रजिस्टर करने के लिए एक असंबद्ध लेखन दो PWM अवधि के लिए गलत संचालन का कारण बन सकता है। उदाहरण के लिए, काउंटर से पहले एक नया मान लिखना पुराने मूल्य तक पहुँचता है लेकिन काउंटर के नए मूल्य तक पहुँचने के बाद उस PWM अवधि के दौरान किसी भी तुलना को रोकता है। इसके अलावा, एक नया, छोटे पल्स चौड़ाई मान लिखने के लिए TIM अतिप्रवाह अवरोधन दिनचर्या का उपयोग करने से तुलना मिस होने का कारण हो सकता है। TIM लिखे जाने से पहले नया मान पास कर सकता है।

यह इस तथ्य से पुष्ट होता है कि pwm मान को एक पूरे pwm घड़ी की अवधि के लिए उच्च स्तर पर रखा गया है + जो टाइमर की लंबाई (आसपास की लंबाई के आधार पर) जैसा दिखता है। टाइमर लंबाई रजिस्टर के लिए लिखा जा रहा है मान शायद त्रुटि के समय 0 के करीब है, इसलिए यह काफी व्यवहार्य है कि काउंटर ने अवरोध के दौरान छोटे मूल्य को पारित किया है, और केवल निम्नलिखित चक्र पर ट्रिगर होगा।

यह ISR को निष्पादित करने, या नए स्तर पर सेट किए गए तंत्र को बदलने में लगने वाले समय की तुलना में उच्च स्तर तक साइनसॉइड न्यूनतम स्तर को बढ़ाकर तय किया जा सकता है। पृष्ठ 351 का शीर्ष विवरण यह कैसे किया जा सकता है।


1
मुझे नहीं पता कि डेटाशीट पढ़ते समय मैं इसे कैसे छोड़ सकता हूं। धन्यवाद!
सर्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.