Forum: Mikrocontroller und Digitale Elektronik Problem bei 2 aktiven PWM-Kanälen


von Max (Gast)


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.

von Max (Gast)


Lesenswert?

verwende den AT91SAM7S

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.