Forum: Mikrocontroller und Digitale Elektronik PIC16F887 und PWM


von Sebastian P. (sebl)


Lesenswert?

Hi Leute,

nachdem ich hier schon so manche Beiträge quergelesen hab und manch 
sinnvolle Info aus dem Board ziehen konnte jetzt auch mal der aktive 
Part.

Ich hab gestern die "Aufgabe" bekommen, bei unsrem Azubiprojekt 
mitzuhelfen welche da aktuell eine Binäruhr werden wird. Die ganze logik 
dahinter steht schon (gute alte 78er und 40er Logik diskret). Allerdings 
haben sich meine Kollegen jetzt überlegt, dass sie gerne RGB LEDs 
verwenden wollen um diese dann quasi durchzufaden, dabei sollen alle 
LEDs die gleiche Farbe haben.
Die Logik hinter der Binäruhr hängt wie üblich an der Kathode der LEDs, 
für die Helligkeit der einzelnen Farben muss sowieso die Anode ran.
Als Ansteuerung dachte ich an einen Mikrocontroller der mir 3 
unterschiedliche PWM signale ausgibt, mit denen 3 Mosfettreiber oder 
ähnliches dann die Anoden der LEDs ansteuern.

Der Blick ist dabei auf den PIC16F887 gefallen, weil mir die 16er Serie 
von Microchip immernoch die "vertrauteste" ist, dadurch dass wir auf 
einem 16F84A in der Schule lernen und mein Prüfungsaufbau für 
Zwischen/Abschlussprüfung auf dem 887 basiert. (Azubi EGS im 2. LJ)

Der µC besitzt ja an und für sich 4 PWM Outputs, die im Single, half 
Bridge oder full Bridge modus arbeiten können (Pin 17, 28, 29 30 
entsprechend konfiguriert) Allerdings hab ich beim durchwälzen des 
Datenblatts noch keine Info darüber gefunden, ob ich die 4 Outputs 
wirklich getrennt im Duty Cycle einstellen kann. Der Takt kommt mir ja 
sowieso synchron. Interessant wäre auch mal wie man das genau 
programmiert, ein Snipet in Assembler würde mir da schon viel helfen, 
insbesondere was die Initialisierung/Config des ganzen angeht, auch 
scheint es auf den ersten blick keine separaten Register für jede 
einzelne PWM zu geben.

Soweit mal die Fragerei in die Runde

LG Sebl

von schris (Gast)


Lesenswert?

Der Chip besitzt 2 pwm , welche man auch unabhängig die duty cycle 
vergeben kann, nicht aber die pwm frequenz.
Du könntest 2x pwm sowie 1x DAC verwenden, auf ein 4-fach opv und beim
pwm ein rc filter davor. Dabei sind dann für eine Farbe nur 16 
Intensitäten vorhanden.
Ansonsten SW PWM ist die Lösung schau dir mal an1074 an.

von Max H. (hartl192)


Lesenswert?

Sebastian P. schrieb:
> ob ich die 4 Outputs
> wirklich getrennt im Duty Cycle einstellen kann.
Nein, du kannst nur zwei Dutycyles unabhängig voneinander einstellen. 
Such dir einen PIC mit >=3 CCP/ECCP/PWM Modulen. Da fällt mir so schnell 
der PIC12F1501 oder wenn du mehr IOs haben willst der PIC16F1503 ein. 
Beide haben 4 unabhängige PWM Module.

Solltest der 12F1501 passen: Hier ein Programm, das LEDs an PORTA 
blinken lässt:
1
  list    p=12F1501      ; list directive to define processor
2
  #include  <p12F1501.inc> ; processor specific variable definitions
3
  
4
5
  __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
6
    __CONFIG _CONFIG2, _WRT_OFF & _STVREN_OFF & _BORV_HI & _LPBOR_ON & _LVP_OFF
7
8
  delay_cnt0 equ 0x70
9
  delay_cnt1 equ 0x71
10
  delay_cnt2 equ 0x72
11
12
  ORG 0x00
13
  goto start
14
  
15
  ORG 0x04
16
  retfie
17
18
start:
19
  BANKSEL OSCCON
20
  movlw b'01111010'
21
  movwf OSCCON    ; 16 MHz, Internal oscillator block
22
23
  BANKSEL PORTA 
24
  clrf PORTA       ;Init PORTA
25
  BANKSEL LATA     ;Data Latch
26
  clrf LATA 
27
  BANKSEL ANSELA 
28
  clrf ANSELA     ;digital I/O
29
  BANKSEL TRISA 
30
  clrf TRISA 
