- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 21

Thema: PWM im Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    Zitat Zitat von i_make_it Beitrag anzeigen
    Und in diesem Post:
    https://www.roboternetz.de/community...l=1#post642754
    ein einfaches Demoprogramm, das mit analogWrite() immer maximal 2 von 4 PWM setzt.
    Die Randbedingungen gibt es weiter vorne im Thread und eine Demo bei der im Hauptprogramm feste Werte gesetzt werden gibt es in Post 35 des Thread.

    Eventuell ist das hilfreich.
    Bevor man so etwas einem Arduino-Anfänger als Anleitung gibt, der noch nicht einmal von analogWrite gehört hat, müsste zumindest vorher geklärt werden, wie denn überhaupt der Motor mit welchen H-Brücken-Treibern genau angesteuert werden soll.
    Arduino-typisch für Standard-Setups (L293D u.a.) ist dein Code nämlich nicht, und schon gar nicht (didaktisch) "einfach", und auch für mich als Arduino- und RaspberryPi-User noch nicht einmal unbedingt intuitiv verständlich.

    Warten wir also vlt erst einmal ab, ob der OP das mit analogWrite verstanden hat, und dann mal sehen....

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Zitat Zitat von HaWe Beitrag anzeigen
    und auch für mich als Arduino- und RaspberryPi-User noch nicht einmal unbedingt intuitiv verständlich.
    Da sollte man jetzt nicht einfach pauschal von sich auf andere schließen.
    Das hängt ja davon ab wie intuitiv das Verständniss von C++ und dem Zielsystem ist.
    Das ist so wie bei Muttersprache und Femdsprache.
    Was in der Muttersprache intuitiv geht, geht in einer Fremdsprache noch lange nicht, wenn man sie nicht entsprechend beherscht.
    Bei jedem gibt es irgenwas was er nicht versteht, was für andere aber ganz einfach ist.
    Zitat Zitat von i_make_it Beitrag anzeigen
    Die Randbedingungen gibt es weiter vorne im Thread
    In Post 26 z.B. auch die beiden Links:
    https://www.arduino.cc/en/Tutorial/PWM

    https://www.arduino.cc/reference/en/...o/analogwrite/
    mit denen man PWM und analogWrite() verstehen kann.

    Code:
    int IN1 = 9;
    int speed = 200;
    
    void setup()
    {
      pinMode(IN1, OUTPUT);
    }
    
    void loop()
    {
    PWMDrive(speed); //einmal pro Durchlauf der Hauptschleife kann man die Geschwindigkeit ändern, wenn man will und den Wert vonspeed in der Hauptschleife verändert
    
    //mach was ganz anderes
    }
    
    void PWMDrive(int speed){
      analogWrite(IN1, speed);
    }
    Das wäre jetzt ein minimalistisches Beispiel

  3. #3
    HaWe
    Gast
    Zitat Zitat von i_make_it Beitrag anzeigen
    Code:
    int IN1 = 9;
    int speed = 200;
    
    void setup()
    {
      pinMode(IN1, OUTPUT);
    }
    
    void loop()
    {
    PWMDrive(speed); //einmal pro Durchlauf der Hauptschleife kann man die Geschwindigkeit ändern, wenn man will und den Wert vonspeed in der Hauptschleife verändert
    
    //mach was ganz anderes
    }
    
    void PWMDrive(int speed){
      analogWrite(IN1, speed);
    }
    Das wäre jetzt ein minimalistisches Beispiel
    Über Arduino- und C/C++-Code kannst und brauchst du mir sicher nichts erzählen, aber das "minimalistische Beispiel" wird so auch nicht unbedingt funktionieren, denn mit analogWrite(pin, pwm) alleine kann man ja ohne weitere Hardware keinen Motor betreiben.
    Aber bevor ich hier mein (bewährtes) Beispiel poste oder verlinke - wie gesagt:
    Warten wir erst einmal ab, ob der OP das mit analogWrite verstanden hat, ob es ihm was nutzt, und welche Leistungsstufe oder H-Brücken mit welcher Logik er ggf verwendet, und dann mal sehen....

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    230
    Danke für die rege Diskussion und Anregungen, ich verwende das UNO was im übrigen unerheblich ist da ich eigentlich nur wissen will od die Funktion analogWrite(); schon in einem Interrupt arbeitet oder od ma das ganze in eine Interrupt Funktion auslagern kann damit das Hauptprogramm nicht so belastet wird auch wen ich es nicht wirklich brauche ich finde es einfach sauberer, auch die Treiber Stufe ist erstmal unerheblich ich verwende eine L298N. Warum wollt ihr wissen was für ein Treiber ich benutze Danke für die Hilfe.
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  5. #5
    HaWe
    Gast
    Zitat Zitat von Ferdinand Beitrag anzeigen
    Danke für die rege Diskussion und Anregungen, ich verwende das UNO was im übrigen unerheblich ist da ich eigentlich nur wissen will od die Funktion analogWrite(); schon in einem Interrupt arbeitet oder od ma das ganze in eine Interrupt Funktion auslagern kann damit das Hauptprogramm nicht so belastet wird auch wen ich es nicht wirklich brauche ich finde es einfach sauberer, auch die Treiber Stufe ist erstmal unerheblich ich verwende eine L298N. Warum wollt ihr wissen was für ein Treiber ich benutze Danke für die Hilfe.
    es kann sein, dass die pwm-Signatur für versch. Treiberstufen bei Richtungsumkehr evtl. invertiert werden muss (war bei mir aber bisher nie ein Thema), beim L298N ist das aber jedenfalls nicht der Fall, da geht alles ganz easy, logisch und identisch für beide Laufrichtungen, und auch automatisch ohne weitere Interrupts.

    Wenn du dafür einen Arduino-Steuercode brauchst (3-pin-Logik für Richtung und Geschwindigkeit): sag Bescheid!

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Zitat Zitat von HaWe Beitrag anzeigen
    Über Arduino- und C/C++-Code kannst und brauchst du mir sicher nichts erzählen, aber das "minimalistische Beispiel" wird so auch nicht unbedingt funktionieren, denn mit analogWrite(pin, pwm) alleine kann man ja ohne weitere Hardware keinen Motor betreiben.
    Aber bevor ich hier mein (bewährtes) Beispiel poste oder verlinke - wie gesagt:
    Warten wir erst einmal ab, ob der OP das mit analogWrite verstanden hat, ob es ihm was nutzt, und welche Leistungsstufe oder H-Brücken mit welcher Logik er ggf verwendet, und dann mal sehen....
    Gibt es da nicht jemand bestimtmen, der sonst immer gerne auf "Keep it Simple" bzw. sogar KISS rumreitet, wenn ein anderer mehr beantwortet als gefragt wurde?
    Das Argument sieht grade so aus als ob das je nach Tagesform wahlfrei wäre.

    Aber dem TO ist ja mit dem einfachen Beispiel auf die einfache Frage erstmal geholfen worden.

  7. #7
    HaWe
    Gast
    Zitat Zitat von i_make_it Beitrag anzeigen
    Gibt es da nicht jemand bestimtmen, der sonst immer gerne auf "Keep it Simple" bzw. sogar KISS rumreitet, wenn ein anderer mehr beantwortet als gefragt wurde?
    Das Argument sieht grade so aus als ob das je nach Tagesform wahlfrei wäre.

    Aber dem TO ist ja mit dem einfachen Beispiel auf die einfache Frage erstmal geholfen worden.
    ich sehe nicht, wo ich vorschnell mehr "beantwortet" hätte, als gefragt war, im Gegensatz zu dir....

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    230
    Hi und Danke für deine Erklärung da ich mich neu in Arduino einarbeite bin ich für jede Hilfe dankbar und habe großes Interesse zu deinem Sketch.

    - - - Aktualisiert - - -

    Das ist jetzt mal eine Version, allerdings läuft sie noch nicht bin wohl noch ein wenig eingerostet. Kann mir einer helfen die Fehler aus zu bügeln
    Code:
    // 14-19
    //Sensoren
    const int V_LINKS = 14;
    const int V_MITTE = 15;
    const int V_RECHTS = 16;
    const int H_LINKS = 17;;
    const int H_MITTE = 18;;
    const int H_RECHTS = 19;
    //Motoren
    const int LINKS = 6;
    const int RECHTS = 5;
    const int VOR = 4;
    const int ZURUECK = 2;
    const int PWM = 3;
    
    int pwm 127;
    
    
    void setup() {
      // put your setup code here, to run once:
    
    pinMode(V_LINKS, INPUT);
    pinMode(V_MITTE, INPUT);
    pinMode(V_RECHTS, INPUT);
    pinMode(H_LINKS, INPUT);
    pinMode(H_MITTE, INPUT);
    pinMode(H_RECHTS, INPUT);
    
    pinMode(LINKS, OUTPUT);
    pinMode(RECHTS, OUTPUT);
    pinMode(VOR, OUTPUT);
    pinMode(ZURUECK, OUTPUT);
    pinMode(PWM, OUTPUT);
    
    }
    
    void loop() {
     
    analogWrite(PWM, pwm);  
    
    
    
    
    switch( digitalRead() )
         {
           
      case digitalRead(V_MITTE) : digitalWrite(ZURUECK, HIGH);
              
          break;
    
      case digitalRead(V_LINKS) : digitalWrite(ZURUECK, HIGH) | digitalWrite(RECHTS, HIGH)  ;
               
    
          break;
    
      case digitalRead(V_RECHTS) : digitalWrite(ZURUECK, HIGH) | digitalWrite(LINKS, HIGH) ;
                
    
          break;
    
        case digitalRead(H_MITE) : digitalWrite(VOR, HIGH) ;
              
              
          break;
    
      case digitalRead(H_LINKS) : digitalWrite(VOR, HIGH) | digitalWrite(RECHTS, HIGH) ;
               
                   
              
          break;
    
      case digitalRead(H_RECHTS) : digitalWrite(VOR, HIGH) | digitalWrite(LINKS, HIGH) ; 
                  
              
          break;
    
      
      default  : digitalWrite(VOR, HIGH) | digitalWrite(ZURUECK, HIGH) ; 
            
       }
    
    
    // put your main code here, to run repeatedly:
    
     
        delay(30);
    
    
    }
    und hier noch mein altes Programm das, wunderbar getan hat


    Code:
    //Motoren
    #define VOR          0b00110100
    #define ZURUECK     0b00101100
    #define LINKS          0b00100110
    #define RECHTS      0b00100101
    #define GERADE      0b00100111
    #define BREACK      0b00111111
    #define PWM_DRIVE     0b00100000
    #define PWM_LENKUNG    0b00000100
    //Sensoren
    #define V_MITE      0b00111101
    #define V_LINKS      0b00111011
    #define V_RECHTS      0b00111110
    #define H_MITE      0b00101111
    #define H_LINKS      0b00011111
    #define H_RECHTS      0b00110111
    //LED ROT, GREUN
    #define LED_ROT      0b10000000
    #define LED_GRUEN      0b01000000
    #define LED_AUS     0b00000000
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "Roboter.h"
    
    /*
    #define DURCHLEUFE 256
    
    volatile unsigned int wert=0;
    
    //Timer 0
    ISR(TIMER0_OVF_vect)
    {
    wert++;
    TCNT0 = 256 -DURCHLEUFE;
    }
    */
    
    int main(void)
    {
    
    /*TCNT0 = 256 -DURCHLEUFE;
    TCCR0 = (1 << CS02)|(1 << CS00);
    TIMSK = (1 << TOIE0);
    
    sei();
    */
    DDRB = 0xFF; //Ausgang, Motoren
    DDRC = 0b11000000; //Eingang, Sensoren
    
    
    while (1)
    {
        
    
    switch( PORTC )
         {
           
        case V_MITE : PORTB = ZURUECK ;
                      
                break;
    
        case V_LINKS : PORTB = ZURUECK | RECHTS  ;
                       
    
                break;
    
        case V_RECHTS : PORTB = ZURUECK | LINKS ;
                        
    
                break;
    
           case H_MITE : PORTB = VOR ;
                      
                
                break;
    
        case H_LINKS : PORTB = VOR | RECHTS ;
                       
                           
                
                break;
    
        case H_RECHTS : PORTB = VOR | LINKS ; 
                        
                        
                break;
    
        
        default  : PORTB = BREACK ;
                   PORTB = LED_ROT ;
        
         }
    
    }
    
    return 0;
    }
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  9. #9
    HaWe
    Gast
    Zitat Zitat von Ferdinand Beitrag anzeigen
    Hi und Danke für deine Erklärung da ich mich neu in Arduino einarbeite bin ich für jede Hilfe dankbar und habe großes Interesse zu deinem Sketch.
    gerne!
    aber erst eine Frage vorab, damit es auch der richtige Code ist:
    wie ist die Ansteuerung deiner L298N H-Brücke: mit 2 (dir+pwm) oder mit 3 Pins (in1, in2, pwm) ?

  10. #10
    Erfahrener Benutzer Begeisterter Techniker Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    230
    ok einen fehler habe ich jetzt gefunden

    int pwm 127;
    Warum auch immer ich das so schreiben muss
    int pwm = 127;

    - - - Aktualisiert - - -

    mit 3 pin beim antrib bei der lenkung brauch ich kein pwm da ist es direckt auf 5v also 2 pin
    3 pin vor zurück + pwm,
    2 pin lenkung links rechts
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

Ähnliche Themen

  1. Interrupt
    Von amal im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 22.07.2011, 22:38
  2. PVD-Interrupt
    Von kmrish im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 3
    Letzter Beitrag: 19.07.2011, 11:32
  3. For Next , Interrupt
    Von wodka im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 16.01.2009, 16:10
  4. Interrupt ADC
    Von Night_MaKu im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 27.04.2006, 17:05
  5. [ERLEDIGT] Interrupt waehrend Interrupt
    Von thomas05 im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 08.11.2005, 06:13

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests