Problem bei 2 aktiven PWM-Kanälen

Gast #704593
Lesenswert?
• ▲
▼
Hallo.
Ich habe folgendes Problem. Ich benutze 2 PWM-Kanäle. Mit einem wird ein 
Motor betrieben mit dem andren erfolgt eine Sinusausgabe. Sobald beide 
Kanäle aktiv sind halbiert sich die Sinusfrequenz. Wenn aber nur der 
Sinus-PWM-Kanal läuft, ist die Sinusfrequenz OK. Hier der Quellcode:

in main:
1
 
2
PWM_Init(MOTOR_PWM);
3
PWM_Init(SINE_PWM);

in PWM.c :
1
void PWM_Init(unsigned int channel)
2
{   
3
    // Enable Periphal clock in PMC for PWMC
4
    AT91F_PWMC_CfgPMC();
5
    
6
    // Configure PIO controllers to drive PWM signals
7
    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,          
8
                     ((unsigned int) AT91C_PA0_PWM0) |  
9
                     ((unsigned int) AT91C_PA1_PWM1) |      
10
                     ((unsigned int) AT91C_PA2_PWM2),  
11
         ((unsigned int) AT91C_PA7_PWM3));   
12
    switch (channel)
13
    {
14
     // Motor PWM
15
     case 0:  // Stop PWM Channel 0
16
     AT91F_PWMC_StopChannel(AT91C_BASE_PWMC, AT91C_PWMC_CHID0);
17
     AT91C_BASE_PWMC_CH0->PWMC_CMR = MCKtoPWM | CPD_OFF | CPOL_ON | CALG_ON;
18

19
     // setup the period registers
20
     AT91C_BASE_PWMC_CH0->PWMC_CPRDR = P_MOTOR;
21

22
     // setup the duty cycle registers (first value)
23
     AT91C_BASE_PWMC_CH0->PWMC_CDTYR = P_MOTOR/3;
24

25
     //enable PWM channel 0
26
     AT91F_PWMC_StartChannel( AT91C_BASE_PWMC, AT91C_PWMC_CHID0);
27
     break;
28
  
29
     // PWM Faraday Modulator (sine wave)
30
     case 1: // Stop PWM Channel 1
31
     AT91F_PWMC_StopChannel(AT91C_BASE_PWMC, AT91C_PWMC_CHID1);
32
      
33
     // setup sine wave
34
     //PWM_InitSinewave();
35

36
     // setup the channel mode registers
37
     AT91C_BASE_PWMC_CH1->PWMC_CMR = MCKtoPWM | CPD_OFF | CPOL_ON | CALG_ON;
38

39
     // setup the period registers
40
     AT91C_BASE_PWMC_CH1->PWMC_CPRDR = EXT_OSC / SINE.PWMFREQ1 / 2;
41

42
     // setup the duty cycle registers (first value)
43
     AT91C_BASE_PWMC_CH1->PWMC_CDTYR = EXT_OSC / SINE.PWMFREQ1 / 4;
44

45
     // Prevent any bad state of this register: Read it clear all set bit
46
     AT91C_BASE_PWMC->PWMC_ISR;
47

48
     AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
49
                           AT91C_ID_PWMC,
50
                           AT91C_AIC_PRIOR_HIGHEST,
51
                           AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
52
                           PWM_Interrupt);
53
   
54
     AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PWMC);  
55
     //enable PWM channel 1
56
     AT91F_PWMC_StartChannel( AT91C_BASE_PWMC, AT91C_PWMC_CHID1 );
57
    
58
     AT91F_PWMC_InterruptEnable(AT91C_BASE_PWMC,AT91C_PWMC_CHID1);
59
     break;
60
    }
61
}

Wo könnte das Problem liegen? Wie gesagt wenn nur der Sinuskanal aktiv 
ist ist die Sinusfrequenz richtig.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren