Servosteuerung über USB mit dem SAM4S Xplained Pro

Raspberry Pi: Relais mit GPIO steuern (Kann 2019).

$config[ads_text] not found
Anonim

Servosteuerung über USB mit dem SAM4S Xplained Pro


Der erste Teil dieser zweiteiligen Serie konzentriert sich auf den Hardware-Aufbau und die Verwendung eines pulsweitenmodulierten Signals zur Steuerung eines Servos.

zusätzliche Informationen

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

Benötigte Hardware / Software

  • SAM4S Xplained Pro Evaluierungskit
  • PROTO1 Xplained Pro Erweiterungsplatine (nicht unbedingt notwendig, aber sehr hilfreich)
  • Atmel Studio
  • TowerPro SG92R Servo (oder ein gleichwertiges Servo)
  • AC / DC-Wandtrafo, 5 V (oder jede andere 5 V-Versorgung mit ausreichender Stromkapazität)
  • 2 Stecker-Stecker-Steckdrähte
  • 1 Stecker-Stecker-Überbrückungskabel

Eine weitere PWM-Anwendung

Wenn Sie sich die Artikel in den Hintergrundinformationen ansehen, werden Sie feststellen, dass ich in letzter Zeit ziemlich viele Informationen zur Verwendung eines pulsweitenmodulierten Signals (mit Hilfe eines Tiefpassfilters) als kostengünstiges digitales Analog-Analog-Wandler. Im Zuge der Erkundung dieses Themas habe ich gezeigt, wie man mit der Entwicklungsplattform SAM4S Xplained Pro PWM-Signale erzeugt. Angesichts all dieser PWM-Geschäfte ist es sinnvoll, eine andere Standardanwendung für PWM-Signale zu betrachten: die Servosteuerung.

Wie Sie wahrscheinlich wissen, bezieht sich der Begriff "Servo" (Abkürzung für Servomotor) üblicherweise auf einen PWM-gesteuerten Drehantrieb, der über eine Rückkopplung die Winkelposition seiner Ausgangswelle präzise steuert. Die Impulsbreite des Steuersignals entspricht einer Winkelposition, und der Motor dreht automatisch seine Welle auf der Grundlage der Stromimpulsbreite in die richtige Position; es ist ein einfaches und effektives Arrangement. Typische "Hobby" -Servos übernehmen ein Standardsteuerschema, bei dem ein 1-ms-Impuls der äußersten linken Position entspricht, 1, 5 ms dem Zentrum entspricht und 2 ms dem äußersten rechten entspricht. (Sie werden jedoch bald feststellen, dass diese Werte "Richtlinien" sind; einige Anpassungen sind möglicherweise erforderlich.)

Servo Specs-oder Fehlen davon

Der Servo, den ich für dieses Projekt verwenden werde, ist der TowerPro SG92R. Die Produktseite von Digi-Key für den SG92R weist Sie auf ein "Datenblatt" hin, das eines der informationsärmsten technischen Dokumente sein muss, die ich je gelesen habe. Es ist eine Gesamtsumme von zwei Seiten, von denen die erste vollständig aus einem Foto besteht. Die einzige solide Information ist, dass das Servo um 180 ° gedreht werden kann. Es erwähnt auch die Standard-Puls-zu-Position-Beziehung, die (zumindest für mein Servo) sich als sehr ungenau herausgestellt hat. Keine Strom- oder Spannungsspezifikationen, kein Drehmoment, keine Totbandbreite, keine Empfehlungen für die PWM-Frequenz und, am schlimmsten, keine Pinbelegung. Das Datenblatt sagt einiges über die Verwendung des Servos in Verbindung mit Arduino Hardware-Informationen aus, die für mich völlig nutzlos sind, da ich kein Arduino Produkt besitze und nie benutzt habe.

Zum Glück für Sie, werde ich die notwendigen Informationen zur Verfügung stellen, so dass Sie das Datenblatt überspringen können. Die nominale Versorgungsspannung beträgt 5 V, und ich kann bestätigen, dass 5 V funktioniert, weil ich das verwende. Eine Webseite behauptet, dass der akzeptable Bereich 3 V bis 7, 2 V ist. Ich kann auch bestätigen, dass Sie das Steuersignal mit 3, 3 V Logik erfolgreich steuern können, selbst wenn die Versorgungsspannung 5 V beträgt. Ich habe den Strom nicht gemessen, aber die Servo funktioniert gut mit einem 5 V, 1 A Wand-Transformator. Das Thema der PWM-Frequenz der Servosteuerung ist ein bisschen kompliziert, also werde ich die Details umgehen; es genügt zu sagen, dass eine gute Wahl irgendwo im Bereich von 40 bis 60 Hz liegt. Wir werden 50 Hz in diesem Projekt verwenden. Schließlich, hier ist die Pinbelegung:

Beachten Sie, dass wir die "CDC" -Version des USB-Moduls verwenden. Dies steht für "Kommunikationsgeräteklasse", eine generische Klasse, die in jeder Situation verwendet werden kann, in der grundlegende serielle Kommunikation erforderlich ist. Das CDC-Modul des ASF macht es erstaunlich einfach, eine virtuelle COM-Port-Verbindung mit dem PC herzustellen, und eine virtuelle COM-Port-Verbindung ist genau das, was wir brauchen - eine unkomplizierte Schnittstelle, die es uns ermöglicht, mit dem PC unter Verwendung eines Standard-Terminalprogramms oder eines anderen zu kommunizieren Programm, das die Funktionalität der seriellen Schnittstelle beinhaltet. Wir werden den USB-Teil dieses Projekts im nächsten Artikel behandeln.

