Sabtu, 25 April 2026

M2 : Tugas Pendahuluan 1

 

[KEMBALI KE MENU SEBELUMNYA] 



Tugas Pendahuluan 1
 Heart Rate Indikator

1. Prosedur 
[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
5. Selesai.


Hardware :

a) Mikrokontroler STM32F103C8
STM32F103C8 board – Microscale





2. Heartbeat Sensor






3. Push Button Sensor








4. Power Supply

 
5. LED



6. Buzzer


7. Resistor


8. Breadboard




Diagram Blok  :




Rangkaian Simulasi
 


Prinsip Kerja : 

Rangkaian heart rate indikator ini bekerja dengan memanfaatkan sensor detak jantung sebagai input analog yang terhubung ke pin ADC mikrokontroler STM32F103C8T6. Sensor akan menghasilkan perubahan tegangan setiap kali denyut nadi terdeteksi, kemudian sinyal tersebut dibaca oleh ADC dan diproses menggunakan metode moving average agar pembacaan lebih stabil serta mengurangi noise. Nilai hasil filter selanjutnya dibandingkan dengan nilai ambang adaptif (threshold) untuk menentukan apakah terjadi satu detakan jantung. Setiap detakan yang berhasil dideteksi akan dihitung selang waktunya menggunakan fungsi timer internal mikrokontroler sehingga diperoleh nilai BPM (Beat Per Minute). Pada saat yang sama, LED hijau akan menyala sesaat mengikuti pola detak jantung yang terbaca, sehingga visualisasi denyut dapat terlihat secara langsung sesuai ritme nadi pengguna.

Setelah nilai BPM diperoleh, mikrokontroler akan mengelompokkan kondisi detak jantung ke dalam beberapa kategori indikator. Jika BPM berada pada rentang 30–60 maka LED kuning menyala sebagai tanda detak lambat, sedangkan jika BPM berada pada rentang normal hingga 80 BPM maka buzzer tetap mati dan LED hijau hanya berkedip sesuai detakan sensor. Apabila BPM melebihi 80 BPM maka LED merah menyala sebagai indikator detak terlalu cepat dan buzzer akan aktif sebagai alarm peringatan. Selain itu, push button yang dipasang pada pin interrupt berfungsi untuk mematikan atau mengaktifkan buzzer secara manual ketika alarm berbunyi tanpa mengganggu proses pembacaan sensor. Dengan demikian, rangkaian ini tidak hanya mampu memonitor denyut jantung secara real-time, tetapi juga memberikan tampilan visual berupa kedipan LED hijau yang sinkron dengan detak jantung yang terukur.


Flowchart :



Listing Program :

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;

uint32_t adcValue = 0;
uint32_t filteredValue = 0;
uint8_t beatDetected = 0;
uint32_t BPM = 0;
uint32_t lastBeatTime = 0;
uint32_t interval = 0;
uint8_t buzzerOff = 0;

#define FILTER_SIZE 10
uint16_t buffer[FILTER_SIZE];
uint8_t indexBuf = 0;

uint16_t moving_average(uint16_t val)
{
 buffer[indexBuf++] = val;
 if(indexBuf >= FILTER_SIZE) indexBuf = 0;

 uint32_t sum = 0;
 for(int i=0;i<FILTER_SIZE;i++) sum += buffer[i];

 return sum / FILTER_SIZE;
}

void LED_Hijau() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}

void LED_Kuning() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
}

void LED_Merah() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}

void LED_Mati() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10, GPIO_PIN_RESET);
}

void Buzzer_On() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);
}

void Buzzer_Off() {
 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 if(GPIO_Pin == GPIO_PIN_1)
 {
  buzzerOff = !buzzerOff;
 }
}

void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);