31
32
  BANKSEL LATA
33
34
loop:
35
  movlw 0xFF
36
  xorwf LATA,f
37
  
38
  movlw .5
39
  movwf delay_cnt2
40
  decfsz delay_cnt0,f
41
  goto $-1
42
  decfsz delay_cnt1,f
43
  goto $-3
44
  decfsz delay_cnt2,f
45
  goto $-5
46
47
  goto loop

Nachtrag:
Initialisierung eines PWM Moduls (10bit, 15625Hz @ Fosc=16MHz):
1
  BANKSEL T2CON
2
  movlw b'00000100'  ; 1:1 Postscaler, Timer2 is on, Prescaler is 1
3
  movwf T2CON
4
  
5
  BANKSEL PIE1
6
  bcf PIE1,TMR2IE
7
  
8
  BANKSEL PR2
9
  movlw 0xFF
10
  movwf PR2
11
  
12
  BANKSEL PWM3CON
13
  bsf PWM3CON,PWM3EN     ;PWM3 module is enabled (RA4)
14
  bsf PWM3CON,PWM3OE    ;Output to PWMx pin is enabled
15
  bcf PWM3CON,PWM3POL    ;PWM output is active-high

: Bearbeitet durch User
von Sebastian P. (sebl)


Lesenswert?

Oha, so unterschiedlich sind die Pics der gleichen "kategorie" im 
bereich der programmierung also.
Kaum hab ich n bissl erfahrung aufm 16f84a kommt n anderer daher der was 
kann was mir grad gefallen würde und boom, der programmiert sich 
vollkommen anders.
bei dem 16f1503 hab ich im datenblatt auch keine ordentliche auflistung 
der SFR gefunden...

von ...-. (Gast)


Lesenswert?

Sebastian P. schrieb:
> bei dem 16f1503 hab ich im datenblatt auch keine ordentliche auflistung
> der SFR gefunden...

page 19 ...

von W.S. (Gast)


Lesenswert?

Sebastian P. schrieb:
> Oha, so unterschiedlich sind die Pics der gleichen "kategorie" im
> bereich der programmierung also.

Ach wo, das sind doch nur ganz kleine Unterschiede.
Die PIC16's mit vierstelligen Teilenummern haben übrigens teilweise 
einen erweiterten Befehlssatz.

Ich würde ansonsten nicht gar so sehr mit diesen BANKSEL Makros 
herumschmeißen.

Wenn ich das richtig sehe, dann hat dieser PIC nix weiter zutun, als 
deine LED's zu dimmen - richtig? Dann würde ich das ganze Hardware-PWM 
einfach bleiben lassen und die PWM's einfach per Software machen. Das 
ist allemal schnell genug zum LED-Dimmen.

W.S.

von Sebastian P. (sebl)


Lesenswert?

Das mit der Software hab ich mir auch schon überlegt, aber ob ichs damit 
hinkrieg, 3 getrennte ausgänge in einem quasi dreieck, wenn man die PWM 
im sinne vom "effektivwert" ineinander verschachteln kann ohne vorher 
nen drehwurm zu bekommen?
Also ziel isses, alle möglichen farben anfahren zu können in 
anschwellender Art und Weise durch das sequentielle programmieren könnte 
das noch interessant werden, aber für den fall könnte ich auch meinen 
16f84a nehmen, von dem ich noch n paar hier liegen hab.

von Sebastian P. (sebl)


Lesenswert?

ich hab leider noch nicht die Zeit gehabt, mich in die PWM 
programmierung richtig reinzufinden (interrupt programmierung ist noch n 
neues thema für mich un rein sequentiell wirds auch nicht ganz trivial).
Allerdings brauch ich natürlich Hardwareseitig auch noch Transistoren, 
die mir die Anoden von meinen RGB LEDs schalten. da ich die von meinem 
Kollegen eingesetzten LEDs nicht genau kenne geh ich mal grob von im 
schlimmsten Fall 500mA pro Transistor aus, als maximale Schaltfrequenz 
setz ich jetzt mal 2khz an, ließe sich sicher noch nach unten 
korregieren.
Da ich ja die Anode schalte, bietet sich ja der P-Kanal Mosfet an, 
richtig? Geschalten wird über den Pic idealerweise direkt, ergo ein 
Logiclevel Typ, damit ich den p-kanal "dicht" bekomme? (ist ja bei 
Ugs=0V komplett offen, richtig?)Geschalten werden ebenfalls 5V, Strom 
wird über einzelne Vorwiderstände an den LEDs begrenzt. Oder tuts ein 
üblicher Verdächtiger, so à la irf4905?
Könnte vom Gehäuse her wohl auch noch kleiner sein, sofern der das 
ungekühlt mitmacht.
Gibts empfehlenswerte p-kanal fets mit LL Input die für meine Anwendung 
passen würden? bei Reichelt hab ich auf die schnelle nix gefunden was 
den Anforderungen entspricht.

