Tugas Pendahuluan 1

Percobaan 3 Kondisi 5



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. STM32F103C8





2. Sensor Suhu LM35




3. Fan DCrt





4. Switch




5. Driver Motor L298



6. Resistor 


  • Blok Diagram


3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Prinsip kerja sistem ini berpusat pada pembacaan suhu secara terus-menerus dan pengendalian kipas berbasis waktu (delay/timer) saat mencapai ambang batas suhu tertentu. Sensor suhu LM35 mendeteksi suhu sekitar dan mengirimkan sinyal tegangan analog ke mikrokontroler STM32 (pin PA0). Mikrokontroler kemudian mengonversi tegangan ini menjadi nilai digital (ADC) dan menghitungnya kembali ke dalam satuan derajat Celcius.

Selama suhu terdeteksi berada di bawah 30°C, sistem memutuskan bahwa lingkungan masih dingin, sehingga mikrokontroler tidak mengirimkan sinyal penggerak ke IC Motor Driver L298 dan kipas tetap dalam keadaan mati.

Namun, ketika sensor LM35 mendeteksi suhu telah mencapai angka 30°C (atau lebih), mikrokontroler akan memicu siklus operasi kipas yang baru. Melalui pin PA8, mikrokontroler mengirimkan sinyal ke IC Motor Driver L298 untuk menyalakan kipas secara penuh selama tepat 5 detik. Setelah 5 detik berlalu, mikrokontroler memutus sinyal penggerak sehingga kipas mati selama 5 detik berikutnya. Siklus bergantian—menyala 5 detik lalu mati 5 detik—ini akan terus berulang secara otomatis selama suhu lingkungan masih berada pada kondisi 30°C.

Seluruh proses otomatis ini tetap dilengkapi dengan fitur override manual berupa tombol (pin PA4); kapan pun tombol ini ditekan, sistem interupsi pada mikrokontroler akan langsung bereaksi untuk mematikan atau menyalakan kembali seluruh operasi sistem, mengabaikan siklus jeda waktu 5 detik maupun proses perhitungan suhu yang sedang berlangsung.

4. Flowchart dan Listing Program[Kembali]


  • Flowchart

  • Listing Program

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file           : main.c

  * @brief          : LM35 Fan Control STM32F103C8T6

  ******************************************************************************

  */

/* USER CODE END Header */


/* 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;


uint32_t previousMillis = 0;


uint8_t fanState = 0;


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_TIM1_Init(void);


/**

  * @brief  Main Program

  * @retval int

  */

int main(void)

{


  HAL_Init();


  SystemClock_Config();


  MX_GPIO_Init();

  MX_ADC1_Init();

  MX_TIM1_Init();


  /* ================= START PWM ================= */


  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);


  /* Arah motor */

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);


  /* FAN OFF awal */

  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);


  while (1)

  {


    /* ================= BACA SENSOR LM35 ================= */


    HAL_ADC_Start(&hadc1);


    HAL_ADC_PollForConversion(&hadc1, 100);


    adcValue = HAL_ADC_GetValue(&hadc1);


    HAL_ADC_Stop(&hadc1);


    /* ================= KONVERSI ADC ================= */


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


    /*

       LM35:

       10mV = 1°C

    */


    temperature = voltage * 100.0f;


    /* ================= KONTROL KIPAS ================= */


    /*

       Jika suhu >= 30°C

       kipas ON 5 detik

       lalu OFF 5 detik

       berulang terus

    */


    if(temperature >= 30.0f)

    {


      if(HAL_GetTick() - previousMillis >= 5000)

      {

        previousMillis = HAL_GetTick();


        fanState = !fanState;


        if(fanState)

        {

          /* FAN ON */

          __HAL_TIM_SET_COMPARE(&htim1,

                                TIM_CHANNEL_1,

                                700);

        }

        else

        {

          /* FAN OFF */

          __HAL_TIM_SET_COMPARE(&htim1,

                                TIM_CHANNEL_1,

                                0);

        }

      }


    }

    else

    {

      /* Suhu < 30°C */


      __HAL_TIM_SET_COMPARE(&htim1,

                            TIM_CHANNEL_1,

                            0);


      fanState = 0;

    }


    HAL_Delay(100);

  }

}