int main(void)
{
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_ADC1_Init();

 uint32_t baseline = 0;
 uint32_t greenLedTime = 0;
 uint8_t greenLedPulse = 0;

 while (1)
 {
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1, 10);
  adcValue = HAL_ADC_GetValue(&hadc1);

  filteredValue = moving_average(adcValue);

  baseline = (baseline * 9 + filteredValue) / 10;
  uint32_t threshold = baseline + 50;

  if(filteredValue > threshold && beatDetected == 0)
  {
   beatDetected = 1;

   uint32_t now = HAL_GetTick();

   if(lastBeatTime != 0)
   {
    interval = now - lastBeatTime;
    BPM = 60000 / interval;
   }

   lastBeatTime = now;

   LED_Mati();
   LED_Hijau();
   greenLedTime = now;
   greenLedPulse = 1;
  }

  if(filteredValue < threshold)
  {
   beatDetected = 0;
  }

  if(greenLedPulse && HAL_GetTick() - greenLedTime >= 80)
  {
   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
   greenLedPulse = 0;
  }

  if(HAL_GetTick() - lastBeatTime > 2000)
  {
   BPM = 0;
  }

  if(BPM > 0)
  {
   if(BPM > 30 && BPM < 60)
   {
    LED_Kuning();
    Buzzer_Off();
    buzzerOff = 0;
   }
   else if(BPM <= 80)
   {
    Buzzer_Off();
    buzzerOff = 0;
   }
   else
   {
    LED_Merah();
    if(!buzzerOff)
     Buzzer_On();
    else
     Buzzer_Off();
   }
  }
  else
  {
   LED_Mati();
   Buzzer_Off();
  }

  HAL_Delay(5);
 }
}

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 HAL_RCC_OscConfig(&RCC_OscInitStruct);

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
                               RCC_CLOCKTYPE_SYSCLK |
                               RCC_CLOCKTYPE_PCLK1 |
                               RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}

void MX_ADC1_Init(void)
{
 ADC_ChannelConfTypeDef sConfig = {0};

 __HAL_RCC_ADC1_CLK_ENABLE();

 hadc1.Instance = ADC1;
 hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
 hadc1.Init.ContinuousConvMode = DISABLE;
 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
 hadc1.Init.NbrOfConversion = 1;
 HAL_ADC_Init(&hadc1);

 sConfig.Channel = ADC_CHANNEL_0;
 sConfig.Rank = ADC_REGULAR_RANK_1;
 sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;

 HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

void MX_GPIO_Init(void)
{
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_1;
 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(EXTI1_IRQn);

 GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
}


kondisi LED warna menyala hijau dengan pola yang sama dengan detak jantung






Download HTML [Download]
Download File Rangkaian [percobaan 1][Download]
Download Video Simulasi [Download]
Download Listing Program [Download]
Datasheet Mikrokontroler STM32F103C8 [Download]
Datasheet Sensor Heartbeat [Download]

Datasheet Sensor Push Button [Download]
Datasheet LED [Download]

Modul 2 : PWM, ADC, & INTERRUPT

 



MODUL 2

PWM, ADC, & INTERRUPT

1. Pendahuluan [kembali]

a) Asistensi dilakukan 1x

b) Praktikum dilakukan 1x


2. Tujuan [kembali]

a) Memahami cara penggunaan PWM, ADC, dan Interrupt pada Development Board yang digunakan

b) Memahami cara menggunakan komponen input dan output yang mengimplementasikan PWM, ADC, dan Interrupt pada Development Board yang digunakan

3. Alat dan Bahan [kembali]

    a) STM32 NUCLEO G474RE

    b) STM32F103C8

    c) Heartbeat Sensor



    d) Push Button



    e) LED



    f) Buzzer



    g) Resistor



    h) LDR Sensor





    i) Motor Sensor

    j) Adaptor

    k) Breadboard



4. Dasar Teori [kembali]

