TUGAS PENDAHULUAN 1


PERCOBAAN 3 KONDISI 2


1. Prosedur[Kembali]

  1. Pahami terlebih dahulu kondisi yang akan digunakan
  2. Buka software Proteus 8.17
  3. Persiapkan alat dan bahan
  4. Buat rangkaian sesuai dengan kondisi dan modul
  5. Buka software STM32Cube IDE 
  6. Setelah membuka software, pilih perangkat STM32F103C8T6 
  7. Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus 
  8. Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  9. Konfigurasi kan program dengan software Proteus
  10. Jalankan simulasi rangkaian.  
  11. Proses selesai

2. Hardware dan Diagram Blok[Kembali]


  1. STM32F103C8




    Sensor Suhu Lm35


    Kipas DC


    Push Button


    Motor Driver l298N  

    Breadboard

                                                                                        Adaptor

    Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Rangkaian Simulasi
Prinsip Kerja

  • Sensor LM35 membaca suhu
    LM35 mendeteksi suhu lingkungan dan mengubahnya menjadi tegangan analog yang sebanding dengan suhu (10 mV per 1°C).
  • Sinyal analog dikirim ke STM32
    Tegangan output dari LM35 masuk ke pin ADC pada mikrokontroler STM32F103C8.
  • Proses konversi ADC
    STM32 mengubah sinyal analog menjadi data digital, kemudian menghitung nilai suhu dalam satuan derajat Celsius.
  • Pengolahan logika kontrol
    Nilai suhu dibandingkan dengan batas (threshold) yang sudah ditentukan dalam program.
    • Jika suhu di bawah batas → motor mati / kecepatan rendah
    • Jika suhu di atas batas → motor menyala / kecepatan tinggi
  • Pengiriman sinyal ke driver L298
    STM32 mengirimkan sinyal digital (IN1, IN2, ENA/PWM) ke driver L298 sesuai hasil pengolahan.
  • Driver L298 menggerakkan motor
    L298 memperkuat sinyal dari STM32 agar mampu mengalirkan arus yang cukup untuk menggerakkan motor DC.
  • Motor DC beroperasi
    Motor berputar sesuai perintah (ON/OFF atau cepat/lambat), biasanya berfungsi sebagai kipas pendingin.
  • Catu daya sistem
    • STM32 menggunakan tegangan 3.3V
    • L298 dan motor menggunakan 5V
    • Semua ground harus terhubung agar sistem bekerja stabil
  • 4. Flowchart dan Listing Program[Kembali]

    Flowchart Rangkaian
    Listing Program

    #include "main.h" // Library utama STM32 HAL


    ADC_HandleTypeDef hadc1; // Handle untuk ADC1

    TIM_HandleTypeDef htim1; // Handle untuk Timer1 (PWM)


    // Prototype fungsi

    void SystemClock_Config(void);

    static void MX_GPIO_Init(void);

    static void MX_ADC1_Init(void);

    static void MX_TIM1_Init(void);


    // Variabel global

    uint32_t adcValue = 0; // Menyimpan nilai ADC (0–4095)

    float voltage = 0; // Tegangan hasil konversi ADC

    float temperature = 0; // Suhu dalam derajat Celcius

    volatile uint8_t system_on = 1; // Status sistem (1=ON, 0=OFF)


    int main(void)

    {

    HAL_Init(); // Inisialisasi HAL library

    SystemClock_Config(); // Konfigurasi clock sistem


    MX_GPIO_Init(); // Inisialisasi GPIO

    MX_ADC1_Init(); // Inisialisasi ADC

    MX_TIM1_Init(); // Inisialisasi Timer PWM


    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // Mulai PWM pada TIM1 Channel 1


    /* USER CODE BEGIN WHILE */

    uint32_t start_time = 0;

    uint8_t cooling_active = 0;

    const uint32_t duration = 10000; // Durasi penurunan kecepatan (misal: 10 detik / 10000ms)


    while (1)

    {

    HAL_ADC_Start(&hadc1);

    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

    adcValue = HAL_ADC_GetValue(&hadc1);


    // Konversi ADC ke Suhu (LM35: 10mV/°C pada Vref 3.3V)

    voltage = (adcValue / 4095.0f) * 3.3f;

    temperature = (voltage * 100.0f);


    if (system_on)

    {

    // TRIGGER: Jika suhu menyentuh 30 derajat dan proses pendinginan belum jalan

    if (temperature >= 30.0f && !cooling_active)

    {

    cooling_active = 1;

    start_time = HAL_GetTick(); // Catat waktu mulai


    // Indikator LED (Opsional: Hijau ON saat proses aktif)

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // Merah OFF

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); // Hijau ON

    }


    if (cooling_active)

    {

    uint32_t current_time = HAL_GetTick();

    uint32_t elapsed_time = current_time - start_time;


    if (elapsed_time < duration)

    {

    // Hitung penurunan linear: Kecepatan awal (65535) menuju 0

    // Rumus: PWM = Max_PWM * (1 - (waktu_berjalan / total_durasi))

    float factor = 1.0f - ((float)elapsed_time / (float)duration);

    uint32_t pwm_value = (uint32_t)(65535 * factor);


    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_value);

    }

    else

    {

    // Durasi habis, matikan kipas dan reset status

    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);

    cooling_active = 0;


    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); // Hijau OFF

    }

    }

    }

    else

    {

    // Jika sistem OFF secara paksa

    cooling_active = 0;

    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

    }


    HAL_Delay(50); // Delay lebih kecil agar transisi PWM halus

    }

    }


    // ================= CLOCK CONFIG =================

    void SystemClock_Config(void)

    {

    RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock

    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; // Struktur clock peripheral


    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


    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK

    | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; // Jenis clock

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI

    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); // Terapkan konfigurasi


    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; // Pilih clock ADC

    PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; // Divider ADC

    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); // Terapkan

    }


    // ================= ADC CONFIG =================

    static void MX_ADC1_Init(void)

    {

    ADC_ChannelConfTypeDef sConfig = {0}; // Struktur konfigurasi channel


    hadc1.Instance = ADC1; // Gunakan ADC1

    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Tidak scan multiple channel

    hadc1.Init.ContinuousConvMode = DISABLE; // Tidak continuous

    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Trigger manual

    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Align kanan

    hadc1.Init.NbrOfConversion = 1; // 1 channel


    HAL_ADC_Init(&hadc1); // Inisialisasi ADC


    sConfig.Channel = ADC_CHANNEL_0; // Channel 0

    sConfig.Rank = ADC_REGULAR_RANK_1; // Rank 1

    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; // Waktu sampling


    HAL_ADC_ConfigChannel(&hadc1, &sConfig); // Terapkan channel

    }


    // ================= TIMER PWM =================

    static void MX_TIM1_Init(void)

    {

    TIM_OC_InitTypeDef sConfigOC = {0}; // Struktur konfigurasi PWM


    htim1.Instance = TIM1; // Gunakan Timer 1

    htim1.Init.Prescaler = 0; // Prescaler 0 (kecepatan tinggi)

    htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // Counter naik

    htim1.Init.Period = 65535; // Resolusi 16-bit


    HAL_TIM_PWM_Init(&htim1); // Inisialisasi PWM


    sConfigOC.OCMode = TIM_OCMODE_PWM1; // Mode PWM1

    sConfigOC.Pulse = 0; // Duty awal 0%

    sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;// Polaritas low


    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); // Konfigurasi channel


    HAL_TIM_MspPostInit(&htim1); // Inisialisasi GPIO PWM

    }


    // ================= GPIO =================

    static void MX_GPIO_Init(void)

    {

    GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur GPIO


    __HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA


    GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; // Pin LED

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Output push-pull

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan


    GPIO_InitStruct.Pin = GPIO_PIN_4; // Pin tombol

    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // Interrupt rising edge

    GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan


    HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0); // Set prioritas interrupt

    HAL_NVIC_EnableIRQ(EXTI4_IRQn); // Aktifkan interrupt

    }


    // ================= INTERRUPT =================

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

    {

    if (GPIO_Pin == GPIO_PIN_4) // Jika tombol ditekan

    {

    system_on = !system_on; // Toggle ON/OFF sistem

    }

    }


    // ================= ERROR =================

    void Error_Handler(void)

    {

    __disable_irq(); // Disable interrupt

    while (1) {} // Loop selamanya jika error

    }

    5. Video Demo[Kembali]

    6. Kondisi[Kembali]

    Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu 30 maka kipas menyala dengan kecepatan yang berubah dan kecepatan kipas menurun secara linear sampai 0 terhadap waktu


    8. Download File[Kembali]

    Rangkaian dan Program Proteus (Klik Disini)

    Video Simulasi (Klik Disini)

    HTML (Klik Disini)

    Download Datasheet IR Sensor (klik disini)

    Download Datasheet Touch Sensor (klik disini)

    Download Datasheet STM32F103C8 (klik disini)

    Download Datasheet Resistor (klik disini)

    Download Datasheet LED (klik disini)

    Download Datasheet Buzzer (klik disini)


    Komentar

    Postingan populer dari blog ini