mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Frequenz um 1/4 kleiner als berechnet


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jochen D. (gaiusbonus)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

bisher bin ich hier nur lesend aktiv gewesen, aber jetzt komm ich 
endlich dazu aktiv zu programmieren und damit die Fragen und Probleme...

Hardware:
Pololu P-Star 25K50 Micro
Microchip PIC18F25K50
Internally clocked at 48 MHz, resulting in execution speeds up to 12 
million instructions per second (MIPS)
Precision 16 MHz crystal

Software:
MPLAB X IDE v4.01
XC8 v4.44

Ich habe das Problem, dass meine PWM Frequenz um 1/4 kleiner ist als 
berechnet.

Der Code:
void initPwm()
{
    /*
     * PWM resolution is 10 bits
     * don't use last 2 less significant bits CCPxCON,
     * so only CCPRxL have to be touched to change duty cycle
     */
    
    //Turn off CCP1 pin by setting TRISC bit HIGH
    TRISC2 = 1;
                
    // Postscaler = 0, Timer2 off, Prescaler = 4
    //T2CON = 0b00000000; // prescaler 1
    T2CON = 0b00000001; // prescaler 4
    //T2CON = 0b00000010; // prescaler 16
        
    //Clear Timer2
    TMR2 = 0x00;
        
    //Set up Period and Duty Cycle
    //PR2 = 0b01111100; //Load a Period Value 0b01111100 = 8kHz (124)
    PR2 = 0b01111100;
    
    //todo (set 0 here)
    //todo 50%
    CCPR1L = 0b00111110; //Load a Duty Cycle Value (0 = off)
        
    //Configure CCP module for PWM
    CCP1CON = 0b00001100;
        
    //Turn CCP1 pin back on (make it an output)
    TRISC2 = 0;
        
    //Start the PWM by turning on Timer2
    TMR2ON = 1;
}

Berechnet habe ich ein 8kHz Signal, messen tu ich an meinem analogen 
Oszi knapp 6kHz.
Und wo ich so schreibe, kann ich genau das nicht reproduzieren...
Jetzt messe ich bei gleichem Code 25kHz.

