Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi Hardware PWM funktioniert nicht


von Johannes (Gast)


Lesenswert?

Ich hab gerade meinen alten Pi 1.1 ausgegraben und dazu ein C-Berry28 
Display was ich mir vor Ewigkeiten mal gekauft hatte und das wollte ich 
endlich mal benutzen.
Jetzt ist bei der mitgelieferten Software nur die Anzeige eines voll 
Format *.bmp dabei und das auch nur bei voller Display Helligkeit. Jetzt 
wollte ich mir ein paar einfache Zeichenfunktionen und eine Steuerung 
der Displayhelligkeit selber schreiben.
Nutzen wollte ich dafür den GPIO_P1_12 (GPIO18 am Chip) also der einzige 
mit Hardware PWM. Der ist auch direkt so auf das Display für genau 
diesen Zweck raus geführt und mit dem MOS-FET für das Backlight 
verbunden, sollte also gehen.
Nutzen wollte ich diese Library (erstes Google Ergebnis und wird eh 
bereits auch von der mitgelieferten BSP Anwendung genutzt) benutzen.
http://www.airspayce.com/mikem/bcm2835/
make check und install haben funktioniert. Aber nun funktioniert nicht 
mal die Bsp-PWM. geschweigenden meine eigene.

Hier mal der Bsp. Code. Bis auf meine Debug Meldungen unverändert...
1
int main( int argc, char **argv )
2
{
3
    //char my_filename[] = "../bmp/admatec.bmp";
4
    printf("Start\n");
5
    if (!bcm2835_init())
6
    {
7
        printf("BCM2835 Chipsatz ist nicht bereit!");
8
        return 1;
9
    }
10
11
    // Set the output pin to Alt Fun 5, to allow PWM channel 0 to be output there
12
    bcm2835_gpio_fsel(RPI_GPIO_P1_12, BCM2835_GPIO_FSEL_ALT5);
13
    // Clock divider is set to 16.
14
    // 1.2MHz/1024 = 1171.875Hz
15
    bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_16);
16
    bcm2835_pwm_set_mode(PWM_CHANNEL, 1, 1);
17
    bcm2835_pwm_set_range(PWM_CHANNEL, RANGE);
18
    // Vary the PWM m/s ratio between 1/RANGE and (RANGE-1)/RANGE
19
    // over the course of a a few seconds
20
    int direction = 1; // 1 is increase, -1 is decrease
21
    int data = 1;
22
    while (1)
23
    {
24
        if (data == 1)
25
            direction = 1;   // Switch to increasing
26
        else if (data == RANGE-1)
27
            direction = -1;  // Switch to decreasing
28
        data += direction;
29
        bcm2835_pwm_set_data(PWM_CHANNEL, data);
30
        printf("Set BL_PWM to %d\n", data);
31
        bcm2835_delay(1);
32
    }
33
34
    bcm2835_close();
35
    printf("Ende\n");
36
    return 0;
37
38
}
Hat schon mal jemand damit was gemacht, oder kennt jemand alternative 
Libs die die PWM nutzen können?

PS: Ich hatte auch schon ein Oszi am PIN mit und ohne Display und es war 
kein PWM Signal sichtbar sondern immer nur HIGH Pegel, also liegt es 
wohl nicht am Display

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

pigpio und der pigpio-daemon?
http://abyz.co.uk/rpi/pigpio/
Quelltexte dazu:
https://github.com/joan2937/pigpio
damit kann man jeden Pin für PWM benutzen.

Setzt die verwendete Funktion automatisch den PWM-pin als output, oder 
muss man das explizit tun?

von Johannes (Gast)


Lesenswert?

Danke, war schon mal ein guter Hinweis, nochmal die Bibliothek an sich 
anzusehen. Hab jetzt mal eine Soft PWM (nur um zu testen ob es sicher 
nicht am Pi selbst liegt) geschrieben mit den GPIO_write() und delay() 
Funktionen aus genau der Bibliothek. Damit tut sich was und ist am 
Oszilloskop auch nachvollziehbar.
Also liegt es entweder an dem wie ich die Bibliothek nutze, oder aber an 
der Bibliothek selbst.
Ich werde weiter suchen.

PS: Danke für den pigpio Tip. Ist vermutlich die bessere Alternative!

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.