mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F45K22 Software PWM


Autor: Daniel B. (daniel_bach)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mit dem o.g. PIC viele LED´s ansteuern. Diese sollen Faden 
und in verschiedenen Helligkeiten leuchten können.
Da es ca. 14 LED´s sind, fällt PWM mit CCP aus und es muss mit Software 
PWM implementiert werden.

Der PIC läuft mit intern 16MHz, Timer 1 wird schon zur dekodierung einer 
kleinen Fernbedienung verwendet.
Ich habe schon viel durchsucht, leider sind einfache Beispiele oft in 
asm ( ich arbeite mit c) oder für den avr.

Wäre jemand so nett und könnte mir einen Denkanstoß geben?
Was klar ist: Ich muss einen Timer einstellen und zwar so das für z.B. 
200 Hz alle 5ms ein Überlauf des Timers stattfindet.

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel B. schrieb:
> Was klar ist: Ich muss einen Timer einstellen und zwar so das für z.B.
> 200 Hz alle 5ms ein Überlauf des Timers stattfindet.

Warum ist das klar? Ich denke das ist viel zu langsam ;-)
Bei einer Software PWM zählt man die Überläufe dieses Timers und 
schaltet nach bestimmten erreichten Werten die LEDs ein oder aus.

Wenn man so eine einigermaßen vernünftige Auflösung erreichen will, 
müssen die einzelnen Schritte viel kürzer sein als 5ms. Dazu kommt noch, 
dass der Helligkeitseindruck nicht linear mit der Zeit zunimmt.

Vor nicht allzu langer Zeit wollte ich mal etwas ähnliches 
programmieren, wobei die Steuerung für die LEDs in einem Array von 
Steuerworten abgelegt war.
Am Anfang wird das Steuerwort[0] an den Ports ausgegeben, welche die 
LEDs ansteuern. Nach dem ersten Durchlauf des Timers das Steuerwort[1] 
und die Zeit  des Timers wird verdoppelt. So geht das dann weiter, bis 
zur Anzahl der gewünschten Helligkeitsstufen.

Bin mir jetzt leider nicht sicher, wie weit das damals gediehen war. Ich 
schau mal ob ich noch was davon finde...

<edit> das Faden würde dann durch Manipulation des Steuerwortarrays in 
einem weiteren, langsameren Timerinterrupt geschehen.</edit>

: Bearbeitet durch User
Autor: Daniel B. (daniel_bach)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay, also Timer schneller laufen lassen und die Überläufe des Timers 
zählen.

Angenommen ich möchte eine oder mehrere LEDs faden, sprich blinken 
lassen (z.B. um den Warnblinker eines Fahrzeuges.

--> Timer3 initialisieren
--> Timer3 einschalten
--> jeden Überlauf zählen -> if(PIR2bits.TMR3IF) var++;
--> danach Test, ob var größer als bestimmter wert
--> Test erfolgreich PIN an, Test n.i.o. PIN aus und var auf 0 setzen

ich würde es gern erstmal für eine led hin bekommen und dann schaeu ich 
weiter.

Das Tutorial hier hab ich mir natürlich angeschaut, auch wenn das 
prinzip immer gleich ist kann ich es iwie nicht auf den pic anwenden

Autor: Maik W. (werner01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8bit auflösung = 256 * Herzzahl 100 Hz sollte reichen = 25600 
Überläufe/s.
Betreibe den Controller mit maximalen Takt. Soft.-PWM ist so ne Sache...

Grüße

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel B. schrieb:
> --> danach Test, ob var größer als bestimmter wert
> --> Test erfolgreich PIN an, Test n.i.o. PIN aus und var auf 0 setzen

Wenn var = 0 dann LED an. Wenn var = bestimmter Wert dann LED aus.

Schau mal da: 
http://www.hs-ulm.de/users/vschilli/Mikrocontroller/uCQ/_downloads/uCquick-X_20180413.pdf

 7.1 LED - Ein/Aus oder doch unterschiedlich hell?
 7.3 Mehrere PWM Signale über einen Timer (special Event)

Die oben angedeutete Geschichte mit dem Steuerwortarray ist da leider 
nicht drin :-(

Autor: Daniel B. (daniel_bach)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, eine LED mit pwm zu betreiben funktioniert soweit, und zwar mit 
Timer Interrupt und dem Timer 0. Der Chip läuft mit 16 MHz, der Timer 
ist so eingestellt dass alle 30 µs ein Überlauf und somit ein 
Timer-Interrupt ausgelöst wird. In der ISR wird nun eine Variable 
hochgezählt(time), und mit einem voreingestellten Wert pwm_val 
verglichen. Ist der Zählerwert kleiner als der PWM-Wert (time<pwm_val) 
wird der Pin an dem die LEd angeschlossen isr auf 1 gestellt, ansosnten 
0. Somit kann ich mit unterschiedlichen Werten von pwm_val die 
Helligkeit der LED einstellen.

Nun zu meinem Anliegen: wie kann ich damit ein sanftes ein/aus faden 
machen? Es soll damit einmal ein Blinken mit ein/ausfaden von 4 LEDs 
verwirklicht werden.
Ansatz: Ich würde einen 2. Timer nehmen (ca. alle 50ms ein Interrupt, 
und da bei jedem Interrupt die Variable pwm_val ändern welche wiederum 
die Helligkeit der LED beeinflusst.

Ich würde gerne das hier auf der Seite gezeigte Verfahren mit Soft-PWM 
benutzen, leider bekomme ich es einfach nicht hin das für den Atmega32 
gedachte Beispiel auf meine PIC18F45K22 umzumünzen.

Init:
  
  /* Timer 0 */
  T0CON  = 0x88;
  TMR0H = 0xFF;
  TMR0L = 0x88;
  INTCONbits.GIE = 1;
  T0CONbits.TMR0ON = 1;

PWM Funktion:
U16_T time = 0;
const U8_T pwm_val = 1;
 /*************************** main function *********************/
void main(void)
{
  Pmd_Init();
  Ports_Init();
  Config_Init();
  Timer_Init();
  Irq_Init();
 
  __delay_ms(1000);   // wait 1 second
 
    while(1)
    {
        if (INTCONbits.T0IF)
        { 
            INTCONbits.T0IF = 0;
            TMR0H   = 0xFF;
            TMR0L   = 0x88;
            
            time++;
            
            if (time>20) 
            {
                time=0;
            }

            if (time<pwm_val)
            {
                 LATCbits.LATC7 = 1;
            }
            else
            {
                 LATCbits.LATC7 = 0;
            }
        }
    
 
    }
}
/*************************** end main function ********************************/
     

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel B. schrieb:
> Ich würde gerne das hier auf der Seite gezeigte Verfahren mit Soft-PWM
> benutzen...

Link?

Autor: Daniel Bach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier von mikrocontroller.net

https://www.mikrocontroller.net/articles/Soft-PWM

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo da genau?

1. Timer 0 mit manuellem Reaload scheint mir die umständlichste aller 
Möglichkeiten zu sein.

2. Warum die LED wiederholt ein- bzw. aus-schalten?
Einmal ein bei time == 0 und einmal aus bei time == pwm_val reicht doch.

3. Zum Faden einfach eine zweite Variable (fade_time) mitlaufen lassen, 
welche die Perioden zählt und nach einer gewissen Anzahl die erste 
Variable pwm_val inkrementiert oder dekrementiert?

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.