4.1 ADC

    ADC atau Analog to Digital Converter merupakan salah satu perangkat elektronika yang digunakan sebagai penghubung dalam pemrosesan sinyal analog oleh sistem digital. Fungsi utama dari fitur ini adalah mengubah sinyal masukan yang masih dalam bentuk sinyal analog menjadi sinyal digital dengan bentuk kode-kode digital.

    Pada mikrokontroler STM32, terdapat dua ADC (Analog-to-Digital Converter) 12-bit yang masing-masing memiliki hingga 16 kanal eksternal. ADC ini dapat beroperasi dalam mode single-shot atau scan mode. Pada scan mode, konversi dilakukan secara otomatis pada sekelompok input analog yang dipilih. Selain itu, ADC ini memiliki fitur tambahan seperti simultaneous sample and hold, interleaved sample and hold, serta single shunt. ADC juga dapat dihubungkan dengan DMA untuk meningkatkan efisiensi transfer data.

    Mikrokontroler ini dilengkapi dengan fitur analog watchdog yang memungkinkan pemantauan tegangan hasil konversi dengan akurasi tinggi, serta dapat menghasilkan interupsi jika tegangan berada di luar ambang batas yang telah diprogram. Selain itu, ADC dapat disinkronkan dengan timer internal (TIMx dan TIM1) untuk memulai konversi, pemicu injeksi, serta pemicu DMA, sehingga memungkinkan aplikasi untuk melakukan konversi ADC secara terkoordinasi dengan timer.

    Pada STM32 Nucleo G474RE, terdapat blok ADC (Analog-to-Digital Converter) yang digunakan untuk mengubah sinyal analog menjadi data digital. STM32 G474RE memiliki beberapa unit ADC (seperti ADC1, ADC2, ADC3, dan ADC4) yang memungkinkan proses konversi dilakukan secara paralel untuk meningkatkan kecepatan akuisisi data. Setiap ADC mendukung resolusi hingga 12-bit, dengan fitur tambahan seperti oversampling untuk meningkatkan akurasi dan mengurangi noise pada sinyal.

    Setiap unit ADC dapat mengakses banyak channel input yang terhubung ke berbagai pin GPIO, sehingga memungkinkan pembacaan berbagai sensor secara fleksibel. ADC pada STM32 G474RE juga dilengkapi dengan fitur scan mode untuk membaca beberapa channel secara berurutan, serta mode continuous conversion yang memungkinkan pembacaan data secara terus-menerus tanpa intervensi CPU. Selain itu, terdapat injected channel yang berfungsi sebagai channel prioritas untuk kebutuhan real-time.

    ADC ini juga mendukung berbagai sumber trigger, seperti timer (TIM) atau sinyal eksternal, sehingga dapat disinkronkan dengan modul lain seperti PWM untuk aplikasi kontrol tertutup (closed-loop). Proses konversi dilakukan melalui tahap sampling dan quantization, dengan hasil akhir disimpan pada register data ADC. Dengan fitur-fitur tersebut, ADC pada STM32 G474RE sangat cocok digunakan dalam aplikasi seperti pembacaan sensor, monitoring tegangan, serta sistem kendali berbasis sinyal analog yang membutuhkan kecepatan dan presisi tinggi.

4.2 PWM

    PWM (Pulse Width Modulation) adalah salah satu teknik modulasi dengan mengubah lebar pulsa (duty cylce) dengan nilai amplitudo dan frekuensi yang tetap. Satu siklus pulsa merupakan kondisi high kemudian berada di zona transisi ke kondisi low. Lebar pulsa PWM berbanding lurus dengan amplitudo sinyal asli yang belum termodulasi.

    Duty Cycle adalah perbandingan antara waktu ON (lebar pulsa High) dengan perioda. Duty Cycle biasanya dinyatakan dalam bentuk persen (%).



Gambar 1. Duty Cycle

Duty Cycle = tON / ttotal

Ton = Waktu ON atau Waktu dimana tegangan keluaran berada pada posisi tinggi (high atau 1)

Toff = Waktu OFF atau Waktu dimana tegangan keluaran berada pada posisi rendah (low atau 0)

