Forum: Mikrocontroller und Digitale Elektronik PWM als Taktquelle für IC (AT91SAM7)


von Peter P. (uncle-sam7)


Lesenswert?

Hallo NG,

gibt es die Möglichkeit, über PWM einen Takt für einen am MC 
angeschlossenen IC zu erzeugen?

Wenn dem so wäre gibt es auch eine Möglichkeit zu erfahren, wie es 
gerade auf dem PWM-Ausgang aussieht (high oder low)?

Danke für jede Hilfe,
Peter

von holger (Gast)


Lesenswert?

>gibt es die Möglichkeit, über PWM einen Takt für einen am MC
>angeschlossenen IC zu erzeugen?

Ja.

>Wenn dem so wäre gibt es auch eine Möglichkeit zu erfahren, wie es
>gerade auf dem PWM-Ausgang aussieht (high oder low)?

Ja.

von Peter P. (uncle-sam7)


Lesenswert?

Aha, gibt es da was zu beachten?

Hast Du vielleicht ein Beispiel?

von holger (Gast)


Lesenswert?

>Aha, gibt es da was zu beachten?

Vieleicht.

>Hast Du vielleicht ein Beispiel?

Nein.

von Peter P. (uncle-sam7)


Lesenswert?

Hmmm. Schade eigentlich.

von Frank B. (foobar)


Lesenswert?

Nun ja, er hat umfassend und vollständig geantwortet, in Anbetracht der 
von dir gegebenen Informationen :-)

von Frank B. (foobar)


Lesenswert?

Habe gerade den Titel gesehen, also du hast zumindest schonmal die 
Microcontrollerfamilie angegeben, hatte ich eben übersehen, daher kann 
man schon etwas mehr antworten: Den AT91SAM7S128, den ich kenne, hat 
einen PWM-Controller. Den kann man so programmieren, daß er neben dem 
PWM-Ausgang auch einen Interrupt generiert, sodaß du zumindest den 
Anfang einer Periode mitbekommst (und ich glaube man könnte auch auf den 
Flankenwechsel einen Interrupt programmieren). Wenn du zu beliebigen 
Zeitpunkten den Status abfragen willst, wäre es am einfachsten, den 
Ausgang noch auf einen freien Port reinzugeben und den dann einfach 
auszulesen (ich glaube man kann den Port, der als PWM-Function 
geschaltet ist, nicht einlesen). Die Frequenz darf aber nicht zu hoch 
sein, sonst wird das nicht gehen.

Warum brauchst du das denn? Meist sind externe Chips ja per SPI o.ä. 
angeschlossen.

von Helmut S. (helmuts)


Lesenswert?

Ja.

Mit PWM kannst du hardwaremäßig nur durch 2^n teilen, wenn du einen Takt 
erzeugen willst. Die PWM wird auf 50% Tastverhältnis eingestellt.

Fclk/2,
Fclk/4
Fclk/8
Fclk/16
...


Vielleicht gibt es ja auch einen uP bei dem man den PWM-Mastertakt mit 
beliebigem Teilerfaktor aus dem Quartztakt erzeugen kann.

von Frank B. (foobar)


Lesenswert?

Helmut S. schrieb:
> Mit PWM kannst du hardwaremäßig nur durch 2^n teilen, wenn du einen Takt
> erzeugen willst. Die PWM wird auf 50% Tastverhältnis eingestellt.
>
> Fclk/2,
> Fclk/4
> Fclk/8
> Fclk/16
> ...
>
>
> Vielleicht gibt es ja auch einen uP bei dem man den PWM-Mastertakt mit
> beliebigem Teilerfaktor aus dem Quartztakt erzeugen kann.

Ja, geht mit der AT91SAM7-Famílie (siehe Titel des Postings). Diese 
Chips haben ein Capture Compare Register, sodaß man auch viele andere 
beliebige ganzzahlige Teiler hinbekommt.

von Peter P. (uncle-sam7)


Lesenswert?

Ist dann 1MHz zu viel, oder geht das noch mit PWM?

von Frank B. (foobar)


Lesenswert?

PWM generieren mit 1 MHz ist kein Problem, aber kommt drauf an, was du 
sonst noch machen willst. Wenn du z.B. 55 MHz maximalen internen Takt 
verwendest, dann wird es eng per Interrupt, wegen Latenz und bei 55 
Takten pro PWM-Takt kann man auch nicht allzuviel Code schreiben. Also 
in einer Endlosschleife einen Port-Pin testen, wo das Singal wieder 
reinkommt. Timings vorher anschauen, ob der PIO so schnell ist.

Was willst du denn machen, vielleicht gibt es Alternativen?

von Peter P. (uncle-sam7)


