Projekte

Pulsweitenmodulation mit dem SAM4S Xplained Pro

SAM4S Xplained Pro - OLED Demo (November 2018).

Anonim

Pulsweitenmodulation mit dem SAM4S Xplained Pro


Dieser Artikel enthält alles, was Sie wissen müssen, um pulsweitenmodulierte Signale mit Atmels SAM4S Xplained Pro-Entwicklungsboard zu erzeugen.

zusätzliche Informationen

  • Einführung in die Projektentwicklung mit dem Atmel SAM4S Xplained Pro
  • Verwandeln Sie Ihre PWM in einen DAC
  • Tiefpassfilter Ein PWM-Signal in eine analoge Spannung filtern

Benötigte Hardware / Software

  • SAM4S Xplained Pro Evaluierungskit
  • Atmel Studio

Vor einem PWM-DAC benötigen wir PWM

Dieser Artikel soll auf einer kürzlichen Zwei-Artikel-Reihe aufbauen, die die Technik untersucht, mit der die Digital-Analog-Umwandlung durch Tiefpassfilterung eines pulsweitenmodulierten Signals erreicht wird. (Klicken Sie hier für Teil 1 und hier für Teil 2.) Die allgemeine Schlussfolgerung aus diesen Artikeln ist, dass ein PWM-DAC eine Überlegung wert ist, wenn

  1. Sie können oder wollen keinen externen DAC oder einen Mikrocontroller mit integriertem DAC verwenden,
  2. Die PWM-Hardware bietet eine DAC-Auflösung, die für Ihre Anwendung geeignet ist.
  3. Ihre digitale Versorgungsspannung ist genau und vorhersehbar, und
  4. Sie können eine akzeptable Ausgangswelligkeit und Einschwingzeit mit nur einem einfachen RC-Tiefpassfilter erreichen.

Wir haben die theoretische Seite dieses Themas behandelt, und jetzt ist es an der Zeit, die Theorie in die Praxis umzusetzen und dann einige Ergebnisse aus der Praxis zu betrachten. Dazu verwenden wir das SAM4S Xplained Pro "Evaluierungskit", mit dem Atmel etwas bezeichnet, das ich als "Entwicklungsboard" bezeichnen würde. Wir werden auch die Erweiterungskarten PROTO1 und I / O1 verwenden, die beide im Starterkit SAM4S Xplained Pro enthalten sind. Tatsächlich sind die Erweiterungskarten für dieses Projekt jedoch eine Bequemlichkeit, keine Notwendigkeit; Wenn Sie nur die SAM4S-Karte haben, können Sie die Tiefpassschaltung mit einem Steckbrett oder etwas anderem aufbauen.

Bevor wir ein PWM-Signal in eine digital gesteuerte analoge Spannung umwandeln können, müssen wir ein PWM-Signal erzeugen, und das ist meiner Meinung nach nicht so einfach, wie man es erwarten könnte. Es scheint mir, dass der PWM-Teil des Atmel Software Frameworks (ASF) etwas schlecht dokumentiert ist, und es gibt verschiedene kleine Details, die Sie richtig machen müssen, bevor Sie tatsächlich die erwartete PWM-Wellenform auf dem erwarteten Pin sehen. Daher werden wir den Rest dieses Artikels der Beherrschung der PWM-Schnittstelle widmen, und im nächsten Artikel werden wir die DAC-Funktionalität integrieren.

Und vergessen Sie übrigens nicht, das PWM ASF-Modul zu dem Projekt hinzuzufügen, bevor Sie versuchen, die PWM-Funktionalität des ASF zu verwenden. Das Verfahren zum Hinzufügen eines ASF-Moduls wird im Abschnitt "Schritt für Schritt" von Intro zur Projektentwicklung mit Atmel SAM4S Xplained Pro erläutert.

Signal an Pin anschließen

Der Mikrocontroller auf der SAM4S-Karte unterstützt vier separate PWM-Kanäle; Jeder Kanal hat komplementäre Ausgänge. Insgesamt haben wir also bis zu acht PWM-Signale. Das SAM4S Xplained Pro Benutzerhandbuch sagt uns, dass zwei dieser Signale in der Standard-Extension Header Pinbelegung enthalten sind:

In diesem Projekt benötigen wir keine komplementären Signale, daher verwenden wir nur Pin 7. Wenn Sie die PROTO1-Erweiterungskarte verwenden, ist dieser Pin bequem mit "PWM +" gekennzeichnet; Ist dies nicht der Fall, können Sie die PIN Nummer 7 im EXT1-Header leicht finden.

Wenn wir uns die Pinbelegung für EXT1 ansehen, sehen wir, dass Pin 7 uns das positive (dh nicht invertierte) Signal vom PWM-Kanal 0 gibt, und der Port-Pin, der dieses Signal antreibt, ist PA23:

Wie können wir dem Mikrocontroller mitteilen, dass er das PWM-Signal an Pin PA23 "hljs"> # define PWM_DAC IOPORT_CREATE_PIN (PIOA, 23)