Ttotal = Waktu satu siklus atau penjumlahan antara Ton dengan Toff atau disebut juga dengan “periode satu gelombang”

    PWM pada STM32 dihasilkan menggunakan timer internal yang berfungsi sebagai penghitung waktu dengan berbagai mode operasi. Mikrokontroler ini memiliki empat timer 16-bit (TIM1–TIM4), yang dapat dikonfigurasi untuk menghasilkan sinyal dengan frekuensi dan duty cycle tertentu. Timer bekerja dengan menghitung hingga nilai tertentu berdasarkan frekuensi clock, lalu mengubah status register untuk menghasilkan gelombang persegi.

    STM32 memiliki 15 pin yang mendukung PWM, beberapa di antaranya berasal dari timer tingkat lanjut seperti TIM1, yang memiliki fitur tambahan seperti complementary output. Selain menghasilkan sinyal PWM, timer juga bisa digunakan untuk mengukur sinyal eksternal (input capture), menghasilkan sinyal berbasis waktu (output compare), dan membuat satu pulsa berdasarkan trigger (one pulse mode). PWM sering digunakan untuk mengontrol kecepatan motor, mengatur kecerahan LED, dan berbagai aplikasi berbasis waktu lainnya.

    Pada STM32 Nucleo G474RE, PWM dihasilkan melalui blok timer (TIM) yang terdiri dari beberapa jenis, seperti advanced-control timer (TIM1, TIM8), general-purpose timer (TIM2–TIM5), dan basic timer. Setiap timer memiliki beberapa channel yang dapat digunakan untuk menghasilkan sinyal PWM, sehingga memungkinkan banyak output PWM dikendalikan secara bersamaan pada berbagai pin GPIO. Timer pada STM32 G474RE umumnya memiliki resolusi hingga 16-bit atau lebih (tergantung jenis timer), dilengkapi dengan prescaler untuk pengaturan frekuensi yang presisi, serta register pembanding (CCR) untuk mengatur duty cycle dari 0–100%.

    Selain itu, setiap channel PWM dapat dikonfigurasi secara independen, baik dalam mode edge-aligned maupun center-aligned, sehingga cocok untuk aplikasi seperti kontrol motor dan konversi daya. STM32 G474RE juga mendukung fitur lanjutan seperti complementary output, dead-time insertion, break input, dan sinkronisasi antar timer, yang sangat penting dalam sistem power electronics dan inverter. Pengaturan PWM dapat dilakukan secara fleksibel melalui register timer atau menggunakan library seperti HAL/LL, serta dapat diaktifkan atau dihentikan secara terpusat, memungkinkan sinkronisasi beberapa sinyal PWM untuk aplikasi yang lebih kompleks dan presisi tinggi.