von Max H. (hartl192)


Lesenswert?

Sebastian P. schrieb:
> Logiclevel Typ, damit ich den p-kanal "dicht" bekomme? (ist ja bei
> Ugs=0V komplett offen, richtig?)
Wenn's ein depletion-FET (selbstleitend), dann ja. Meist verwendet man 
aber enhancement-FETs (selbstsperrend). Vgs>=0V --> Sperren, negatives 
Vgs --> Leiten.

> Gibts empfehlenswerte p-kanal fets mit LL Input die für meine Anwendung
> passen würden?
Ja, einer davon ist der IRLML2244. Wenn du SMD ablehnst wird's 
schwierig, ich habe in meiner vor SMD Zeit erfolglos nach THT 
LogL-P-Mosfets gesucht.

: Bearbeitet durch User
von Sebastian P. (sebl)


Angehängte Dateien:

Lesenswert?

Tja dann wird das wohl was eigene Entwürfe angeht mein Debüt mit SMD 
Steinchen, reizt mich schon lange, aber lohnt sich wohl nur wenn man 
ordentlich 2-seitig platinen ätzen kann, womit ich noch keine Erfahrung 
hab.

Ich hab heute nachmittag mal ne Runde gelayoutet, Layout + Schaltplan im 
Anhang. Die 3-Fach klemme wird der Output zur Platine vom Kollegen, die 
untere 2-Fach klemme als Versorgung und oben noch 2 vorbereitete Inputs 
für Taster oder dergleichen um den Pic ansteuern zu können. Bin für 
Feedback offen da ich noch nicht sehr viel an Layouts gemacht hab und 
auch das nur frei Schnauze sozusagen.

von Max H. (hartl192)


Lesenswert?

Sebastian P. schrieb:
> aber lohnt sich wohl nur wenn man
> ordentlich 2-seitig platinen ätzen kann
Das würde ich nicht sagen, ich verwende SMD (vor allem 1206 und SOT23) 
auch auf Lochraster und wenn es das passende Bauteil nicht in THT gibt, 
lohnt es sich auf jeden Fall.

> Bin für
> Feedback offen
Ich würde einen Anschluss fürs Programmiergerät hinzufügen.
Wieso verwendest du eigentlich diesen alten PIC? Der hat kein einziges 
PWM Modul und neue PICs haben in der Regel bessere Peripherie und sind 
billiger, siehe: 
https://www.mikrocontroller.net/articles/PIC#Alte_und_neue_PICs
Ich würde noch darüber nachdenken, ob es nicht Vorteile dringen würde zu 
K2 noch einen Massepin hinzuzufügen.
Zusätzlich wären Pullups an den Gates der FETs nicht schlecht, da die 
IOs nach dem Reset als Eingänge konfiguriert sind und die Gates deshalb 
floaten und die undefiniert verhalten.

: Bearbeitet durch User
von Sascha (Gast)


Lesenswert?

Seht euch auch mal das an: http://www.zabex.de/site/sofabeleuchtung.html
Nen schönen RGB-Verlauf hinzubekommen ist garnicht so leicht! Es wird 
zwar ein Atmega mit C programmiert, aber da solltet ihr auch einige 
Tricks abkucken können. Die drei unabhängigen 16bit-PWM müsst ihr 
allerdings anders erzeugen, Atmega und PIC sind ja verschieden. 
Vielleicht kommt ihr auch mit ner 12bit PWM aus mit effektiv 6bit für 
die Farben statt 8.

von Erich (Gast)


Lesenswert?

Beschreibung PWM bei PIC16F887
http://www.mikroe.com/chapters/view/6/chapter-5-ccp-modules/
Ab der Stelle:  CCP1 in PWM mode

Dto., mit Code für Compiler (mit ASM und dem "BANKSEL" sollte man sich 
nicht mehr befassen...)
http://geekilyinteresting.wordpress.com/2013/09/06/playing-with-pics-4-dimming-leds-with-pwm/

Gruss

von Max H. (hartl192)


Lesenswert?

Erich schrieb:
> (mit ASM und dem "BANKSEL" sollte man sich nicht mehr befassen...)
Wenn er ASM bereits kann wird es sicher einfacher als eine Hochsprache 
zu lernen.

: Bearbeitet durch User
von Erich (Gast)