Das IOPORT_CREATE_PIN-Makro ermöglicht es uns, den Namen "PWM_DAC" an Pin 23 im Parallel-Input / Output-Controller A anzuhängen. Jetzt müssen wir den Pin PWM_DAC so konfigurieren, dass er für eine Peripheriefunktion und nicht als Allzweck-I / O verwendet wird. und außerdem müssen wir es für die richtige periphere Linie konfigurieren. Jeder Pin kann mit bis zu vier Peripheriesignalen verbunden werden; Diese werden als periphere A, B, C und D bezeichnet. Tabelle 39-2 (Seite 955) des SAM4S-Serie-Datenblattes sagt uns, welche der vier benötigen wir:

Jetzt können wir einen Aufruf von pio_configure_pin () richtig formulieren:

 pio_configure_pin(PWM_DAC, PIO_TYPE_PIO_PERIPH_B); 

PWM-Uhr

Als nächstes müssen wir die Uhr konfigurieren, die die PWM-Hardware steuert. Das PWM-Modul unterstützt zwei Takte, die von programmierbaren Teilern abgeleitet werden (bezeichnet als A und B), aber wir brauchen nur eine, so dass wir Takt B deaktivieren. Die PWM-Takte werden vom peripheren Takt des Mikrocontrollers abgeleitet. Wir müssen die Einzelheiten der Taktungshardware nicht besprechen, da die ASF die Low-Level-Konfiguration für uns übernimmt; Wenn Sie interessiert sind, können Sie jedoch im Datenblatt der SAM4S-Serie auf Seite 957 nachlesen.

Der erste Schritt in der Konfiguration der Uhr besteht darin, den Peripherietakt für die PWM-Hardware zu aktivieren:

 pmc_enable_periph_clk(ID_PWM); 

Jetzt verwenden wir eine "pwm_clock_t" -Struktur, um die Taktraten einzustellen; Diese Struktur ist in der Header-Datei "pwm.h" wie folgt definiert:

 /** Input parameters when initializing PWM */ typedef struct { /** Frequency of clock A in Hz (set 0 to turn it off) */ uint32_t ul_clka; /** Frequency of clock B in Hz (set 0 to turn it off) */ uint32_t ul_clkb; /** Frequency of master clock in Hz */ uint32_t ul_mck; } pwm_clock_t; 

Hier ist eine Beispielkonfiguration:

 pwm_clock_t PWMDAC_clock_config = { .ul_clka = 1000000, .ul_clkb = 0, .ul_mck = sysclk_get_cpu_hz() }; 

Hier haben wir Uhr A auf 1 MHz eingestellt; Uhr B ist deaktiviert. Wir liefern die Haupttaktfrequenz durch einen Aufruf von sysclk_get_cpu_hz (). Um diese Konfiguration anzuwenden, verwenden wir die Funktion pwm_init ():

 pwm_init(PWM, &PWMDAC_clock_config); 

PWM-Optionen

Wir kommen näher - wir müssen nur den PWM-Kanal selbst konfigurieren und dann den Kanal aktivieren. Die ASF macht die PWM-Konfiguration recht praktisch: Eine Struktur vom Typ "pwm_channel_t" gibt uns Zugriff auf die verschiedenen Optionen und dann übergeben wir die Adresse dieser Struktur an die Funktion pwm_channel_init (). Zuerst gebe ich dir den Code, dann besprechen wir die Details.

 pwm_channel_instance.channel = PWM_CHANNEL_0; pwm_channel_instance.ul_prescaler = PWM_CMR_CPRE_CLKA; pwm_channel_instance.polarity = PWM_HIGH; pwm_channel_instance.alignment = PWM_ALIGN_LEFT; pwm_channel_instance.ul_period = 20; pwm_channel_instance.ul_duty = 5; 

  • pwm_channel_instance.channel: Wir benutzen Kanal 0.
  • pwm_channel_instance.ul_prescaler: Wir müssen die Taktquelle auswählen; PWM_CMR_CPRE_CLKA entspricht dem Takt A.
  • pwm_channel_instance.polarity: Wenn dies auf PWM_HIGH gesetzt ist, definiert der "ul_duty" -Wert die Breite des logisch hohen Teils des Signals (mit anderen Worten, logisch hoch ist der aktive Zustand); Wenn es auf PWM_LOW gesetzt ist, definiert der "ul_duty" -Wert die Breite des logisch niedrigen Teils des Signals.
  • pwm_channel_instance.alignment: Weitere Informationen zum linksbündigen Modus und zum zentrierten Modus finden Sie auf Seite 960-961 im SAM4S-Datenblatt. Im Allgemeinen möchten Sie linksbündig Modus; Center-Aligned-Modus ist nützlich, wenn Sie zwei nicht überlappende PWM-Wellenformen benötigen. Der offensichtlichste Unterschied zwischen diesen Einstellungen besteht darin, dass der Wechsel vom links ausgerichteten Modus zum zentrierten Modus dazu führt, dass sich die PWM-Periode und die Impulsbreite im aktiven Zustand um einen Faktor 2 erhöhen.
  • pwm_channel_instance.ul_period: Die ASF-Dokumentation beschreibt dieses Mitglied der Struktur als "period cycle value", und das sind so viele Informationen, wie Sie leicht herausfinden können, was mit ul_period zu tun ist. Hier ist eine Beschreibung, die tatsächlich hilfreich ist: ul_period definiert die Dauer des PWM-Zyklus in Einheiten von Takt-Ticks . In diesem Beispiel haben wir den Takt A als Taktquelle für unseren PWM-Kanal gewählt und den Takt A für eine Frequenz von 1 MHz konfiguriert. Somit ist die Einheit für ul_period 1 μs Takt-Ticks. Der oben angegebene Beispielcode hat pwm_channel_instance.ul_period = 20, was bedeutet, dass die PWM-Periode 20 × 1 μs = 20 μs beträgt.
  • pwm_channel_instance.ul_duty: Lassen Sie sich nicht durch die Member-ID täuschen: Dies definiert nicht das Tastverhältnis . Tastverhältnis ist die Pulsbreite des aktiven Zustands dividiert durch die Periode, normalerweise ausgedrückt in Prozent. Im Gegensatz dazu ist ul_duty die Dauer des Pulses, wiederum in Einheiten von Takt-Ticks. Im obigen Beispiel haben wir pwm_channel_instance.ul_duty = 5; somit beträgt die Impulsdauer im aktiven Zustand 5 × 1 μs = 5 μs, was einem Tastverhältnis von (5 μs) / (20 μs) = 25% entspricht.
  • Jetzt wenden wir die Konfiguration mit einem Aufruf von pwm_channel_init () an, und danach können wir den Kanal mit pwm_channel_enable () aktivieren.