4.3 INTERRUPT

    Interrupt adalah mekanisme yang memungkinkan suatu instruksi atau perangkat I/O untuk menghentikan sementara eksekusi normal prosesor agar dapat diproses lebih dulu seperti memiliki prioritas tertinggi. Misalnya, saat prosesor menjalankan tugas utama, ia juga dapat terus memantau apakah ada kejadian atau sinyal dari sensor yang memicu interrupt. Ketika terjadi interrupt eksternal, prosesor akan menghentikan sementara tugas utamanya untuk menangani interrupt terlebih dahulu, kemudian melanjutkan eksekusi normal setelah selesai menangani interrupt tersebut. Fungsi yang menangani interrupt disebut Interrupt Service Routine (ISR), yang dieksekusi secara otomatis setiap kali interrupt terjadi.

    Pada STM32F103C8, semua pin GPIO dapat digunakan sebagai pin interrupt, berbeda dengan Arduino Uno yang hanya memiliki pin tertentu (misalnya pin 2 dan 3). Untuk mengaktifkan interrupt di STM32 menggunakan Arduino IDE, digunakan fungsi attachInterrupt(digitalPinToInterrupt(pin), ISR, mode). Parameter pin menentukan pin mana yang digunakan untuk interrupt, ISR adalah fungsi yang dijalankan saat interrupt terjadi, dan mode menentukan jenis perubahan sinyal yang memicu interrupt. Mode yang tersedia adalah RISING (dari LOW ke HIGH), FALLING (dari HIGH ke LOW), dan CHANGE (baik dari LOW ke HIGH maupun HIGH ke LOW). Saat menggunakan lebih dari satu interrupt secara bersamaan, terkadang perlu memperhatikan batasan tertentu dalam pemrograman.

    Pada STM32 Nucleo G474RE, sistem interrupt merupakan mekanisme yang memungkinkan mikrokontroler merespons suatu kejadian (event) secara langsung tanpa harus terus-menerus melakukan polling. Dengan interrupt, CPU dapat menghentikan sementara proses utama untuk menjalankan fungsi khusus yang disebut Interrupt Service Routine (ISR), sehingga meningkatkan efisiensi dan respons sistem secara real-time.

    STM32 G474RE menggunakan NVIC (Nested Vectored Interrupt Controller) untuk mengatur berbagai sumber interrupt, seperti dari timer (TIM), ADC, UART, GPIO (external interrupt), dan periferal lainnya. Setiap sumber interrupt memiliki prioritas tertentu yang dapat diatur, sehingga memungkinkan penanganan beberapa interrupt secara bersamaan (nested interrupt). Selain itu, sistem ini mendukung preemption dan subpriority untuk pengelolaan interrupt yang lebih kompleks.

    Interrupt dapat dipicu oleh berbagai kondisi, seperti perubahan logika pada pin GPIO (EXTI), selesainya konversi ADC, overflow pada timer, atau penerimaan data komunikasi. Ketika interrupt terjadi, program akan lompat ke ISR yang sesuai, kemudian setelah selesai, eksekusi akan kembali ke program utama. STM32 G474RE juga menyediakan fitur enable/disable interrupt secara fleksibel melalui register maupun library seperti HAL.

    Dengan adanya interrupt, STM32 G474RE sangat cocok untuk aplikasi real-time seperti sistem kendali, monitoring sensor, komunikasi data, dan otomasi, karena mampu merespons kejadian penting dengan cepat tanpa membebani CPU secara terus-menerus.

4.4 STM32 NUCLEO G474RE

STM32 NUCLEO-G474RE merupakan papan pengembangan (development board) berbasis mikrokontroler STM32G474RET6 yang dikembangkan oleh STMicroelectronics. Board ini dirancang untuk memudahkan proses pembelajaran, pengujian, dan pengembangan aplikasi sistem tertanam (embedded system), baik untuk pemula maupun tingkat lanjut. STM32 Nucleo-G474RE mengintegrasikan antarmuka ST-LINK debugger/programmer secara onboard sehingga pengguna dapat langsung melakukan pemrograman dan debugging tanpa perangkat tambahan.

Adapun spesifikasi dari STM32 NUCLEO-G474RE adalah sebagai berikut:

Gambar 2. STM32 Nucleo G474RE

Gambar 3. PinOut STM32 Nucleo G474RE

4.5 STM32F103C8

STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain. Adapun spesifikasi dari STM32F4 yang digunakan dalam praktikum ini adalah sebagai berikut:

Gambar 4. STM32F103C8

Gambar 5. Pinout Stm32 F103C8T6


A. BAGIAN-BAGIAN PENDUKUNG

1. STM32 NUCLEO G474RE

1. RAM (Random Access Memory)

    RAM (Random Access Memory) pada STM32 NUCLEO-G474RE digunakan sebagai memori sementara untuk menyimpan data selama program berjalan. Mikrokontroler STM32G474RET6 memiliki RAM sebesar 128 KB yang berfungsi untuk menyimpan variabel, buffer data, stack, dan heap.

2. Memori Flash Eksternal

    STM32 NUCLEO-G474RE tidak menggunakan memori flash eksternal. Seluruh program dan data permanen disimpan pada memori Flash internal mikrokontroler STM32G474RET6 dengan kapasitas 512 KB. Memori flash ini bersifat non-volatile, sehingga data dan program tetap tersimpan meskipun catu daya dimatikan.

