Modul 2 Percobaan 3 Kondisi 1




1. Prosedur [Kembali]

Langkah-langkah percobaan pada proteus :

  • 1. Buka software proteus
  • 2. Siapkan alat dan bahan yaitu dengan komponen utama STM32F103C8, sensor suhu LM35, kipas DC, Resistor, Motor Driver l298N, Push Button
  • 3. Rangkai sesuai gambar percobaan
  • 4. Rancang kerja rangkaian sesuai kondisi 
  • 5. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex
  • 6. Setelah dapat file hex nya, masukkan file hex ke dalam stm pada proteus
  • 7. Simulasikan rangkaian
Langkah-langkah percobaan langsung: 
  • Siapkan seluruh komponen yang dibutuhkan seperti STM32F103C8, sensor suhu LM35, kipas DC, Resistor, Motor Driver l298N, Push Button, ST-LINK, resistor 220Ω, serta kabel jumper.
  • Rangkai komponen sesuai dengan gambar yang ada di modul
  • Pastikan semua koneksi sudah sesuai, tidak ada kabel yang longgar atau terbalik.
  • Hubungkan board STM32 ke komputer menggunakan ST-LINK, lalu lakukan pemrograman sesuai dengan flowchart yang telah dibuat.
  • Setelah program berhasil di-upload, silahkan run untuk memastikan logika dan rangkaian sudah benar.

  • 2. Hardware dan Diagram Blok [Kembali]

    a. Hardware
    1. STM32F103C8
    TM32F103C8 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.

    2. Sensor Suhu LM35

    LM35 temperature sensor adalah sensor suhu analog berbasis IC yang digunakan untuk mengukur temperatur lingkungan dalam satuan derajat Celsius (°C).

    3. Kipas DC

    Kipas DC adalah kipas yang menggunakan sumber listrik arus searah (Direct Current / DC) untuk menggerakkan motor sehingga menghasilkan aliran udara.


    4. Motor Driver l298N 

    Motor Driver L298N adalah modul driver motor berbasis IC L298 yang digunakan untuk mengendalikan motor DC atau motor stepper dengan bantuan mikrokontroler.


    5. Push Button

    Push button adalah saklar mekanik sederhana yang bekerja saat ditekan untuk menghubungkan atau memutus aliran listrik dalam suatu rangkaian.

    6. Resistor 

    Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

    7. Adaptor



    8. Jumper



    9. Breadboard



    b. Diagram Blok





    3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


    Prinsip kerja:

    Rangkaian pada gambar bekerja sebagai sistem Smart Fan Control yang mengatur kecepatan kipas secara otomatis berdasarkan suhu yang terdeteksi oleh sensor. Sensor suhu yang digunakan adalah LM35 Temperature Sensor, yang menghasilkan tegangan analog sebanding dengan suhu (sekitar 10 mV per °C). Tegangan ini masuk ke pin analog mikrokontroler STM32F103C8, biasanya melalui pin seperti PA0 yang berfungsi sebagai kanal ADC (Analog to Digital Converter). ADC di dalam mikrokontroler mengubah sinyal analog tersebut menjadi data digital dengan resolusi tertentu (umumnya 12-bit), sehingga suhu dapat dibaca dan diolah secara numerik oleh sistem.
    Setelah nilai suhu diperoleh, mikrokontroler melakukan proses pengolahan untuk menentukan seberapa cepat kipas harus berputar. Nilai suhu ini kemudian dikonversi menjadi sinyal PWM (Pulse Width Modulation) yang keluar dari pin timer (misalnya PA8 yang terhubung ke TIM1 channel PWM). PWM ini berupa sinyal digital dengan frekuensi tetap tetapi duty cycle yang berubah-ubah sesuai suhu: semakin tinggi suhu, semakin besar duty cycle, sehingga daya yang diberikan ke motor semakin besar. Sinyal PWM ini tidak langsung menggerakkan motor, melainkan terlebih dahulu masuk ke driver motor L298 Motor Driver, yang berfungsi sebagai penguat arus dan tegangan agar motor (fan) dapat berputar dengan daya yang cukup.
    Driver L298 menerima sinyal PWM pada pin enable (ENA) dan sinyal logika pada pin input (IN1 dan IN2) untuk menentukan arah putaran motor, meskipun pada rangkaian ini umumnya digunakan satu arah saja. Output dari L298 kemudian menggerakkan kipas DC sehingga kecepatan putarannya mengikuti duty cycle PWM yang dihasilkan oleh mikrokontroler. Selain itu, terdapat tombol yang terhubung ke pin seperti NRST atau GPIO yang berfungsi sebagai interrupt atau reset, sehingga ketika tombol ditekan, sistem dapat langsung merespons tanpa harus menunggu proses utama selesai, misalnya untuk mereset sistem atau memberikan kontrol manual. Dengan demikian, keseluruhan sistem merupakan integrasi dari ADC sebagai pembaca sensor, PWM sebagai pengendali kecepatan, dan interrupt sebagai mekanisme respon cepat, yang bekerja bersama untuk menghasilkan kontrol kipas yang otomatis dan adaptif terhadap perubahan suhu.

    4. Flowchart dan Listing Program [Kembali]

    • Flowchart


    • Program
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"

    /* Private variables ---------------------------------------------------------*/
    ADC_HandleTypeDef hadc1;
    TIM_HandleTypeDef htim1;

    /* USER CODE BEGIN PV */
    uint32_t adcValue = 0;
    float voltage = 0;
    float temperature = 0;
    volatile uint8_t system_on = 1;
    uint8_t fan_state = 0; // 0 = mati, 1 = hidup
    /* USER CODE END PV */

    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_TIM1_Init(void);
    static void MX_ADC1_Init(void);

    /* USER CODE BEGIN 0 */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
      if(GPIO_Pin == GPIO_PIN_4)
      {
        system_on = !system_on;
      }
    }
    /* USER CODE END 0 */

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

      MX_GPIO_Init();
      MX_TIM1_Init();
      MX_ADC1_Init();

      /* USER CODE BEGIN 2 */
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
      /* USER CODE END 2 */

      /* Infinite loop */
      while (1)
      {
        // =========================
        // BACA SUHU LM35
        // =========================
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
        adcValue = HAL_ADC_GetValue(&hadc1);

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

        // Optional: stabilisasi pembacaan (hindari 30.1, 30.2)
        temperature = ((int)(temperature * 10)) / 10.0f;

        if(system_on)
        {
          // =========================
          // HISTERESIS (KUNCI MASALAH)
          // =========================
          if(temperature >= 31.0f)
          {
            fan_state = 1; // nyala
          }
          else if(temperature <= 30.0f)
          {
            fan_state = 0; // mati
          }

          // =========================
          // EKSEKUSI KIPAS
          // =========================
          if(fan_state == 1)
          {
            HAL_GPIO_WritePin(GPIOA, IN1_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOA, IN2_Pin, GPIO_PIN_RESET);

            float duty = 0.0f;

            if(temperature >= 40.0f)
            {
              duty = 1.0f; // full speed
            }
            else if(temperature >= 31.0f)
            {
              duty = (temperature - 31.0f) / 9.0f; // linear 31–40
            }
            else
            {
              duty = 0.0f;
            }

            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint32_t)(duty * 65535));
          }
          else
          {
            // MATI TOTAL
            HAL_GPIO_WritePin(GPIOA, IN1_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GPIOA, IN2_Pin, GPIO_PIN_RESET);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
          }
        }
        else
        {
          // OFF manual
          HAL_GPIO_WritePin(GPIOA, IN1_Pin, GPIO_PIN_RESET);
          HAL_GPIO_WritePin(GPIOA, IN2_Pin, GPIO_PIN_RESET);
          __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
          fan_state = 0;
        }

        HAL_Delay(200);
      }
    }

    /**
      * @brief System Clock Configuration
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
      RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      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;
      HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
      PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
      HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
    }

    static void MX_ADC1_Init(void)
    {
      ADC_ChannelConfTypeDef sConfig = {0};
      hadc1.Instance = ADC1;
      hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
      hadc1.Init.ContinuousConvMode = DISABLE;
      hadc1.Init.DiscontinuousConvMode = 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_1CYCLE_5;
      HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    }

    static void MX_TIM1_Init(void)
    {
      TIM_ClockConfigTypeDef sClockSourceConfig = {0};
      TIM_OC_InitTypeDef sConfigOC = {0};

      htim1.Instance = TIM1;
      htim1.Init.Prescaler = 0;
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim1.Init.Period = 65535;
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      HAL_TIM_Base_Init(&htim1);

      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
      HAL_TIM_PWM_Init(&htim1);

      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 0;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
      HAL_TIM_MspPostInit(&htim1);
    }

    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      __HAL_RCC_GPIOD_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();

      HAL_GPIO_WritePin(GPIOA, IN1_Pin|IN2_Pin, GPIO_PIN_RESET);

      GPIO_InitStruct.Pin = IN1_Pin|IN2_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

      GPIO_InitStruct.Pin = GPIO_PIN_4;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

      HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(EXTI4_IRQn);
    }

    void Error_Handler(void)
    {
      __disable_irq();
      while (1) {}
    }

    5. Video Demo [Kembali]




    6. Kondisi [Kembali]

    kondisi 1: Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu >30 C maka kipas menyala dengan kecepatan penuh dan saat suhu turun maka kecepatan kipas menurun secara linear dan ketika 30 C kipas mati.


    7. Video Simulasi [Kembali]



    8. Download File [Kembali]


     

     

     

    Komentar

    Postingan populer dari blog ini

    TUGAS BESAR

    Aplikasi Counter

    TUGAS BESAR