Ergebnisse

Sehen wir uns einige Oszilloskop-Messungen für verschiedene PWM-Konfigurationen an. Wir beginnen mit der Konfiguration, die in den obigen Codeauszügen angegeben ist: Taktquelle = 1 MHz, Polarität = PWM_HIGH, Ausrichtung = PWM_ALIGN_LEFT, ul_period = 20, ul_duty = 5. Beachten Sie, dass die relevanten Timing-Eigenschaften auf der rechten Seite des angezeigt werden Umfang erfasst.

Wenn wir alles gleich halten, aber auf Polarität = PWM_LOW umschalten, bekommen wir folgendes:

Wenn wir zu PWM_HIGH zurückkehren und dann zu alignment = PWM_ALIGN_CENTER wechseln, sehen wir Folgendes:

Die nächste Wellenform ist wieder linksbündig, und ich habe ul_duty auf 10 erhöht:

Und hier habe ich ul_period auf 30 erhöht:

Und schließlich, hier ist die Wellenform, wenn ich alles gleich (ul_duty = 10, ul_period = 30) behalte aber die Taktfrequenz A auf 10 MHz erhöhe.

Sie können den folgenden Link verwenden, um die Quell- und Projektdateien herunterzuladen, und der gesamte "main.c" -Code wird nach dem Link angegeben. Im nächsten Artikel werden wir unser neu gewonnenes PWM-Know-how nutzen, um die PWM-Digital-Analog-Wandlung zu untersuchen.

Quell- und Projektdateien

 #include#define PWM_DAC IOPORT_CREATE_PIN(PIOA, 23) pwm_channel_t pwm_channel_instance; int main (void) { //clock configuration and initialization sysclk_init(); /*Disable the watchdog timer and configure/initialize port pins connected to various components incorporated into the SAM4S Xplained development platform, eg, the NAND flash, the OLED interface, the LEDs, the SW0 pushbutton.*/ board_init(); //connect peripheral B to pin A23 pio_configure_pin(PWM_DAC, PIO_TYPE_PIO_PERIPH_B); //enable the peripheral clock for the PWM hardware pmc_enable_periph_clk(ID_PWM); //disable the channel until it is properly configured pwm_channel_disable(PWM, PWM_CHANNEL_0); //PWM clock configuration pwm_clock_t PWMDAC_clock_config = { .ul_clka = 1000000, .ul_clkb = 0, .ul_mck = sysclk_get_cpu_hz() }; //apply the clock configuration pwm_init(PWM, &PWMDAC_clock_config); //see the article for details pwm_channel_instance.channel = PWM_CHANNEL_0; pwm_channel_instance.ul_prescaler = PWM_CMR_CPRE_CLKA; pwm_channel_instance.polarity = PWM_HIGH; pwm_channel_instance.alignment = PWM_ALIGN_LEFT; pwm_channel_instance.ul_period = 20; pwm_channel_instance.ul_duty = 5; //apply the channel configuration pwm_channel_init(PWM, &pwm_channel_instance); //configuration is complete, so enable the channel pwm_channel_enable(PWM, PWM_CHANNEL_0); while(1); } 

Nächster Artikel in der Serie: PWM Digital-zu-Analog-Konvertierung mit dem SAM4S Xplained Pro

Gib diesem Projekt einen Versuch für dich selbst! Holen Sie sich die Stückliste.