Tüm projeler
05Hazır

Servo Süpürme

Donanımsal PWM ile bir servo motoru açıyla konumlandır.

PWM
01

Ne öğrenirsin

Gerçek (donanımsal) PWM üretimi ve darbe genişliğiyle açı kontrolü. 20 ms'lik periyotta darbe genişliği açıyı belirler.

02

Gereken parçalar

03

Bağlantı

ModülKartNot
GND (kahverengi)GND
VCC (kırmızı)VBUS (5V)Servo gücü; sinyal değil.
Signal (turuncu)PB6PWM çıkışı (M0PWM0)
04

Kod

main.c
1#include <stdint.h>
2#include <stdbool.h>
3#include "inc/hw_memmap.h"
4#include "driverlib/sysctl.h"
5#include "driverlib/gpio.h"
6#include "driverlib/pin_map.h"
7#include "driverlib/pwm.h"
8 
9#define PWM_PERIOD 15625u // 20 ms at 781.25 kHz -> 50 Hz
10#define PULSE_0DEG 781u // ~1.0 ms
11#define PULSE_180DEG 1562u // ~2.0 ms
12 
13static void delayMs(uint32_t ms) { SysCtlDelay((SysCtlClockGet() / 3000) * ms); }
14 
15// Set servo angle 0..180 -> map to pulse width counts
16static void servoWrite(uint32_t deg) {
17 if (deg > 180) deg = 180;
18 uint32_t pulse = PULSE_0DEG + ((PULSE_180DEG - PULSE_0DEG) * deg) / 180;
19 PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0, pulse);
20}
21 
22int main(void) {
23 SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |
24 SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
25 SysCtlPWMClockSet(SYSCTL_PWMDIV_64); // PWM clock = sysclk / 64
26 
27 SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
28 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
29 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_PWM0)) {}
30 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB)) {}
31 
32 GPIOPinConfigure(GPIO_PB6_M0PWM0); // route PB6 to PWM
33 GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);
34 
35 PWMGenConfigure(PWM0_BASE, PWM_GEN_0,
36 PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
37 PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, PWM_PERIOD);
38 
39 servoWrite(90); // start centered
40 PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT, true);
41 PWMGenEnable(PWM0_BASE, PWM_GEN_0);
42 
43 while (1) {
44 uint32_t d;
45 for (d = 0; d <= 180; d += 2) { servoWrite(d); delayMs(15); } // 0 -> 180
46 delayMs(300);
47 for (d = 180; d > 0; d -= 2) { servoWrite(d); delayMs(15); } // 180 -> 0
48 delayMs(300);
49 }
50}
05

Çıktı

Aşağıdaki simülasyon tarayıcında çalışır — gerçek kartın davranışını taklit eder.

açı
90°
darbe
1.50 ms
periyot
20 ms (50 Hz)