Tüm projeler
03Hazır

Joystick ile Kısık Işık

Joystick'i ittikçe LED parlaklık değiştirir — ilk harici sensör.

ADCGPIO
01

Ne öğrenirsin

Harici bir analog sinyali ADC ile okumak. Joystick'in bir ekseni tam bir potansiyometre gibi davranır.

02

Gereken parçalar

03

Bağlantı

ModülKartNot
GNDGND
+5V3.3V5V değil! Kart 5V'a dayanmaz.
VRxPE3Analog giriş (AIN0)
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/adc.h"
7 
8#define LED_ALL (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3)
9#define PWM_STEPS 256
10 
11// Software PWM: show the color for 'periods' cycles
12static void showColor(uint8_t r, uint8_t g, uint8_t b, uint32_t periods) {
13 volatile uint32_t p, i;
14 for (p = 0; p < periods; p++)
15 for (i = 0; i < PWM_STEPS; i++) {
16 uint8_t out = 0;
17 if (i < r) out |= GPIO_PIN_1;
18 if (i < g) out |= GPIO_PIN_3;
19 if (i < b) out |= GPIO_PIN_2;
20 GPIOPinWrite(GPIO_PORTF_BASE, LED_ALL, out);
21 SysCtlDelay(2);
22 }
23}
24 
25// Read joystick X axis (PE3 / AIN0) -> 0..4095
26static uint32_t readAxis(void) {
27 uint32_t buf[1];
28 ADCProcessorTrigger(ADC0_BASE, 1);
29 while (!ADCIntStatus(ADC0_BASE, 1, false)) {}
30 ADCIntClear(ADC0_BASE, 1);
31 ADCSequenceDataGet(ADC0_BASE, 1, buf);
32 return buf[0];
33}
34 
35int main(void) {
36 SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |
37 SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
38 
39 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
40 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)) {}
41 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, LED_ALL);
42 
43 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
44 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
45 while (!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)) {}
46 GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3); // PE3 = AIN0
47 
48 ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
49 ADCSequenceStepConfigure(ADC0_BASE, 1, 0,
50 ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
51 ADCSequenceEnable(ADC0_BASE, 1);
52 ADCIntClear(ADC0_BASE, 1);
53 
54 while (1) {
55 uint8_t bri = (uint8_t)(readAxis() / 16); // 0..255
56 showColor(bri, bri, bri, 20); // white at that brightness
57 }
58}
05

Çıktı

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

ADC
2048
parlaklik
128/255
PE3
1.65 V