Forum: Mikrocontroller und Digitale Elektronik WiringPi - Software-PWM Problem


von Raspelmann (Gast)


Lesenswert?

Hallo zusammen.

Ich habe mir einen Raspberry Pi 3 gekauft, der wirklich toll 
funktioniert.
Nun habe ich vor, mittels Software-PWM und WiringPi (Library zur 
eleganten Ansteuerung der GPIOs via C) eine LED zu dimmen.

Leider kommt am besagten GPIO-Ausgang aber beim Start des Programms kein 
Signal raus. Das habe ich durch ein Oszilloskop feststellen können.
Das Schalten der Pins funktioniert einwandfrei, allerdings erhalte ich 
kein Rechteck am GPIO-Ausgang wenn das Programm läuft.

Hier der C-Code des Programms, welches funktionieren sollte:
1
#include <wiringPi.h> // Benoetigte wiringPi-Library
2
#include <softPwm.h>  // Benoetigte Library für Software-PWM
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include <stdint.h>
6
7
#define LED_Pin 36    // wiringPi-Pin 36 / GPIO16
8
#define DELAY   10   // Pause 
9
10
int main (void)
11
{    
12
    int i = 0; // Laufvariable
13
    printf("Raspberry Pi PWM-Programm mit wiringPi\n");
14
15
    if(wiringPiSetup() == -1)       // wiringPi initialisieren
16
        exit (EXIT_FAILURE);    // Fehler? -> Programmende
17
    pinMode(LED_Pin, OUTPUT);       // Pin als PWM-Ausgang nutzen
18
    softPwmCreate(LED_Pin, 0, 100); //Software PWM erstellen
19
    
20
    while(1)
21
    {
22
        // LED aufblenden
23
        for(i = 0; i<= 100; i++)
24
        {
25
            softPwmWrite(LED_Pin, i);
26
            delay(DELAY);
27
        }
28
        // LED abblenden    
29
        for(i = 100; i>= 0; i--)
30
  {
31
            softPwmWrite(LED_Pin, i);
32
            delay(DELAY);
33
        }
34
    }
35
    return EXIT_SUCCESS; // Programm erfolgreich beendet
36
}

Muss ich in Raspbian (OS des Raspberrys) noch irgend etwas einstellen, 
damit das überhaupt funktionieren kann?
Ich bin ratlos..

Vielen Dank im Voraus und einen schönen 3. PWM-Advent!

von ardo (Gast)


Lesenswert?

Hast du dein Programm mit folgender zeile compiliert?

cc -o myprog myprog.c -lwiringPi -lpthread

von ms (Gast)


Lesenswert?

Hallo,

das mal versucht

sudo ./myprog

ms

von Raspelmann (Gast)


Lesenswert?

Hallo zusammen,

ja, ich habe beides wie ihr beschrieben habt ausprobiert.

Es führt zu keinem Erfolg. Ich führe das Skript generell mit "sudo 
./myprog" aus.
Auch die Compilierung habe ich entsprechend durchgeführt.


