Forum: Mikrocontroller und Digitale Elektronik PWM mit LPC1768.


von Alram L. (alram)


Lesenswert?

Hallo,

für meine ersten Erfahrungen mit der ARM Welt, habe ich mir das MiniDK2 
Board mit einem LPC1768 und Display aus der Bucht besorgt.

Aus dem LPCOpen Projekten versuche ich gerade mein eigenes Projekt 
aufzubauen (mit LPCXpresso). Ansteuerung der LED's, Taster und auch HTTP 
Server funktionieren schon. Ich verwende dich gleiche Struktur wie 
LPCOpen (Chip- , Boardlayer und Applikation) Das LPCXpresso Board 
Projekt (für 1769) habe ich dafür kopiert und verändert.

Als nächsten Schritt würde ich gerne die Displayhintergrundbeleuchtung 
regeln (dimmen). Ein-/Ausschalten funktioniert schon - ist ja einfach.

Die HG-Beleuchtung hängt am Port 1.26 welcher ja neben normalen IO auch 
noch
- 'MC1B — Motor control PWM channel 1, output B' und
- 'PWM1[6] — Pulse Width Modulator 1, channel 6 output.'
kann.

Hier habe ich schon das erste Entscheidungsproblem: was ist der 
Unterschied zwischen PWM und Motor Control PWM?

Ich bin jetzt davon ausgegangen, dass PWM das Einfachere / Richtigere 
ist. Allerdings stoße ich beim Versuch erste Schritte im Code zu 
implementieren auf Probleme. Im LPCOpen konnte ich keine 
Demoprojekte/Beispielcode für PWM finden. Also mit Google gesucht und 
ein paar Beispielcodezeilen sind schnell gefunden. Einer der ersten 
Treffer schlägt vor, den Timer so zu initialisieren:

LPC_SC->PCLKSEL0 |= 1 << 12;

Sieht einfach aus - doch bevor ich zu weiteren Codezeilen komme, 
scheitere allerdings schon daran, dass ich kein Headerfile finde, das 
mir irgendwie LPC_SC oder PCLKSEL0 anbietet. Natürlich könnte ich mich 
jetzt durchquälen anfangen und alle Speicheradressen der Register (lt. 
Datenblatt) selber anlegen und so meinen PWM so zum laufen bekommen 
(oder zumindest zu versuchen).
Ich glaube aber, dass ich da irgendwo gehörig auf dem falschen Weg bin 
...

Kann mir jemand einen Tipp geben oder hat jemand einen 'einfachen' PWM 
Ausgang mit dem LPC1768 am laufen und das ganze in einem LPCXpresso 
Projekt (mit LCPOpen)?

Danke vorab für eure Hilfe!

vG Alram

von Didi S. (kokisan2000)


Lesenswert?

Hallo Alram,

LPC_SC findest Du im CMSIS Cortex-M3 Core Peripheral Access Layer Header 
File für NXP LPC17xx Device Series. Ohne diese Headerdatei zu 
programmieren macht die Sache deutlich komplexer.

Zu finden zum Beispiel hier für das LPC1768 mbed:

https://mbed.org/users/mbed_official/code/mbed/file/6473597d706e/TARGET_LPC1768/LPC17xx.h

Hier etwas zum experimentieren und lernen:
http://openlpc.com/4e26f1/examples/pwm.lpc17xx

Viel Erfolg

von Didi S. (kokisan2000)


Lesenswert?

Sehr hilfreich bei der Initialisierung des LPC ist folgendes Tool, was 
ich immer wiede gerne verwende:

http://alexan.edaboard.eu/

Nicht nur für die PWM ....

von leluno (Gast)


Lesenswert?

Alram Lechner schrieb:
> irgendwie LPC_SC oder PCLKSEL0

Das ist ein Krampf mit den Registerbezeichnungen, die leider in diversen 
Varianten verwendet werden.

LPC_SC->PCLKSEL0 sieht sehr nach LPC17xx.h aus:

