WiringPi - Software-PWM Problem

Gast #4824362
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!
Gast
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.


:-(
Gast
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
Gast
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...
Angehängte Dateien:
Gast
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.
Gast
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.
Gast
>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ß
Gast
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
Gast
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ß

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.