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 (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 | }
|