Lesenswert?

Max H. schrieb:
> Wenn er ASM bereits kann wird es sicher einfacher als eine Hochsprache
> zu lernen.

Jaja.
Ganz bestimmt.
Besonders wenn er das fertige und funktionsfähige C Programm selbst in 
seine ASM Umgebung umcodieren darf.
Deswegen baut man ja auch zuerst bei der Anschaffung eines neuen Auto 
das elektrische Licht aus und um auf 
http://de.wikipedia.org/wiki/Karbidlampe

Gruss

von Max H. (hartl192)


Lesenswert?

Erich schrieb:
> Jaja.
> Ganz bestimmt.
Schön dass du mir zustimmst.


> fertige und funktionsfähige C Programm
Das Problem bei deinem Programm ist nur, dass der 16F887 ein CCP Modul 
zu wenig hat und er wenn er bei diesem PIC bleiben will Soft PWM machen 
muss. Schade dass deine "fertige Lösung" einfach nur den ADC-Wert an 
einem PWM-Kanal ausgibt.

> Deswegen baut man ja auch zuerst bei der Anschaffung eines neuen Auto
> das elektrische Licht aus und um auf
> http://de.wikipedia.org/wiki/Karbidlampe
Der Vergleich hinkt, das el. Licht ist im Gegensatz zu deinem Link eine 
fertige und funktionstüchtige Lösung.

: Bearbeitet durch User
von Erich (Gast)


Lesenswert?

> fertige und funktionsfähige C Programm

Ok, danke für deine Hinweise, Max H. (hartl192)
Allerdings ist
>dass deine "fertige Lösung"
etwas übertrieben.

Ich habe lediglich GOOGLE bemüht mir Ergebnisse zu zeigen, wo genau der 
genannte uC in Verbindung mit "PWM" oder "dimming" benutzt wird.
Insofern wollte ich dem TE nur eine kleine Hilfestellung geben.
Das er irgendwas machen will, wozu sein von ihm herausgesuchter uC nicht 
ausreichende Peripherie hat, soweit habe ich seinen Text (zu meiner 
Schande) gar nicht gelesen.
Vielleicht sollte der TE insofern hier nochmals nachdenken und einen uC 
mit mehr Funktionalität wählen (und GOOGLE selbst nach geeigneten 
Beispielen absuchen).
Gruss

von Sebastian P. (sebl)


Lesenswert?

So ich muss das thema grad nochmal aufwärmen, hab grad mal wieder n 
Moment lust an der schaltung rumzudenken.

Ich werde letztenendes wohl mit einem PIC16F1503 arbeiten, an dem hab 
ich auch noch 3 pins frei für AD wandler, um den PWM Dutycycle von hand 
via trimmer oder poti einstellen zu können.

Was mir gerade noch Kopfzerbrechen bereitet ist das Highside schalten 
mit den P-Kanal Mosfets.

Funktioniert das so wie in dem Schaltplan einige Posts weiter oben 
gezeichnet? Also Source geht an die 5V, an den drain kommen die Anoden 
der LEDs, dahinter der Vorwiderstand und Schaltlogik, Das Gate hängt 
direkt (?) am PWM des Microcontrollers (Vorwiderstand um die 100 Ohm zur 
Inrushstrom-Begrenzung sinnvoll?)
Wenn die PWM Auf Low steht ist das Gate gegenüber Source negativ, der 
FET leitet und meine LED kann leuchten, zieht der µC das Gate auf 5V 
sperrt der FET, so richtig von der Logik her?
Mit welcher Frequenz lässt sich die PWM noch ohne große Verluste fahren? 
Strom wird nie über 1A kommen, eher im Bereich zwischen 100-500mA.
Ich layoute noch n bissl was dann kommt nochmal n Schaltplan + Layout

von Max H. (hartl192)


Lesenswert?

Sebastian P. schrieb:
> Wenn die PWM Auf Low steht ist das Gate gegenüber Source negativ, der
> FET leitet und meine LED kann leuchten, zieht der µC das Gate auf 5V
> sperrt der FET, so richtig von der Logik her?
Richtig. Wenn du willst, kannst du das PWM Signal vom PIC invertiert 
ausgeben lassen.

von Sebastian P. (sebl)


Angehängte Dateien:

Lesenswert?

So, die letzten Stunden mit Layouten verbracht, Vermutlich is das ganze 
stark verbesserungswürdig, aber schön sieht ne einseitige platine ja 
leider selten aus.