3. Crystal Oscillator

    STM32 NUCLEO-G474RE menggunakan osilator internal (HSI – High Speed Internal) sebagai sumber clock utama secara default. Penggunaan clock internal ini membuat board dapat beroperasi tanpa memerlukan crystal oscillator eksternal. Clock berfungsi sebagai sumber waktu untuk mengatur kecepatan kerja CPU dan seluruh peripheral.

4. Regulator Tegangan

    Untuk memastikan pasokan tegangan yang stabil ke mikrokontroler.

5. Pin GPIO (General Purpose Input/Output):

    Pin GPIO pada STM32 NUCLEO-G474RE digunakan sebagai antarmuka input dan output digital yang fleksibel


2. STM32

1. RAM (Random Access Memory)

    STM32F103C8 dilengkapi dengan 20KB SRAM on-chip. Kapasitas RAM ini memungkinkan mikrokontroler menjalankan berbagai aplikasi serta menyimpan data sementara selama eksekusi program.

2. Memori Flash Internal

    STM32F103C8 memiliki memori flash internal sebesar 64KB atau 128KB, yang digunakan untuk menyimpan firmware dan program pengguna. Memori ini memungkinkan penyimpanan kode program secara permanen tanpa memerlukan media penyimpanan eksternal.

3. Crystal Oscillator

    STM32F103C8 menggunakan crystal oscillator eksternal (biasanya 8MHz) yang bekerja dengan PLL untuk meningkatkan frekuensi clock hingga 72MHz. Sinyal clock yang stabil ini penting untuk mengatur kecepatan operasi mikrokontroler dan komponen lainnya.

4. Regulator Tegangan

    STM32F103C8 memiliki sistem pengaturan tegangan internal yang memastikan pasokan daya stabil ke mikrokontroler. Tegangan operasi yang didukung berkisar antara 2.0V hingga 3.6V.

5. Pin GPIO (General Purpose Input/Output)

    STM32F103C8 memiliki hingga 37 pin GPIO yang dapat digunakan untuk menghubungkan berbagai perangkat eksternal seperti sensor, motor, LED, serta komunikasi dengan antarmuka seperti UART, SPI, dan I²C.

Minggu, 12 April 2026

Modul 1 : Laporan Akhir 2

 

 [KEMBALI KE MENU SEBELUMNYA]



Laporan Akhir Percobaan 2
Sistem Deteksi Jarak pada Parkir Mundur

1. Prosedur 
[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32 NUCLEO-G474RE di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
5. Selesai.


Hardware :

a) Mikrokontroler STM32 NUCLEO-G474RE








2. Infrared Sensor

Infrared Sensor Module



3. Buzzer


4. Power Supply

 
5. RGB LED
Jual LED RGB 4 PIN WARNA MERAH HIJAU BIRU 5mm ( ARDUINO ) - Common Cathode  - Jakarta Barat - Ardushop-id | Tokopedia

6. Resistor 1k Ohm



7. Switch



8. Adaptor



9. Breadboard



Diagram Blok  :




Rangkaian Simulasi Sebelum dirunning:






Prinsip Kerja : 
 

Percobaan 2 menggunakan STM32 NUCLEO-G474RE (pada rangkaian diimplementasikan sebagai NUCLEO-C031C6) untuk mensimulasikan sistem deteksi jarak parkir mundur pada kendaraan. Switch pada PA0 berperan sebagai kondisi "gigi mundur aktif" — hanya ketika switch ini dalam kondisi SET (HIGH), mikrokontroler akan membaca data dari IR Sensor pada PA1. Jika IR Sensor mendeteksi objek (GPIO_PIN_RESET karena pull-down), LED Merah pada PB1 dan Buzzer pada PB2 dinyalakan sebagai peringatan, sementara LED Hijau pada PB0 dipadamkan. Sebaliknya, saat tidak ada objek terdeteksi, LED Hijau menyala menandakan area parkir aman. Delay HAL_Delay(50) ditambahkan di akhir setiap iterasi untuk mencegah pembacaan sensor yang terlalu cepat dan menstabilkan debounce, sekaligus menjaga responsivitas sistem tetap baik bagi pengguna.



