[KEMBALI KE MENU SEBELUMNYA]
Tugas Pendahuluan 1 Modul II
(Percobaan 1 Kondisi 8)
1. Prosedur
1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. debug program dan simpan dalam bentuk hex
4. uploud atau masukkan hex tadi ke dalam STM32F103C8 di proteus
5.Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
6. Selesai.
Hardware :
a) Mikrokontroler STM32F103C8
4. Power Supply
5. LED
6. Potensiometer7. Switch
8. Adaptor
9. Breadboard
Rangkaian Simulasi Sebelum dirunning:
Rangkaian Simulasi Setelah dirunning:
Prinsip Kerja :
Sistem bekerja dengan membaca sinyal analog dari sensor detak jantung yang masuk ke pin ADC pada STM32. Sinyal ini kemudian dikonversi menjadi data digital dan diproses menggunakan metode moving average untuk mengurangi noise sehingga bentuk gelombang detak menjadi lebih halus. Setelah itu, sistem menentukan nilai baseline secara adaptif sebagai nilai acuan kondisi normal sinyal, lalu menetapkan threshold sedikit di atas baseline untuk mendeteksi adanya puncak sinyal yang merepresentasikan detak jantung.
Ketika nilai sinyal hasil filter melebihi threshold, mikrokontroler menganggap terjadi detak jantung dan mengaktifkan LED hijau (PB0), sedangkan saat sinyal berada di bawah threshold LED dimatikan. Proses ini berlangsung terus-menerus dengan jeda sampling yang cepat, sehingga LED berkedip mengikuti pola detak jantung secara real-time sesuai dengan kondisi pada rangkaian.
4. Flowchart dan Listing Program
Flowchart :
Listing Program :
#include "main.h" // Library utama STM32 HAL (akses GPIO, ADC, dll)
/* ================= PRIVATE VARIABLES ================= */
ADC_HandleTypeDef hadc1; // Handle untuk mengontrol ADC1
/* ================= DEFINE ================= */
#define LED_HIJAU GPIO_PIN_0 // LED hijau terhubung ke pin PB0
/* ================= VARIABLE ================= */
uint32_t adcValue = 0; // Menyimpan data mentah dari ADC
uint32_t filteredValue = 0; // Menyimpan data hasil filter
uint32_t baseline = 0; // Nilai acuan sinyal (adaptif)
/* ================= FILTER FUNCTION ================= */
uint32_t moving_average(uint32_t newValue) // Fungsi untuk meratakan sinyal (filter)
{
static uint32_t history[5] = {0}; // Array menyimpan 5 data terakhir
static uint8_t index = 0; // Index posisi data dalam array
uint32_t sum = 0; // Variabel penjumlahan
history[index] = newValue; // Masukkan data baru ke array
index = (index + 1) % 5; // Geser index (circular buffer)
for (int i = 0; i < 5; i++) // Loop untuk menjumlahkan data
{
sum += history[i]; // Tambahkan semua data
}
return sum / 5; // Kembalikan nilai rata-rata
}
/* ================= MAIN PROGRAM ================= */
int main(void)
{
HAL_Init(); // Inisialisasi HAL (hardware abstraction layer)
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO
MX_ADC1_Init(); // Inisialisasi ADC
HAL_GPIO_WritePin(GPIOB, LED_HIJAU, GPIO_PIN_RESET); // Pastikan LED mati di awal
while (1) // Loop utama (berjalan terus)
{
// ===== BACA SENSOR (ADC) =====
HAL_ADC_Start(&hadc1); // Mulai konversi ADC
HAL_ADC_PollForConversion(&hadc1, 10); // Tunggu ADC selesai (timeout 10ms)
adcValue = HAL_ADC_GetValue(&hadc1); // Ambil nilai hasil konversi
// ===== FILTER DATA =====
filteredValue = moving_average(adcValue); // Haluskan sinyal (kurangi noise)
// ===== BASELINE AWAL =====
if (baseline == 0) // Jika pertama kali dijalankan
{
baseline = filteredValue; // Set baseline awal
}
// ===== BASELINE ADAPTIF =====
baseline = (baseline * 9 + filteredValue) / 10;
// Update baseline agar mengikuti perubahan sinyal (low-pass filter)
// ===== THRESHOLD =====
uint32_t threshold = baseline + 15;
// Menentukan batas deteksi detak (offset dari baseline)
// ===== DETEKSI DETAK =====
if (filteredValue > threshold)
{
HAL_GPIO_WritePin(GPIOB, LED_HIJAU, GPIO_PIN_SET);
// Jika sinyal > threshold → detak terdeteksi → LED ON
}
else
{
HAL_GPIO_WritePin(GPIOB, LED_HIJAU, GPIO_PIN_RESET);
// Jika tidak → LED OFF
}
HAL_Delay(5); // Delay 5 ms → sampling sekitar 200 Hz
}
}
/* ================= SYSTEM CLOCK ================= */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi osilator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI (internal clock)
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak pakai PLL
HAL_RCC_OscConfig(&RCC_OscInitStruct); // Terapkan konfigurasi osilator
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // Tidak dibagi
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
// Terapkan konfigurasi clock
}
/* ================= ADC CONFIG ================= */
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0}; // Struktur konfigurasi channel ADC
hadc1.Instance = ADC1; // Gunakan ADC1
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Mode single channel
hadc1.Init.ContinuousConvMode = DISABLE; // Tidak continuous (manual start)
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Trigger dari software
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data rata kanan
hadc1.Init.NbrOfConversion = 1; // Hanya 1 channel
HAL_ADC_Init(&hadc1); // Inisialisasi ADC
sConfig.Channel = ADC_CHANNEL_0; // Gunakan channel 0 (PA0)
sConfig.Rank = ADC_REGULAR_RANK_1; // Ranking pertama
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; // Sampling cepat
HAL_ADC_ConfigChannel(&hadc1, &sConfig); // Terapkan konfigurasi channel
}
/* ================= GPIO CONFIG ================= */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur konfigurasi GPIO
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA
__HAL_RCC_GPIOB_CLK_ENABLE(); // Aktifkan clock GPIOB
HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11,
GPIO_PIN_RESET);
// Set semua LED dalam kondisi mati
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Mode output push-pull
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Terapkan konfigurasi GPIO
}
/* ================= ERROR HANDLER ================= */
void Error_Handler(void)
{
__disable_irq(); // Nonaktifkan interrupt jika terjadi error
while (1)
{
// Sistem berhenti di sini jika error
}
}
Percobaan 1 Kondisi 8
Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi LED warna menyala hijau dengan pola yang sama dengan detak jantung
Datasheet Mikrokontroler STM32F103C8 [Download]
Komentar
Posting Komentar