Lesenswert?

...also eigentlich möchte ich einen "externen" Chip Takten (SID 8580). 
Der benötigt 1MHz. Ich muss nicht die ganze Zeit testen, ob der Pegel 
gerade high oder low ist. Ich brauche das eigentlich nur, wenn ich Daten 
an den Chip schicke...

Benötigen die 1MHz PWM denn auch Rechenpower (wenn man nicht einen 
Interrupt verwendet, der immer was ausführt...). Es soll wirklich nur 
die Taktquelle sein, solange ich nichts "schreibe"...

von Frank B. (foobar)


Lesenswert?

Der PWM braucht keine Rechenpower, läuft parallel zum Programm in 
Hardware ab. Aber brauchst du wirklich den Status des Taktsignals zu 
messen? Hier ist ein Timing-Diagramm am Ende:

http://www.sidmusic.org/sid/sidtech3.html

für den Schreibzyklus und das steht nichts von einer Maximalzeit. Also 
Chipselect initial auf High, Adress- und Datenleitung auf Ausgang, r/w 
permanent auf low. Dann die Adresse- und Datenleitungen auf Ausgang 
setzen und das zu programmierende Register setzen. Dann Chipselect auf 
low, etwas warten (mindestens ein SID-Takt), chipselect wieder auf high 
und das Register sollte eigentlich beschrieben sein.

Mit einem AT91SAM7 macht aber ein SID als externer Chip meiner Meinung 
nach keinen Sinn, da der bei 55 MHz schnell genug ist, daß man das in 
Software emulieren kann, notfalls auch mit Code aus dem VICE-Projekt 
einen original SID, mit Filter usw., falls du einen Chip-Tune Player 
bauen willst :-) Aber viel interessanter wäre es, selbst so eine 
Soundsynthese zu entwickeln.

von Peter P. (uncle-sam7)


Lesenswert?

Hallo Frank Buss,

danke für Deine Beiträge.

Ich habs schon mal probiert mit der Emulation im ARM komplett.
Die ausgabe funktioniert auch schon. Allerdings ohne Filter. Selbst ohne 
Filter hat er es nicht geschafft, die Daten mit 44KHz zu erzeugen. Also 
ich bezweifle, dass das geht. Zumal man ja den 6510 auch noch emulieren 
muss. Zugegeben, das ist kein Hexenwerk, aber in der Summe wirds mit 
55MHz schon sehr eng. Also wenn, dann denk ich geht das nur in 100% 
Assembler mit viel Gefühl fürs Optimieren...

MfG
Peter

von Peter P. (uncle-sam7)


Lesenswert?

Hallo,

werde jetzt dann gleich mit dem Löten loslegen.

Wäre klasse, wenn noch jemand ein Beispiel hätte, wie ich auf PA0, PA1 
oder PA2 ein PWM mit 1MHz hinbekomme (brauche keine Interrupts. Soll nur 
"schwingen")...

Vielen Dank schon mal,
Peter

von Frank B. (foobar)


Lesenswert?

Welche Entwicklungsumgebung hast du denn? Oder ein Dev-Kit mit Linux? Da 
wäre glaube ich ein PWM-Treiber bereits enthalten.

Standlone geht natürlich auch. Dazu bietet Atmel eine große Auswahl an 
fertigen Beispielen. Hast du dir schonmal das Software Package hier 
angesehen?

http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4343

Dort drin unter packages\basic-pwm-project-at91sam7s-ek-*.zip findes du 
ein fertiges Beispiel für verschiedene Compiler. Brauchst nur noch die 
Frequenz in dem define zu ändern und schon sollte es laufen (ggf. noch 
anpassen an dein Board). Oder die Teile rauskopieren, die für dich 
interessant sind, wenn du schon eine Entwicklungsumgebung hast.

von Peter P. (uncle-sam7)


Lesenswert?

Also ich verwende yagarto. Hab das Demo-Projekt schon gesehen. 
Allerdings hab ich es noch nicht auseinandergenommen. Ich habe nur 
gesehen, dass die wohl per Interrupt die PWM ändern, so dass die LED 
"einblendet" und "ausblendet"... Aber wie gesagt. Wenig Zeit und 
ziemlich müde :-)

Also am liebsten wäre mir

<pseudocode>
Watchdog aus
PWM an Pin pa0
PWM 1MHz
PWM start
</pseudocode>

MfG
Peter

von Frank B. (foobar)


Lesenswert?

Den Interrupt-Code brauchst du ja nicht. Ein wenig mehr Eigeninitiave 
musst du aber schon zeigen, sonst kannst du das Projekt ja gleich an 
einen professionellen Entwickler in Auftrag geben :-)

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.