Mit der Kombination aus Reset und Vpp für die ICSP schnittstelle bin ich 
mir allerdings ganz und garnicht sicher. Da Reset ja normalerweise einen 
Pullup kriegt wenn man ihn via Jumper auslösen können will, da aber im 
Programmierfall auch die x V Programmierspannung drauf geht hab ich das 
ganze mit einer Schottkydiode abgeblockt, geht das so in der 
Konstellation?
Die Belegung der Buchsenleiste sollte passen um mit dem Brenner8p was 
anfangen zu können. Im schlimmsten Fall tritt wieder der fall mit dem µC 
umstecken ein, aber erstmal Kritik abwarten

Die beiden weiteren Jumper dienen, um im Programm irgendwelche Paramter 
von außen bestimmen zu können, die LEDs rechts oben dienen als 
Indikator, um ohne den rest der Schaltung Ergebnisse sehen zu können.

Soweit mal vorerst

von Stefan (Gast)


Lesenswert?

Dein µC Schaltbild, stimmt
nicht mit dem im Datenblatt
überein. Nochmal nachschauen.
So funktioniert es nicht.

von Sebastian P. (sebl)


Lesenswert?

Wenn du mir jetzt noch sagst wo der fehler sein soll? beim kurz 
überfliegen erschließt sich mir kein unterschied. Das schaltbild hab ich 
gestern erstellt und eigentlich mehrfach überprüft.

von Stefan (Gast)


Lesenswert?

Brille nicht geputz ? :-)
MCLR ist auf Pin 4, im Datenblatt.

von Max H. (hartl192)


Lesenswert?

Ich würde mich bei der Stiftleiste zum Flashen an der Pinbelegung des 
PICkits orientieren, der Brenner8 verwendet die gleiche.
Die Schottky wird manchmal so verbaut, ist aber laut Microchip nicht 
notwendig.

von Wolfgang A. (Gast)


Lesenswert?

Sebastian P. schrieb:
> Vermutlich is das ganze stark verbesserungswürdig

Eine Sache ist ganz einfach zu verbessern:
Wenn du beim Schaltplan den ganzen Karokram und die Pin-Nummern 
wegschaltest würdest, wäre der deutlich einfacher zu lesen.

Linien und Karos sind eine Schreibhilfe. Beim Lesen stören sie meist und 
verringern den Kontrast für die Leitungsverbindungen.

von Sebastian P. (sebl)


Angehängte Dateien:

Lesenswert?

Stefan schrieb:
> Brille nicht geputz ? :-)
> MCLR ist auf Pin 4, im Datenblatt.

Oha, den fehler hätte ich weiß gott nicht gefunden, hab das wohl mit dem 
RA4 durcheinandergeworfen, danke!

Karokram ist auch weg, ist mmn viel mehr zeichenhilfe als schreibhilfe 
damit die Bauteile nicht vollkommen rumtanzen, aber gut.

Am ICSP hatte ich Vpp und Vdd vertauscht, geändert und sollte passen 
jetzt

1 Vpp
2 Vdd
3 Vss
4 Data
5 Clock

So stehts im Brenner 8 Handbuch

Durch das Vertauschen von Pin3 mit Pin4 kam jetzt noch eine Brücke mehr 
dazu
Die Massefläche ist nur auf dem Bild so fleckig, im Ausdruck passt die 
durchgängige Fläche
Die Pads der Mosfets hab ich auch nochmal etwas nachgearbeitet.

Nächster Versuch

von Stefan (Gast)


Lesenswert?

Du hast im Layout die Maßefläsche als
Linien. Die Fläsche sollte gefüllt sein.
Druck mal aus, und schau mal ob du da
auch Linien hast oder ob die Maßefläsche gefüllt
ist. Ich würde noch einen Widerstand am Gate machen.

von Stefan (Gast)


Lesenswert?

Die Bohrung des Elkos scheint 0.7mm zu sein.
Wenn du die Bohren kannst ok.

von Sebastian P. (sebl)


Lesenswert?

Die bohrungen für die Elkos waren sogar nur 0,6, hab ich auf von Hand 
machbare Pads aufgebessert.

Die Massefläche muss bei Target offenbar in Streifen umgewandelt werden, 
um Inseln rauszukriegen, wenn man dabei den Streifenabstand auf 0 Setzt 
ist die Fläche sauber.

von Stefan (Gast)


Lesenswert?

Ja ist richtig mit den Maßefläschen.
Scheinst eine ältere Version zu benutzen.
In der neuen Targetversion haste keine
Linien mehr.
Brücke in Maßefläsche ist ohne Aura schwer zu
löten. Mußte ausprobieren ob du es hin
bekommst diese zu löten. Braucht man mehr Hitze zum
anlöten.

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.