Forum: Mikrocontroller und Digitale Elektronik PWM an PIC18Fxx3x


von Marco S. (sharkman)


Lesenswert?

Hi.

Ich habe einen PIC18F2431 und möchte diesen verwenden um einen 
dreiphasigen BLDC Motor anzusteuern. Das Problem ist, dass ich die PWM 
einfach nicht ans laufen bringe und mittlerweile glaube ich schon zu 
lange auf den Programmcode starre, als das ich da den Fehler finde. Er 
konfiguriert die Pins so wie er soll und schaltet auch zwei Kanäle immer 
komplementär. Allerdings macht er das genau ein mal. Also das heißt er 
setzt sie am Anfang so und das wars dann.

Wäre schön wenn vielleicht mal jemand über den Code schauen könnte, weil 
ich langsam an der Nummer hier verzweifle. Ich möchte erstmal einfach 
nur die PWM auf allen sechs Kanälen laufen haben.
1
   1.  #include <delays.h>
2
   2. #include <p18f2431.h>
3
   3. #include <fuse_p18f2431.h>
4
   4. #include <init.h>
5
   5. #include <timers.h>
6
   6.  
7
   7. #pragma config OSC = HSPLL //enable hspll mode
8
   8. #pragma config FCMEN = OFF
9
   9. #pragma config IESO = OFF        //internal switch over disabled
10
  10. #pragma config PWRTEN = OFF
11
  11. #pragma config BOREN = OFF
12
  12. #pragma config WDTEN = OFF
13
  13. #pragma config WINEN = OFF
14
  14. #pragma config MCLRE = ON
15
  15. #pragma config LVP = OFF
16
  16. #pragma config DEBUG = ON
17
  17. #pragma config PWMPIN = OFF
18
  18. #pragma config HPOL = HIGH
19
  19. #pragma config LPOL = HIGH
20
  20.  
21
  21.  
22
  22. const unsigned char pos[6] = {0b00100100, 0b00100001, 0b00001001, 0b00011000, 0b00010010, 0b00000110};
23
  23. const unsigned char overdrive[3] = {0b11000011, 0b11110000, 0b00111100};
24
  24. volatile unsigned char InteruptDelay = 0;
25
  25. volatile unsigned char POS = 0;
26
  26. volatile unsigned char Channel = 0;
27
  27.  
28
  28. void Manuell(unsigned char *DelayLoop);
29
  29. void low_isr( void );
30
  30. void high_isr( void );
31
  31. void interrupt(void);
32
  32. void statusLED(void);
33
  33. void pwmConfig2(void);
34
  34.  
35
  35. #pragma code high_vector=0x08
36
  36. void interrupt_at_high_vector( void )
37
  37. {
38
  38.   _asm GOTO high_isr _endasm
39
  39. }
40
  40. #pragma code
41
  41. //
42
  42. #pragma interrupt high_isr
43
  43. void high_isr(void)
44
  44. {
45
  45.     if(    PIR3bits.PTIF == 1){
46
  46.         PIR3bits.PTIF = 0;
47
  47.     }
48
  48.  
49
  49.     if(    INTCONbits.TMR0IF == 1){
50
  50.         WriteTimer0(63536);
51
  51.         INTCONbits.TMR0IF = 0;
52
  52.     }
53
  53. }
54
  54.  
55
  55. void pwmConfig2(){
56
  56.     unsigned char dutyL, dutyH;
57
  57.     dutyL = 0xFF;
58
  58.     dutyH = 0x7F;
59
  59.  
60
  60.     PTCON0 = 0x00;    //<7:4> PWM Time BaseOutput Postscale Select Bits => 1:1
61
  61.                     //<3:2> PWM Time Base Input Clock Prescale Select Bits => 1:1
62
  62.                     //<1:0>    PWM Time Base Mode Select => Free Running
63
  63.     PTCON1bits.PTEN = 1;    //PWM Time Base Timer Enable
64
  64.     PTCON1bits.PTDIR = 0;    //PWM Time Base Count Direction => Up
65
  65.     PWMCON0 = 0x50;    //<6:4> PWM Module Enable => All channels enable
66
  66.                     //<3:0> PWM Output Pair Mode => Complementary
67
  67.     PWMCON1 = 0x01;    //<7:4>    PWM Special Event Trigger Output Scale Select => 1:1
68
  68.                     //<3>    Special Event Trigger Time Base Direction => Counting Upwards
69
  69.                     //<1>    PWM Update disable Bit => enable
70
  70.                     //<0>    PWM Output Synchronization => OVDCON register Override is asynchronous
71
  71.     PTPERH = 0x03;    //PWM Frequenzy 9,8kHz @ 40MHz    12Bit resolution
72
  72.     PTPERL = 0xFF;
73
  73.  
74
  74.     PDC0H = dutyH;        //Set duty cycle
75
  75.     PDC0L = dutyL;
76
  76.     PDC1H = dutyH;
77
  77.     PDC1L = dutyL;    
78
  78.     PDC2H = dutyH;
79
  79.     PDC2L = dutyL;
80
  80.     
81
  81.     OVDCOND = 0xFF;        //PWM Output Override => Controlled by Duty Cycle and PWM Time Base
82
  82.     FLTCONFIG = 0x80;      //Disable Fault Condition
83
  83. } 
84
  84. void interrupt(void)
85
  85. {
86
  86.     INTCONbits.GIE = 1;        //enables all global interrupts    
87
  87.     INTCONbits.PEIE = 1;        //enables all global interrupts    
88
  88.     RCONbits.IPEN = 1;
89
  89.  
90
  90.     OpenTimer0(    T0_16BIT    &
91
  91.                 T0_SOURCE_INT    &
92
  92.                 T0_PS_1_1 &
93
  93.                 TIMER_INT_ON    );
94
  94.     WriteTimer0(63536);
95
  95.     INTCONbits.TMR0IE = 1;
96
  96.     INTCONbits.TMR0IF = 0;
97
  97.     INTCON2bits.TMR0IP = 1;
98
  98. }
99
  99.  
100
 100. void statusLED(void)
101
 101. {
102
 102.     TRISC = 0x02;
103
 103.     LATCbits.LATC0 = 1;
104
 104.     PORTB = 0x00;
105
 105.     TRISB = 0x00;
106
 106. }
107
 107.  
108
 108.  
109
 109. void main(void)
110
 110. {
111
 111.     statusLED();
112
 112.     pwmConfig2();
113
 113.     interrupt();
114
 114.  
115
 115.  
116
 116.  
117
 117.     while(1)
118
 118.     {
119
 119.     
120
 120.     }
121
 121. }

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.