mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM an PIC18Fxx3x


Autor: Marco Schulze (sharkman)
Datum:

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

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.