اطلاعیه

Collapse
No announcement yet.

pwm with interrupt not work

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    pwm with interrupt not work

    سلام به همگی ،
    امیدوارم اوقات خوبی داشته باشید. :nice:
    دوستان من مدت هاست که روی یک پروژه با میکرو dspic33ep256mu806 در حال کار هستم . هدف برنامه تولید پالس های pwm در خروجی است .
    در برنامه من pwm generator 1 برای تولید پالس در خروجی مقدار دهی شده است . همچنین اینتراپت مستقلی که در این میکروکنترلر برای هر pwm generator در نظر گرفته شده است را برای فاز 1 هم فعال کردم . پالس های pwm خروجی ظاهر میشوند اما مشکلی که هست اینه که اینتراپت ایجاد نمیشود . هر جایی را بگید گشتم از منابع روی سایت میکروچیپ تا انجمن سایت میکروچیپ .
    من اینتراپت Special event interrupt که برای تمام pwm generator ها به صورت مشترک میباشد را به راحتی راه اندازی کردم و جواب گرفتم . اما من نیاز دارم برای هر pwm generator یک اینتراپت داشته باشم. به همین خاطر به سراغ اینتراپت های مستقلی که برای هر pwm generator در نظر گرفته شده رفتم . ممنون میشم راهنمایی کنید.

    کد:
    /////////GLOBAL defined
    #define test_periode  364           // Diagnostic frequency = 3 KHz
    #define test_duty   160
    #define test_sev    155
    #define work_periode  54687        // Work frequency = 20 Hz
    #define work_duty   4000
    #define work_sev    16770
         
    ///////GLOBAL FUNCTION////////////////////
    void power_up_pwm(void);
    void IER_1 (void);
    void ADC_initial (void);
    /////
    static unsigned int ADCValues_1[4] = {0, 0, 0, 0};
    static char value[8] ;
    
    //////// ISR //////////////////////////////
    
    void pwm_1() iv IVT_ADDR_PWM1INTERRUPT ics ICS_AUTO {
       while( !AD1CON1bits.DONE );
       AD1CON1bits.DONE=0;
       ADCValues_1[1] = ADC1BUF0;   // Read the AN0 conversion result
    
       IntToStr( ADCValues_1[1], value);
    
       IFS5bits.PWM1IF=0;
       return;
    }
    
    ///////MAIN FUNCTION/////////////////////
    void main()
    {
    ////////OSCILLATOR CONFIGURATION  Fosc=70 MHz
           CLKDIV.DOZE_0=0;
           CLKDIV.DOZE_1=0;
           CLKDIV.DOZE_2=0;
    
           CLKDIV.PLLPRE_0=0;    //0+2
           CLKDIV.PLLPRE_1=0;
           CLKDIV.PLLPRE_2=0;
           CLKDIV.PLLPRE_3=0;
           CLKDIV.PLLPRE_4=0;
    
           CLKDIV.PLLPOST_0=1;   //2(1+1)
           CLKDIV.PLLPOST_1=0;
    
           PLLFBD=0x0044;      //68+2 
    
    /////////PIN CONFIGURATION
           RPINR12 = 0x7677; // fault inputs
           RPINR18 = 0x0047; // uart1 receive
           RPOR3 = 0x0001;   // uart1 tx
    ////////
           ANSELB=0x01df;
           ANSELC=0x0000;
           ANSELD=0x0000;
           ANSELE=0x0000;
           ANSELG=0x0000;
    ////////
           TRISB=0xf9df;
           TRISC=0x1000;
           TRISD=0x0088;
           TRISE=0x0000;
           TRISF.B1=0;
           TRISG.B8=0;
           TRISG.B9=0;
    ///////// pwm configuration
           UART1_Init(115200);
           ADC_initial ();
           IER_1 ();
           power_up_pwm();
           while(1){
                UART1_Write(13);
                UART1_Write_Text("phase_1:");
                UART1_Write_Text(value);
           }
    
    }
    
    void power_up_pwm(void){
           SPHASE1 = test_periode;
           /* Set Duty Cycles */
           SDC1 = test_duty;
           /* Set Dead Time Values */
           DTR1 = DTR2 = DTR3 = 0;
           ALTDTR1 = ALTDTR2 = ALTDTR3 = 0;
           /* Set PWM Mode to Independent */
           IOCON1 = IOCON2 = IOCON3 = 0x4C00;
           /* PHASEx/SPHASEx registers provide time base period for this
             PWM generator,Edge-Aligned Mode and independent Duty Cycles , enable trigger for interrupt */
           PWMCON1 = PWMCON2 = PWMCON3 = 0x0601;
           /* Configure Faults */
           FCLCON1 = FCLCON2 = FCLCON3 = 0x0003;
           /* 64:1 Prescaler */
           PTCON2 = 6;
           /* ADC Special Event Trigger Configuration */
           TRIG1 = test_sev;                    /* Event Trigger value */
           TRGCON1bits.TRGDIV = 0;           /* Event Trigger output postscaler set to 1:1 selection */
           TRGCON1bits.TRGSTRT =0;
           /* Enable PWM Module , event interrupt is enabled */
           PTCON = 0x8400;
    }
    
    void IER_1 (void){
       /* Enable level 1-7 interrupts */
       INTCON2bits.GIE=1;
       /* Interrupt nesting enabled here */
       INTCON1bits.NSTDIS = 0;
       /* Set PWM1 Event Match interrupt priority*/
       IPC23bits.PWM1IP=7;
       /* Reset PWM1 Event Match interrupt flag */
       IFS5bits.PWM1IF=0;
       /* Enable PWM1 Event Match interrupt */
       IEC5bits.PWM1IE=1;
       return;
    }
    
    void ADC_initial (void){
            AD1CON1 = 0x0010;   	// PWM Generator 1 primary trigger compare ends sampling and starts
            AD1CON2 = 0x0000;
            AD1CON3 = 0x008B;
            AD1CON4 = 0x0000;
            AD1CHS0 = 0x0000;   	// select AN0 for convert
            AD1CHS123 = 0x0000;
            AD1CSSH = 0x0000;
            AD1CSSL = 0x0000;
            AD1CON1bits.ADON = 1;    // Turn on the A/D converter
            Delay_us(10);
    
    }
    هر وقت خواستید کاری بکنید، چهل سال عقب و چهل سال جلو را در نظر بگیرید. "بابابزرگ"
لطفا صبر کنید...
X