:-(

von ms (Gast)


Lesenswert?

Hallo,

[c]
#include <stdio.h>    // Used for printf() statements
#include <wiringPi.h> // Include WiringPi library!

// Pin number declarations. We're using the Broadcom chip pin numbers.
const int pwmPin = 18; // PWM LED - Broadcom pin 18, P1 pin 12
const int ledPin = 23; // Regular LED - Broadcom pin 23, P1 pin 16
const int butPin = 17; // Active-low button - Broadcom pin 17, P1 pin 11

const int pwmValue = 75; // Use this to set an LED brightness

int main(void)
{
    // Setup stuff:
    wiringPiSetupGpio(); // Initialize wiringPi -- using Broadcom pin 
numbers

    pinMode(pwmPin, PWM_OUTPUT); // Set PWM LED as PWM output
    pinMode(ledPin, OUTPUT);     // Set regular LED as output
    pinMode(butPin, INPUT);      // Set button as INPUT
    pullUpDnControl(butPin, PUD_UP); // Enable pull-up resistor on 
button

    printf("Blinker is running! Press CTRL+C to quit.\n");

    // Loop (while(1)):
    while(1)
    {
        if (digitalRead(butPin)) // Button is released if this returns 1
        {
            pwmWrite(pwmPin, pwmValue); // PWM LED at bright setting
            digitalWrite(ledPin, LOW);     // Regular LED off
        }
        else // If digitalRead returns 0, button is pressed
        {
            pwmWrite(pwmPin, 1024 - pwmValue); // PWM LED at dim setting
            // Do some blinking on the ledPin:
            digitalWrite(ledPin, HIGH); // Turn LED ON
            delay(75); // Wait 75ms
            digitalWrite(ledPin, LOW); // Turn LED OFF
            delay(75); // Wait 75ms again
        }
    }

    return 0;
}
{/c]

Qulle:https://learn.sparkfun.com/tutorials/raspberry-gpio/c-wiringpi-example

ms

von Raspelmann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo nochmal,

habe nun folgendes herausgefunden.
Im Anhang habe ich ein Pinout der Stiftleiste des RPi 3 angehängt.

Im folgenden Code funktioniert nämlich die PWM und zwar am Pin 11 
(GPIO17):
1
#include <stdio.h>
2
#include <wiringPi.h>
3
#include <softPwm.h>
4
5
6
int main(void)
7
{
8
9
  if (wiringPiSetup() < 0) return 1;
10
  pinMode(11, OUTPUT);
11
  digitalWrite(0, LOW);
12
  softPwmCreate(0, 0, 500);
13
  softPwmWrite(0, 300);
14
  
15
  sleep(30000);
16
  return 0;
17
}


Schaut man sich die ersten Übergabeparameter von "softPwmCreate()" und 
"softPwmWrite()" genau an, sieht man, dass hier auf einen "Pin 0" 
verwiesen wird und nicht auf einen Pin 11.
Dies bezieht sich anscheinend auf "GPIO_GEN0" und NICHT auf die 
GPIO-Bezeichnung "GPIO17".

Das ist ziemlich verwirrend.

Mich würde interessieren, wie ich nun die neu hinzugekommenen 14 GPIOs 
entsprechend ansteuern kann...

von seho85 (Gast)


Lesenswert?

Hi,

schau dir mal http://wiringpi.com/pins/ an.

WiringPi verwendet ein eigenes Pinout, der von dir gewählte wiringPi Pin 
0, verwendet den BCM_GPIO 17, der als GPIO0 auf dem RASPI markiert ist, 
und auf dem Pin11 des Raspi Connectors liegt.

Gruß,
Sebastian

von seho85 (Gast)


Lesenswert?

Anmerkung:

BCM_GPIO ist der GPIO Pin auf der BCM CPU. Dieser entspricht nicht den 
Raspberry Pi GPIO Pin Nummern.

Auch die PINs auf dem Connector des Raspberry entsprechen nicht der 
Raspberry Pi GPIO Nummerierung.

Der Connector ist unter anderen mit diversen Protokoll GPIOs 
ausgestattet:
MISO,MOSI usw.

Diese können aber auch für den GPIO Betrieb konfiguriert werden.

von Raspelmann (Gast)


Lesenswert?

>Diese können aber auch für den GPIO Betrieb konfiguriert werden.

Ja und wie?
Speziell im Falle der Software-PWM?

von seho85 (Gast)


Lesenswert?

Wenn du z.B. die SDA und SCL Pins die zum I2c Bus gehören als GPIO 
nutzen willst dann musst du nur sicherstellen das kein I2C per Device 
Tree aktiviert wird. Dann sind die Pins GPIO nutzbar.

Für die Nutzung als SOFTPWM muss der GPIO nur frei sein, sprich keiner 
anderen Perepherie zugeordnet.

SOFTPWM  erzeugt ein PWM Signal per Software.

Hat ja bei dir auch funktioniert, nur war dir nicht klar warum bei 
wiring pi Pin0 der BCM GPIO17 der auf dem Connector auf Pin11 liegt, das 
PWM Signal ausgibt.

von Raspelmann (Gast)


Lesenswert?

>nur war dir nicht klar warum bei
>wiring pi Pin0 der BCM GPIO17 der auf dem Connector auf Pin11 liegt, das
>PWM Signal ausgibt.

Und genau das ist das Problem, dass ich nicht weiß wie die anderen GPIOs 
im Wiring Pi für den Raspberry 3 "heißen", damit ich dort eine 
Software-PWM laufen lassen kann?!

Gruß

von Raspelmann (Gast)


Lesenswert?

http://wiringpi.com/pins/

Hier steht nämlich nichts von den 40 Pins vom Raspberry Pi 3.

von seho85 (Gast)


Lesenswert?

Richtig,

da steht nur etwas zur Belegung der GPIOs die auf den Connector 
herausgeführt sind.

Die Tabelle ist doch nicht zu schwer zu verstehen :)

Wenn du ein weiteres Soft PWM Signal willst z.B. auf dem BCM_GPIO 18, 
der als GPIO1 auf dem Connector liegt, nimmst du einfach den wiringPi 
Port 1.

Vielleicht verstehe ich auch nur nicht was genau dein Problem ist

Möchtest du ein PWM Signal auf einem GPIO erzeugen der nicht auf dem 
Connector herausgeführt ist?

Gruß,
Sebastian

von Raspelmann (Gast)


Lesenswert?

Hat sich nun erledigt...

Ich verwende zur Initialisierung nun die Methode "wiringPiSetupGpio()".
Damit kann man dann die Gpio-NAMEN (!) ansprechen.

Es gibt laut WiringPi mehrere Methoden zur Initialisierung der GPIO-Pins 
um damit etwas zu machen wie in meinem Falle z.B. die Soft-PWM zu 
erzeugen.

Gruß

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.