/**

  * @brief System Clock Configuration

  * @retval None

  */

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;


  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }


  RCC_ClkInitStruct.ClockType =

      RCC_CLOCKTYPE_HCLK |

      RCC_CLOCKTYPE_SYSCLK |

      RCC_CLOCKTYPE_PCLK1 |

      RCC_CLOCKTYPE_PCLK2;


  RCC_ClkInitStruct.SYSCLKSource =

      RCC_SYSCLKSOURCE_HSI;


  RCC_ClkInitStruct.AHBCLKDivider =

      RCC_SYSCLK_DIV1;


  RCC_ClkInitStruct.APB1CLKDivider =

      RCC_HCLK_DIV1;


  RCC_ClkInitStruct.APB2CLKDivider =

      RCC_HCLK_DIV1;


  if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct,

                         FLASH_LATENCY_0) != HAL_OK)

  {

    Error_Handler();

  }


  PeriphClkInit.PeriphClockSelection =

      RCC_PERIPHCLK_ADC;


  PeriphClkInit.AdcClockSelection =

      RCC_ADCPCLK2_DIV2;


  if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)

      != HAL_OK)

  {

    Error_Handler();

  }

}


/**

  * @brief ADC1 Initialization

  * @retval None

  */

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;


  if(HAL_ADC_Init(&hadc1) != HAL_OK)

  {

    Error_Handler();

  }


  /* PA0 = ADC1_IN0 */


  sConfig.Channel = ADC_CHANNEL_0;


  sConfig.Rank = ADC_REGULAR_RANK_1;


  sConfig.SamplingTime =

      ADC_SAMPLETIME_55CYCLES_5;


  if(HAL_ADC_ConfigChannel(&hadc1,

                           &sConfig) != HAL_OK)

  {

    Error_Handler();

  }

}


/**

  * @brief TIM1 PWM Initialization

  * @retval None

  */

static void MX_TIM1_Init(void)

{


  TIM_MasterConfigTypeDef sMasterConfig = {0};


  TIM_OC_InitTypeDef sConfigOC = {0};


  htim1.Instance = TIM1;


  /*

     Timer clock:

     72MHz / (71+1)

     = 1MHz

  */


  htim1.Init.Prescaler = 71;


  htim1.Init.CounterMode =

      TIM_COUNTERMODE_UP;


  /*

     PWM period

  */


  htim1.Init.Period = 999;


  htim1.Init.ClockDivision =

      TIM_CLOCKDIVISION_DIV1;


  htim1.Init.RepetitionCounter = 0;


  htim1.Init.AutoReloadPreload =

      TIM_AUTORELOAD_PRELOAD_DISABLE;


  if(HAL_TIM_PWM_Init(&htim1) != HAL_OK)

  {

    Error_Handler();

  }


  sMasterConfig.MasterOutputTrigger =

      TIM_TRGO_RESET;


  sMasterConfig.MasterSlaveMode =

      TIM_MASTERSLAVEMODE_DISABLE;


  if(HAL_TIMEx_MasterConfigSynchronization(

         &htim1,

         &sMasterConfig) != HAL_OK)

  {

    Error_Handler();

  }


  sConfigOC.OCMode = TIM_OCMODE_PWM1;


  sConfigOC.Pulse = 0;


  sConfigOC.OCPolarity =

      TIM_OCPOLARITY_HIGH;


  sConfigOC.OCFastMode =

      TIM_OCFAST_DISABLE;


  if(HAL_TIM_PWM_ConfigChannel(

         &htim1,

         &sConfigOC,

         TIM_CHANNEL_1) != HAL_OK)

  {

    Error_Handler();

  }


  HAL_TIM_MspPostInit(&htim1);

}


/**

  * @brief GPIO Initialization

  * @retval None

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};


  __HAL_RCC_GPIOA_CLK_ENABLE();


  /* PA2 dan PA3 = arah motor */


  HAL_GPIO_WritePin(GPIOA,

                    GPIO_PIN_2 |

                    GPIO_PIN_3,

                    GPIO_PIN_RESET);


  GPIO_InitStruct.Pin =

      GPIO_PIN_2 |

      GPIO_PIN_3;


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

}


/**

  * @brief Error Handler

  * @retval None

  */

void Error_Handler(void)

{

  __disable_irq();


  while(1)

  {


  }

}

5. Video Demo[Kembali]


6. Kondisi[Kembali]

Percobaan 3 Kondisi 5

Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu 30C maka kipas menyala selama 5 detik lalu mati dan setelah 5 detik kipas menyala lagi.

7. Video Simulasi[Kembali]


8. Download File[Kembali]

File Tugas Pendahuluan(.Zip) [Klik Disini]

Video Simulasi [Klik Disini]

Download Datasheet Resistor (klik disini)

Download Datasheet STM32F103C8T6 [Klik Disini]

Download Datasheet Sensor Suhu Lm35 [Klik Disini]

Download Datasheet Kipas DC [Klik Disini]

Download Datasheet Push Button [Klik Disini]

Download Datasheet Motor Driver l298N [Klik Disini]


Tidak ada komentar:

Posting Komentar

BAHAN PRESENTASI UNTUK ELEKTRONIKA 2024 Oleh : IBNU KHAIRUDDIN NIM. 2310952018   Dosen Pengampu : Dr. Darwison, S. T., M. T. NIDN. 001409640...