Hier ist der Code, den wir verwenden werden, um zu bestätigen, dass wir das Servo richtig steuern können.

 #include#define PWM0H_SERVO IOPORT_CREATE_PIN(PIOA, 23) #define PWM_CLOCKSOURCE_FREQ 1000000 #define PWM_FREQ 50 #define PWM_PERIOD_TICKS PWM_CLOCKSOURCE_FREQ/PWM_FREQ #define PULSE_WIDTH_FULL_LEFT_TICKS 1000 #define PULSE_WIDTH_CENTER_TICKS 1500 #define PULSE_WIDTH_FULL_RIGHT_TICKS 2000 pwm_channel_t PWM0_config; 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(PWM0H_SERVO, PIO_TYPE_PIO_PERIPH_B); //enable the peripheral clock for the PWM hardware pmc_enable_periph_clk(ID_PWM); //disable the PWM channel until it is properly configured pwm_channel_disable(PWM, PWM_CHANNEL_0); //PWM clock configuration pwm_clock_t PWM_clock_config = { .ul_clka = PWM_CLOCKSOURCE_FREQ, .ul_clkb = 0, .ul_mck = sysclk_get_cpu_hz() }; //apply the clock configuration pwm_init(PWM, &PWM_clock_config); //select channel 0 PWM0_config.channel = PWM_CHANNEL_0; //select clock A PWM0_config.ul_prescaler = PWM_CMR_CPRE_CLKA; //active state is logic high PWM0_config.polarity = PWM_HIGH; //left-aligned mode PWM0_config.alignment = PWM_ALIGN_LEFT; PWM0_config.ul_period = PWM_PERIOD_TICKS; PWM0_config.ul_duty = PULSE_WIDTH_CENTER_TICKS; //apply the channel configuration pwm_channel_init(PWM, &PWM0_config); //configuration is complete, so enable the channel pwm_channel_enable(PWM, PWM_CHANNEL_0); while(1) { delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_FULL_LEFT_TICKS); delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_FULL_RIGHT_TICKS); delay_ms(1000); pwm_channel_update_duty(PWM, &PWM0_config, PULSE_WIDTH_CENTER_TICKS); } } 

Anhand der Kommentare und beschreibenden Kennungen sollten Sie verstehen, was im Code vor sich geht. Wenn Sie jedoch etwas mit der PWM-Funktionalität oder der Port-Pin-Konfiguration zu tun haben, finden Sie weitere Informationen unter Pulsweitenmodulation mit dem SAM4S Xplained Pro.

Die PWM-Timing-Konfiguration wird von den sechs Präprozessordefinitionen am Anfang des Codes bestimmt:

 #define PWM_CLOCKSOURCE_FREQ 1000000 #define PWM_FREQ 50 #define PWM_PERIOD_TICKS PWM_CLOCKSOURCE_FREQ/PWM_FREQ #define PULSE_WIDTH_FULL_LEFT_TICKS 1000 #define PULSE_WIDTH_CENTER_TICKS 1500 #define PULSE_WIDTH_FULL_RIGHT_TICKS 2000 

Der Takt, der die PWM-Hardware steuert, ist auf 1 MHz eingestellt. Die PWM-Periode und die Pulsbreite sind in Einheiten von Taktzeiten definiert, so dass die Werte, die wir in die Perioden- und Pulsbreitenregister laden, den Dauer in Mikrosekunden entsprechen. Die oben gezeigten Werte entsprechen den Nennimpulsbreiten für die Positionen der äußersten linken, mittleren und äußersten rechten Welle: 1000 Takt-Ticks für 1 ms, 1500 Takt-Ticks für 1, 5 ms und 2000 Takt-Ticks für 2 ms. Die unendliche while-Schleife am Ende der main () - Funktion durchläuft diese drei Positionen mit aufeinanderfolgenden Aktualisierungen des Pulsweitenregisters, die durch eine Verzögerung von einer Sekunde getrennt sind. Das folgende Video zeigt die Ergebnisse:

Wie Sie sehen können, ist der Drehbereich der Welle nicht annähernd 180 °; es sieht eher wie 90 ° aus. Mit ein wenig Versuch und Irrtum fand ich heraus, dass die folgenden Werte die erwartete 180 ° Rotation erzeugen:

 #define PULSE_WIDTH_FULL_LEFT_TICKS 480 #define PULSE_WIDTH_CENTER_TICKS 1440 #define PULSE_WIDTH_FULL_RIGHT_TICKS 2350 

Sie können den folgenden Link verwenden, um die Quell- und Projektdateien herunterzuladen:

Quell- und Projektdateien

Fazit

Wir haben unsere Hardware eingerichtet und einige grundlegende Firmware für die Servo-Steuerung implementiert. Wir haben auch die Pulsbreiten festgelegt, die die Welle tatsächlich nach links, rechts und links bewegen. Im nächsten Artikel werden wir USB-Funktionalität integrieren, so dass wir das Servo von einem PC aus steuern können.

Nächster Artikel in der Serie: Servosteuerung über USB mit dem SAM4S Xplained Pro, Teil 2

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