Langsung ke konten utama

Tugas Pendahuluan Dan Laporan Akhir 1



1. Prosedur [kembali]

  1. 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: 
  2. 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.
  3. Rangkai komponen sesuai dengan gambar yang ada di modul
  4. Pastikan semua koneksi sudah sesuai, tidak ada kabel yang longgar atau terbalik.
  5. Hubungkan board STM32 ke komputer menggunakan ST-LINK, lalu lakukan pemrograman sesuai dengan flowchart yang telah dibuat.
  6. 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 dirancang sebagai Smart Fan Control, yaitu sistem yang dapat mengatur kecepatan kipas secara otomatis berdasarkan perubahan suhu lingkungan. Sistem ini menggunakan sensor suhu LM35 untuk mendeteksi temperatur. Sensor LM35 menghasilkan tegangan analog yang nilainya berbanding lurus dengan suhu, dengan karakteristik sekitar 10 mV untuk setiap kenaikan 1°C. Tegangan keluaran dari sensor kemudian dikirim ke pin analog pada mikrokontroler STM32F103C8, misalnya pada pin PA0 yang berfungsi sebagai kanal ADC (Analog to Digital Converter).

Di dalam mikrokontroler, ADC bertugas mengubah sinyal analog dari LM35 menjadi data digital dengan resolusi tertentu, biasanya 12-bit. Data digital tersebut selanjutnya diproses oleh mikrokontroler untuk mengetahui nilai suhu secara numerik. Berdasarkan hasil pembacaan suhu, sistem menentukan tingkat kecepatan kipas yang sesuai.

Pengaturan kecepatan kipas dilakukan menggunakan metode PWM (Pulse Width Modulation). Mikrokontroler menghasilkan sinyal PWM melalui pin timer, misalnya PA8 yang terhubung dengan TIM1 channel PWM. Pada metode ini, frekuensi sinyal dibuat tetap, sedangkan nilai duty cycle diubah sesuai kondisi suhu. Ketika suhu meningkat, duty cycle PWM akan semakin besar sehingga daya yang diberikan ke motor kipas juga meningkat. Sebaliknya, jika suhu menurun, duty cycle akan diperkecil sehingga putaran kipas menjadi lebih lambat.

Sinyal PWM dari mikrokontroler tidak langsung dihubungkan ke motor kipas, melainkan diteruskan terlebih dahulu ke modul driver motor L298. Driver ini berfungsi sebagai penguat arus dan tegangan agar motor DC dapat bekerja dengan daya yang cukup. Pada driver L298, sinyal PWM diterima melalui pin ENA, sedangkan pin IN1 dan IN2 digunakan untuk mengatur arah putaran motor. Namun, pada sistem ini kipas umumnya hanya berputar dalam satu arah sehingga pengaturan arah tidak terlalu dimanfaatkan. Output dari driver kemudian digunakan untuk menggerakkan kipas DC sesuai nilai PWM yang diberikan.

Selain itu, rangkaian juga dilengkapi dengan tombol yang dihubungkan ke pin tertentu, seperti NRST atau GPIO mikrokontroler. Tombol ini dapat difungsikan sebagai interrupt atau reset sistem. Dengan adanya interrupt, mikrokontroler dapat memberikan respons secara langsung ketika tombol ditekan tanpa harus menunggu proses utama selesai, misalnya untuk melakukan reset atau mengaktifkan kontrol manual.

Secara keseluruhan, sistem ini merupakan kombinasi kerja antara sensor suhu LM35, ADC, PWM, driver motor L298, dan mekanisme interrupt pada mikrokontroler STM32. Semua komponen tersebut saling terintegrasi untuk menciptakan sistem pengontrol kipas yang otomatis, responsif, dan mampu menyesuaikan kecepatan kipas berdasarkan kondisi suhu di sekitarnya.

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
    temperature = ((int)(temperature * 10)) / 10.0f;

    if(system_on)
    {
      // =========================
      // HISTERESIS
      // =========================
      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;
        }
        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)
  {
  }
}
.

7. Video Simulasi [kembali]




Percobaan 4

8. Download File [kembali]









Komentar

Postingan populer dari blog ini