Tüm projeler
04Hazır
Ultrasonik Mesafe
Ses dalgasıyla mesafe ölç, yakınlık LED rengine dönüşsün.
TimingPulse
01
Ne öğrenirsin
Bir pinden puls gönderip dönüş süresini bir timer ile ölçerek mesafe hesaplama. Sensör tıpkı bir yarasa gibi ses gönderip yankısını dinler.
02
Gereken parçalar
03
Bağlantı
| Modül | Kart | Not |
|---|---|---|
| VCC | 3.3V | 5V değil! Echo 5V verirse çip zarar görür. |
| GND | GND | — |
| Trig | PB2 | Tetik çıkışı |
| Echo | PB3 | Yankı girişi |
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/timer.h"7 8#define LED_ALL (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3)9#define TRIG GPIO_PIN_2 // PB210#define ECHO GPIO_PIN_3 // PB311#define PWM_STEPS 25612 13// Software PWM: show the color for 'periods' cycles14static void showColor(uint8_t r, uint8_t g, uint8_t b, uint32_t periods) {15 volatile uint32_t p, i;16 for (p = 0; p < periods; p++)17 for (i = 0; i < PWM_STEPS; i++) {18 uint8_t out = 0;19 if (i < r) out |= GPIO_PIN_1;20 if (i < g) out |= GPIO_PIN_3;21 if (i < b) out |= GPIO_PIN_2;22 GPIOPinWrite(GPIO_PORTF_BASE, LED_ALL, out);23 SysCtlDelay(2);24 }25}26 27static void delayUs(uint32_t us) { SysCtlDelay((SysCtlClockGet() / 3000000) * us); }28 29// One measurement -> distance in cm (0 = no echo / out of range)30static uint32_t measureCm(void) {31 uint32_t start, end, timeout;32 33 GPIOPinWrite(GPIO_PORTB_BASE, TRIG, TRIG); // 10 us trigger pulse34 delayUs(10);35 GPIOPinWrite(GPIO_PORTB_BASE, TRIG, 0);36 37 timeout = 600000; // wait for echo to go high38 while (GPIOPinRead(GPIO_PORTB_BASE, ECHO) == 0)39 if (--timeout == 0) return 0;40 start = TimerValueGet(TIMER0_BASE, TIMER_A);41 42 timeout = 600000; // wait for echo to go low43 while (GPIOPinRead(GPIO_PORTB_BASE, ECHO) != 0)44 if (--timeout == 0) return 0;45 end = TimerValueGet(TIMER0_BASE, TIMER_A);46 47 return ((end - start) / 50) / 58; // 50 MHz -> us, then us/58 = cm48}49 50int main(void) {51 SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |52 SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);53 54 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);55 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)) {}56 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LED_ALL);57 58 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);59 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB)) {}60 GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, TRIG);61 GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, ECHO);62 63 SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // free-running us timer64 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0)) {}65 TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC_UP);66 TimerLoadSet(TIMER0_BASE, TIMER_A, 0xFFFFFFFF);67 TimerEnable(TIMER0_BASE, TIMER_A);68 69 while (1) {70 uint32_t cm = measureCm();71 if (cm == 0 || cm > 60) {72 showColor(0, 0, 40, 20); // no reading -> dim blue73 } else {74 if (cm < 2) cm = 2;75 if (cm > 50) cm = 50;76 uint8_t t = (uint8_t)(((cm - 2) * 255) / 48);77 showColor(255 - t, 0, t, 20); // near = red, far = blue78 }79 SysCtlDelay(SysCtlClockGet() / 30);80 }81}05
Çıktı
Aşağıdaki simülasyon tarayıcında çalışır — gerçek kartın davranışını taklit eder.
- mesafe
- 25 cm
- echo süresi
- 1450 us
- RGB
- 133,0,122