Ich vermute, dass das irgendwie mit der Quarzfrequenz zu tun hat.
8kHz wäre bei 16MHz (der ist verbaut)
6kHz bei 12MHz ([...]resulting in execution speeds up to 12 million 
instructions per second (MIPS)
25kHz bei 48MHz (Internally clocked at 48 MHz)

Eventuell habe ich gestern, als es spät war, irgendwelche Einstellungen 
probiert, die die Quelle für die Berechnung verändern?

Wo und was ich da überhaupt kann, hab ich noch keine Ahnung.

Irgendwer ne Idee?

Gruß vom Deister

von Miss Ratgeber (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Wenn du die Mechanik mit du da hantierst nicht ueberblicken
kannst: Fang halt kleiner an.

Z.B. in Assembler eine Warteschleife die ein Pin toggelt.
Das ganze vorher mit dem Simulator testen.

Und: Schaff dir vertrauenswuerdige Messtechnk an.

von Jochen D. (gaiusbonus)


Bewertung
0 lesenswert
nicht lesenswert
Miss Ratgeber schrieb:
> Und: Schaff dir vertrauenswuerdige Messtechnk an.

Was ist vertrauenswürdiger als ein simples Oszi??

Ich hab mich noch nie mit den Konfigurations Bits beschäftigt.
Ich arbeite mit einem Bootloader um direkt per USB programmieren zu 
können.
Habe jetzt folgendes gefunden:
The PIC18F25K50 has several configuration bits in flash memory. For the P-Star, the values of those configuration
bits are shown in the table below. These configuration bits cannot be changed by the bootloader or an application
loaded by the bootloader; you will need to use an external programmer and erase the bootloader if you want to change
any of them.

Also hab ich mal die Configuration Bits im Code so eingestellt, wie sie 
angeblich fix vorgegeben sind.
Werde da noch nicht ganz schlau draus.
Vielleicht sieht da jemand mit Erfahrung was, bevor ich mich durch die 
Register geackert habe...

Wenn ich mit PWM_Period = (PRx+1)*4*(1/Fosc)*TMRx_Prescale rechne,
stimmen die Messungen, wenn ich als Fosc 48MHz annehme.
Ist die Aussage diverser Quellen falsch, das der Quarztakt für die 
Rechnung zu nutzen ist?
// PIC18F25K50 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1L
#pragma config PLLSEL = PLL3X   // PLL Selection (3x clock multiplier)
#pragma config CFGPLLEN = ON    // PLL Enable Configuration bit (PLL Enabled)
#pragma config CPUDIV = NOCLKDIV// CPU System Clock Postscaler (CPU uses system clock (no divide))
#pragma config LS48MHZ = SYS48X8// Low Speed USB mode with 48 MHz system clock (System clock at 48 MHz, USB clock divider is set to 8)

// CONFIG1H
#pragma config FOSC = HSH       // Oscillator Selection (HS oscillator, high power 16MHz to 25MHz)
#pragma config PCLKEN = OFF     // Primary Oscillator Shutdown (Primary oscillator shutdown firmware controlled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config nPWRTEN = ON     // Power-up Timer Enable (Power up timer enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (BOR controlled by firmware (SBOREN is enabled))
#pragma config BORV = 285       // Brown-out Reset Voltage (BOR set to 2.85V nominal)
#pragma config nLPBOR = ON      // Low-Power Brown-out Reset (Low-Power Brown-out Reset enabled)

// CONFIG2H
#pragma config WDTEN = SWON     // Watchdog Timer Enable bits (WDT controlled by firmware (SWDTEN enabled))
#pragma config WDTPS = 256      // Watchdog Timer Postscaler (1:256)

// CONFIG3H
#pragma config CCP2MX = RC1     // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON      // PORTB A/D Enable bit (PORTB<5:0> pins are configured as analog input channels on Reset)
#pragma config T3CMX = RC0      // Timer3 Clock Input MUX bit (T3CKI function is on RC0)
#pragma config SDOMX = RB3      // SDO Output MUX bit (SDO function is on RB3)
#pragma config MCLRE = ON       // Master Clear Reset Pin Enable (MCLR pin enabled; RE3 input disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset (Stack full/underflow will cause Reset)
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled if MCLRE is also 1)
#pragma config ICPRT = OFF      // Dedicated In-Circuit Debug/Programming Port Enable (ICPORT disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled)

// CONFIG5L
#pragma config CP0 = ON         // Block 0 Code Protect (Block 0 is code-protected)
#pragma config CP1 = OFF        // Block 1 Code Protect (Block 1 is not code-protected)
#pragma config CP2 = OFF        // Block 2 Code Protect (Block 2 is not code-protected)
#pragma config CP3 = OFF        // Block 3 Code Protect (Block 3 is not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protect (Boot block is not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protect (Data EEPROM is not code-protected)

// CONFIG6L
#pragma config WRT0 = ON        // Block 0 Write Protect (Block 0 (0800-1FFFh) is write-protected)
#pragma config WRT1 = OFF       // Block 1 Write Protect (Block 1 (2000-3FFFh) is not write-protected)
#pragma config WRT2 = OFF       // Block 2 Write Protect (Block 2 (04000-5FFFh) is not write-protected)
#pragma config WRT3 = OFF       // Block 3 Write Protect (Block 3 (06000-7FFFh) is not write-protected)

// CONFIG6H
#pragma config WRTC = ON        // Configuration Registers Write Protect (Configuration registers (300000-3000FFh) are write-protected)
#pragma config WRTB = ON        // Boot Block Write Protect (Boot block (0000-7FFh) is write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protect (Data EEPROM is not write-protected)

// CONFIG7L
#pragma config EBTR0 = ON       // Block 0 Table Read Protect (Block 0 is protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Block 1 Table Read Protect (Block 1 is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Block 2 Table Read Protect (Block 2 is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Block 3 Table Read Protect (Block 3 is not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protect (Boot block is not protected from table reads executed in other blocks)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

von . . (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jochen D. schrieb:

> Ist die Aussage diverser Quellen falsch, das der Quarztakt für die
> Rechnung zu nutzen ist?

Die einzige verlässliche Datenquelle ist das Datenblatt des Chip.

Und da steht eindeutig und mehfach drin "Fosc/4".

von Ingo Less (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Miss Ratgeber schrieb:
> in Assembler
Nicht im Ernst...

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.