Flowchart :





Listing Program :

a. main.c

#include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

while (1)

{

if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);

}

else

{

if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET)

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);

}

else

{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);

}

}

HAL_Delay(50);

}

}

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |

RCC_CLOCKTYPE_SYSCLK

| RCC_CLOCKTYPE_PCLK1;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) !=

HAL_OK)

{

Error_Handler();

}

}

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLDOWN;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

void Error_Handler(void)

{

__disable_irq();

while (1)

{

}

}


b. main.h

#ifndef __MAIN_H

#define __MAIN_H

#ifdef __cplusplus

extern "C" {

#endif

#include "stm32c0xx_hal.h"

void Error_Handler(void);

#define BUTTON_REVERSE_Pin GPIO_PIN_0

#define BUTTON_REVERSE_GPIO_Port GPIOA

#define IR_SENSOR_Pin GPIO_PIN_1

#define IR_SENSOR_GPIO_Port GPIOA

#define LED_GREEN_Pin GPIO_PIN_0

#define LED_GREEN_GPIO_Port GPIOB

#define LED_RED_Pin GPIO_PIN_1

#define LED_RED_GPIO_Port GPIOB

#define BUZZER_Pin GPIO_PIN_2

#define BUZZER_GPIO_Port GPIOB

#ifdef __cplusplus

}

#endif

#endif




1. Bagaimana pengaruh pemilihan GPIO pada masing-masing development board?

Jawab:

Pada praktikum general input-output, pemilihan GPIO pada STM32 krusial karena tiap pin memiliki mode, fungsi alternatif, serta karakteristik listrik berbeda, sehingga menentukan keberhasilan pembacaan input dan pengendalian output secara optimal tanpa konflik periferal.

 

2. Bagaimana program deklarasi pin I/O pada STM32F103C8?

Jawab:

Deklarasi pin I/O dilakukan dengan mengaktifkan clock GPIO dan mengatur register (mode input/output, pull-up/down, dan tipe output) melalui HAL atau register langsung agar pin dapat beroperasi sesuai fungsi dasar input atau output digital.

 

3. Analisa bagaimana menerima Input dan mengeluarkan Output pada STM32F103C8!

Jawab:

Input dibaca dari register IDR melalui polling atau interrupt (EXTI), kemudian diproses oleh CPU dan menghasilkan output melalui penulisan ke ODR/BSRR, membentuk alur dasar sistem digital yaitu sensing–processing–actuating.

 

4. Analisa pengaruh perubahan program pada main.h terhadap program main.c!

Jawab:

Perubahan pada main.h akan mempengaruhi main.c karena berisi definisi pin dan prototipe fungsi, sehingga perubahan konfigurasi I/O di header akan langsung berdampak pada implementasi dan hasil kompilasi program utama.

 

5. Analisa bagaimana program dalam analisa metode pendeteksian Inputan pada STM32F103C8!

Jawab:

Pendeteksian input pada praktikum ini menggunakan metode polling atau interrupt, dengan perhatian pada debouncing untuk memastikan sinyal input stabil dan valid sebelum diproses menjadi aksi output.

 

6. Analisa kelebihan mikrokontroler dibanding rangkaian logika!

Jawab:

Mikrokontroler lebih unggul dibanding rangkaian Logic Gates dalam konteks general I/O karena fleksibel (programmable), mampu menangani banyak kondisi input-output secara dinamis, dan mengintegrasikan fungsi kontrol dalam satu sistem yang efisien.



Download HTML [Download]
Download File Rangkaian [Download] [wokwi link]
Download Listing Program [Download]
Datasheet Mikrokontroler STM32 NUCLEO-G474RE [Download]
Datasheet Sensor Infrared [Download]
Datasheet RGB LED [Download]
Datasheet Buzzer [Download]
Download Datasheet Resistor [Download]

Laporan Akhir M4 Mikro

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Pendahuluan Project 2. Tujuan Rancangan Project 3. Alat & Komponen 4. Landasan Teori & Gr...