Laporan Akhir 1_M2

[menuju akhir]

1. Prosedur [kembali]

  1. Siapkan seluruh alat dan bahan, yaitu STM32F103C8T6, sensor LM35, kipas DC, push button, motor driver L298N, breadboard, adaptor, dan resistor.
  2. Rangkai sensor LM35 dengan menghubungkan pin VCC ke sumber tegangan, pin GND ke ground, dan pin VOUT ke pin ADC mikrokontroler yaitu PA0.
  3. Hubungkan pin kontrol motor driver L298N ke mikrokontroler. Pin arah motor dikendalikan melalui PA2 dan PA3, sedangkan pin PWM untuk pengaturan kecepatan kipas dihubungkan ke TIM1 Channel 1.
  4. Hubungkan push button ke pin PA4 sebagai input interrupt. Tombol ini digunakan untuk mengubah kondisi sistem dari aktif menjadi tidak aktif, atau sebaliknya.
  5. Pastikan seluruh ground dari STM32, sensor LM35, motor driver, dan catu daya terhubung menjadi satu agar sistem memiliki referensi tegangan yang sama.
  6. Buka STM32CubeIDE, lakukan konfigurasi ADC1 pada Channel 0, konfigurasi TIM1 sebagai PWM, serta konfigurasi GPIO PA4 sebagai external interrupt.
  7. Masukkan program ke STM32CubeIDE, kemudian lakukan proses build untuk memastikan tidak terdapat error pada program.
  8. Upload program ke mikrokontroler STM32F103C8T6.
  9. Jalankan sistem dan amati respons kipas terhadap perubahan suhu pada sensor LM35.
  10. Tekan push button untuk menguji fungsi interrupt sebagai saklar manual sistem.

2. Hardware dan Diagram Blok [kembali]

Hardware
    

STM32F103C8 

 
STM32 NUCLEO-G474RE   


Sensor Suhu

Motor DC

LED

Buzzer

Resistor


Diagram Blok 


3. Rangkaian Simulasi dan Prinsip Kerja[kembali]

Rangkaian Simulasi  

Prinsip Kerja

Sistem kontrol suhu ruangan bekerja dengan menggunakan sensor LM35 sebagai pendeteksi suhu lingkungan. Sensor LM35 menghasilkan tegangan analog yang berubah sesuai dengan kenaikan atau penurunan suhu ruangan. Tegangan keluaran dari sensor ini kemudian diteruskan ke ADC lalu diteruskan ke STM32F103C8T6. Nilai ADC yang diperoleh selanjutnya dikonversi menjadi tegangan berdasarkan resolusi ADC 12-bit, yaitu dari 0 sampai 4095, dengan tegangan referensi sebesar 3,3 V. Setelah nilai tegangan diketahui, mikrokontroler mengubahnya menjadi nilai suhu dalam satuan derajat Celsius, karena LM35 memiliki karakteristik keluaran sekitar 10 mV untuk setiap kenaikan 1°C.

    Setelah LM35 membaca suhu, STM32F103C8T6 akan membandingkan nilai suhu tersebut dengan batas yang telah ditentukan di dalam program. Apabila suhu masih berada di bawah 27°C, maka kipas tidak diaktifkan karena kondisi ruangan dianggap masih normal. Namun, ketika suhu mencapai atau melebihi 27°C, mikrokontroler akan mengaktifkan motor driver L298N melalui pin kendali PA2 dan PA3. Selain itu, STM32 juga memberikan sinyal PWM melalui TIM1 Channel 1 untuk mengatur kecepatan putaran kipas. Pada rentang suhu 27°C hingga 35°C, kecepatan kipas akan meningkat secara bertahap mengikuti kenaikan suhu. Jika suhu mencapai 35°C atau lebih, maka kipas akan berputar pada kecepatan maksimum sesuai nilai PWM yang telah diatur dalam program.

    Rangkaian ini juga dilengkapi dengan push button sebagai pengendali manual sistem (interrupt). Push button terhubung ke pin PA4 dan bekerja menggunakan external interrupt, sehingga mikrokontroler dapat langsung merespons saat tombol ditekan. Ketika tombol ditekan, kondisi variabel system_on akan berubah, misalnya dari aktif menjadi tidak aktif atau sebaliknya. Jika sistem berada dalam kondisi tidak aktif, maka STM32 akan mematikan keluaran menuju motor driver L298N dan menghentikan sinyal PWM, sehingga kipas berhenti berputar. Dengan demikian, sistem kontrol suhu ruangan ini dapat bekerja secara otomatis berdasarkan suhu yang terdeteksi, namun tetap menyediakan kontrol manual agar pengguna dapat menyalakan atau mematikan sistem sesuai kebutuhan

 

4. Flowchart dan Listing Program [kembali]

a. Flowchart

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

    if(system_on)
    {
      if(temperature >= 27.0)
      {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);

        float duty;

        if(temperature >= 35.0)
        {
          duty = 0.5;
        }
        else
        {
                 duty = 1.0 - ((temperature - 27.0) / 8.0) * 0.5;
               }

               __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty *
       65535);
             }
             else
             {
               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
           {
             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;
          }
          }
          void Error_Handler(void)
          {
          __disable_irq();
          while (1) {}
          }

 

5. Video Demo [kembali]


6. Analisa [kembali]



7. Link Download [kembali]

[menuju awal]







 

No comments:

Post a Comment

 BAHAN PRESENTASI MATA KULIAH ELEKTRONIKA OLEH ZIKRI AHMAD SYAIFULLAH 2310952062 DOSEN PENGAMPU DR.DARWISON,M.T Referensi 1. Darwison, 2010...