[c]typedef struct
{
  __IO uint32_t FLASHCFG;               /* Flash Accelerator Module 
*/
       uint32_t RESERVED0[31];
  __IO uint32_t PLL0CON;                /* Clocking and Power Control 
*/
  __IO uint32_t PLL0CFG;
  __I  uint32_t PLL0STAT;
  __O  uint32_t PLL0FEED;
       uint32_t RESERVED1[4];
  __IO uint32_t PLL1CON;
  __IO uint32_t PLL1CFG;
  __I  uint32_t PLL1STAT;
  __O  uint32_t PLL1FEED;
       uint32_t RESERVED2[4];
  __IO uint32_t PCON;
  __IO uint32_t PCONP;
       uint32_t RESERVED3[15];
  __IO uint32_t CCLKCFG;
  __IO uint32_t USBCLKCFG;
  __IO uint32_t CLKSRCSEL;
  __IO uint32_t  CANSLEEPCLR;
  __IO uint32_t  CANWAKEFLAGS;
       uint32_t RESERVED4[10];
  __IO uint32_t EXTINT;                 /* External Interrupts 
*/
       uint32_t RESERVED5;
  __IO uint32_t EXTMODE;
  __IO uint32_t EXTPOLAR;
       uint32_t RESERVED6[12];
  __IO uint32_t RSID;                   /* Reset 
*/
       uint32_t RESERVED7[7];
  __IO uint32_t SCS;                    /* Syscon Miscellaneous 
Registers     */
  __IO uint32_t IRCTRIM;                /* Clock Dividers 
*/
  __IO uint32_t PCLKSEL0;
  __IO uint32_t PCLKSEL1;
       uint32_t RESERVED8[4];
  __IO uint32_t USBIntSt;               /* USB Device/OTG Interrupt 
Register  */
  __IO uint32_t DMAREQSEL;
  __IO uint32_t CLKOUTCFG;              /* Clock Output Configuration 
*/
 } LPC_SC_TypeDef;
[\c]

Du musst diese Datei in dein Projekt einbinden.

von Alram L. (alram)


Lesenswert?

Danke für eure Hinweise. Hab mir nun von NXP die CMSIS Library 
(lpc175x_6x_cmsis_driver_library_0.zip) heruntergeladen. Darin befindet 
sich auch die von euch erwähnte LPC17xx.h mit den gesuchten Inhalten.

Mein Problem ist nun: Ich habe die LCPOpen Library 
(http://www.lpcware.com/content/nxpfile/lpcopen-software-development-platform-lpc17xx-packages) 
heruntergeladen und mit dieser begonnen. Dort befindet sich im 
Chip-Projekt die Datei chip_lpc175x_6x.h. diese widerum beinhaltet nur 
(mehr) einen Bruchteil der LPC17xx.h bzw. dürften die Inhalte der 
ursprünglichen LPC17xx.h auf zig andere Headerfiles verteilt worden 
sein.  Diese werden dann in der chip_lpc175x_6x.h inkludiert. Und am 
Ende der Datei (nach den includes) befindet sich folgender, netter 
Hinweis:

/* FIXME : PWM drivers */

grrr

Scheint so, als ob PWM im LPCOpen einfach ignoriert wurde. Vermutlich 
bleibt mir jetzt nichts anderes über, als die LPC17xx.h manuell um meine 
benötigten Teile in mein Projekt zu mischen ....

Oder kennt wer Alternativen?

vG Alram

von leluno (Gast)


Lesenswert?

Ich habe letztens codeREd auf CMSIS_CORE_LPC17xx  umgestellt. Das ist 
die neueste CMSIS-Version. Vorteile gegenüber der Vorgängerversion sind 
für mich nicht erkennbar. LPCOpen habe ich noch nicht probiert. Ich gehe 
mal davon aus dass CMSIS_CORE_LPC17xx NXP-Standard ist. Es ist dann 
sicher kein Fehler, diesen Standard zu verwenden. Also, neueste Version 
von CodeRed nehmen und ein CMSIS-Grundprojekt erstellen. In dieses 
Grundprojekt kann man dann alles andere einbinden.

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.