TP 1-Modul 2



1. Prosedur [kembali]

  1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul
  2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output
  3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex
  4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus
  5. Simulasikan rangkaian

2. Hardware dan Diagram Blok [kembali]

  • Hardware

    1. Resistor

    2. Switch

    3. Push Button


    3. LM35 (Sensor Suhu)

    4. Fan-DC

    5. Motor Driver L298N


    Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


    Rangkaian ini terdiri dari sensor suhu LM35, mikrokontroler STM32, driver motor L298, serta motor kipas sebagai aktuator. LM35 berfungsi mendeteksi suhu lingkungan dan menghasilkan tegangan analog yang proporsional terhadap suhu (sekitar 10 mV/°C). Tegangan keluaran dari LM35 kemudian masuk ke pin ADC pada STM32 untuk dikonversi menjadi data digital. Proses ini memungkinkan mikrokontroler membaca nilai suhu secara akurat dan real-time.

   Setelah data suhu diperoleh, STM32 melakukan pengolahan berdasarkan logika yang telah diprogram. Jika suhu terdeteksi di atas 30°C, sistem akan memberikan perintah untuk menyalakan kipas dengan kecepatan maksimum. Sebaliknya, ketika suhu mulai turun dari nilai tersebut, mikrokontroler akan mengatur kecepatan kipas secara bertahap (linier) dengan cara mengubah nilai duty cycle PWM. Pada suhu tepat 30°C, kipas akan berhenti berputar.

  Sinyal PWM yang dihasilkan oleh STM32 tidak langsung diberikan ke motor, melainkan melalui driver L298. Driver ini berfungsi sebagai penguat arus dan tegangan agar motor dapat bekerja dengan baik tanpa membebani mikrokontroler. Selain itu, L298 juga memungkinkan pengaturan arah dan kecepatan motor dengan lebih stabil. Koneksi antara STM32 dan L298 melibatkan pin kontrol seperti IN dan EN yang menerima sinyal logika serta PWM.

  Secara keseluruhan, rangkaian ini merupakan sistem kendali suhu berbasis mikrokontroler yang bekerja secara otomatis. Kombinasi ADC untuk pembacaan sensor, PWM untuk pengaturan kecepatan, dan driver motor untuk penggerak aktuator menjadikan sistem ini mampu mengontrol kipas secara responsif, efisien, dan presisi sesuai perubahan suhu lingkungan.


4. Flowchart dan Listing Program [kembali]

  • Flowchart


  • Listing Program
#include "main.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);

uint32_t adcValue = 0;
float voltage = 0;
float temperature = 0;
uint8_t system_on = 1;

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

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  while (1)
  {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    adcValue = HAL_ADC_GetValue(&hadc1);

    voltage = (adcValue / 4095.0) * 3.3;
    temperature = (voltage * 100);  // LM35: 10mV/°C
    if(system_on)
    {
      if(temperature <= 31.0)
      {
        // Kipas MATI saat ≤ 31°C
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
      }
      else
      {
        // Kipas MAJU
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
        float duty;
        if(temperature >= 41.0)
        {
          duty = 1.0;  // Full speed
        }
        else
        {
          // Linear dari 31°C ke 41°C
          duty = (temperature - 31.0) / 10.0;
        }
        // Batas aman
        if(duty > 1.0) duty = 1.0;
        if(duty < 0.0) duty = 0.0;

        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 65535);
      }
    }
    else
    {
      // System OFF → kipas mati
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
    }

    HAL_Delay(200);
  }
}

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.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.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);

}

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

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 65535;
  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_GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  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 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_4)
  {
    system_on = !system_on;  // Toggle ON/OFF
  }
}

void Error_Handler(void)

{

  __disable_irq();

  while (1) {}

}

5. Video Demo [kembali]



6. Kondisi [kembali]

    Percobaan 3 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