mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91sam7s256 dynamic PWM


Autor: Matze Müller (Firma: Student Informatik) (maze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an die Experten,

ich möchte ein dynamisches pwm signal erzeugen was schon funktioniert 
aber mein Problem ist das ich auch sagen möchte ob es positive ist oder 
negative in laufe der zeit ist. Ich habe dazu ein Interrupt routine
PWM_hander();
die Periodenzeit und die Cycletime updated, aber wenn ich sagen will das 
signal soll jetzt positive oder negative sein wird dies nicht 
aktualisiert??
mein Programm sieht so aus:
void PWM_init( void )
{
    unsigned int Tmp;
    
    g_PeriodTime                   = DEFAULT_PERIOD;
    g_ListOfDutyCycles[0]          = DEFAULT_PULSE;
    g_NRofDefPulse                 = DEFAULT_NR_OF_DEF_PULSE;
    g_CountNextPulseNR             = 0;

    // Enable User Reset and set its minimal assertion to 960 us
    //   AT91C_RSTC_URSTIEN ==  AT91C_SYSC_URSTIEN
    //AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTIEN | (0x4<<8) | (unsigned int)(0xA5<<24);


    // First, enable the clock of the PIO
    //AT91C_ID_PIOA   ((unsigned int)  2) // Parallel IO Controller
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

    // then, we configure the PIO Lines corresponding to LED1 to LED4
    // to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.
    ////////////////////////////////////////////////AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;

    // Clear the output (LEDs on)
    ////////////////////////////////////////////////AT91F_PIO_SetOutput( AT91C_BASE_PIOA, 0 ) ;

    // now initializes PWM

    // Enabling a PWM output through the PIO, peripheral A, PA0
    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA0_PWM0, 0);

    // Configure PMC by enabling PWM clock
    AT91F_PWMC_CfgPMC ();//LED1 on
    AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);

    // Set the Clock A divider
    AT91C_BASE_PWMC->PWMC_MR = (( PWM_SCALER << 8 ) | PWM0_DIVIDER);

    // Set the Clock
    //         - divider clock A
    //         - CALG=0 Left aligned
    //         - CPOL=1 sart at High level (0 inverse output)
    //         - CPD=0 update the dute cycle
    AT91C_BASE_PWMC_CH0->PWMC_CMR = AT91C_PWMC_CPRE_MCKA | CPD_OFF | CPOL_ON | CALG_OFF ; //LED1 Aus???

    // Set the Period register (sample size bit fied )
    AT91C_BASE_PWMC_CH0->PWMC_CPRDR = g_PeriodTime;//Period;
    // Set the duty cycle register (output value)
    AT91C_BASE_PWMC_CH0->PWMC_CDTYR = g_ListOfDutyCycles[0];//Pulse0;
    // Initialise the Update register write only
    AT91C_BASE_PWMC_CH0->PWMC_CUPDR = DEFAULT_NEXT_PULSE;//Pulse1;


    // Now start the PWM channel
    AT91F_PWMC_StartChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);//LED1 Blinking


    /* Open PWM interrupt*/
    //AT91SAM64.h neue definitions schreibweise
//    #define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type
//    #define   AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE  ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label Level Sensitive
    
    /*AT91SAM256.h neue definitions schreibweise*/
//    #define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type
//    #define   AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive
    AT91F_AIC_ConfigureIt( AT91C_BASE_AIC,
                          AT91C_ID_PWMC, 
                          PWM_INTERRUPT_LEVEL,
                          AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 
                          PWM_handler);   
    
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PWMC);

    // Enable IRQ
    AT91F_PWMC_InterruptEnable(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);
    Tmp = AT91C_BASE_PWMC->PWMC_ISR;
    Tmp = Tmp;
}
void PWM_handler(void)
{
  unsigned int Tmp;
  // Hand check the interrupt
  Tmp = AT91C_BASE_PWMC->PWMC_ISR;
  Tmp = Tmp;

   //Initialise the Update register write only
  if(g_ListOfDutyCycles[ g_CountNextPulseNR]!=0)
  {
    if(g_CountNextPulseNR<g_NRofDefPulse)// aktuelle periode < anzahl der perioden
    {
  
          AT91C_BASE_PWMC_CH0->PWMC_CUPDR =g_ListOfDutyCycles[ g_CountNextPulseNR++ ];
          
          if(g_CountNextPulseNR >= g_NRofDefPulse)// Counter overflow set back 
             g_CountNextPulseNR=0;
    }
    else
    {
        g_CountNextPulseNR=0;//rücksetzten des counters
    }
  }
          
  // Set the Period register (sample size bit fied )
  AT91C_BASE_PWMC_CH0->PWMC_CPRDR =g_PeriodTime;

  irqCntr++;
  
}

void PWM_pos(){
        AT91C_BASE_PWMC_CH0->PWMC_CMR = AT91C_PWMC_CPRE_MCKA | CPD_OFF| CPOL_ON| CALG_OFF;
}
void PWM_neg(){
        AT91C_BASE_PWMC_CH0->PWMC_CMR = AT91C_PWMC_CPRE_MCKA | CPD_OFF| CPOL_OFF| CALG_OFF;
}
PWM_pos()und  PWM_neg()
haben leider keine aus wirkung auf das pwm signal wis jemand warum??

auch wenn ich das singnal vorher anhalte in PWM_neg oder PWM_pos, mit
 AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);

 AT91F_PWMC_StartChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);
hat das keine auswirkungen!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.