TP 1

Tugas Pendahuluan 1




 

1. Prosedur [kembali]

  • Menyiapkan alat dan bahan.
  • Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  • Menghubungkan masing masing pin input output.
  • Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  • Jalankan Rangkaian

2. Hardware dan Blok Diagram [kembali]

  • STM32F103C8T6
  • Sensor Suhu Lm35
  • Kipas DC
  • Push Button
  • Motor Driver l298N
  • Breadboard
  • Adaptor
  • Resistor  
 3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Prinsip Kerja :

Rangkaian kontrol suhu ruangan ini bekerja dengan memanfaatkan sensor LM35 untuk mendeteksi suhu sekitar yang kemudian dikonversi menjadi tegangan analog dan dibaca oleh pin ADC pada mikrokontroler STM32F103C8. Data suhu tersebut diproses oleh STM32 untuk menentukan aksi pengendalian melalui driver motor L298, yang bertugas mengatur putaran motor DC (berperan sebagai kipas atau aktuator pendingin) dengan mensuplai daya yang lebih besar dari sumber tegangan 6V. Secara keseluruhan, sistem ini membentuk kendali loop terbuka atau tertutup sederhana di mana kecepatan atau status aktif motor bergantung pada ambang batas suhu yang telah diprogram pada mikrokontroler agar kondisi suhu ruangan tetap terjaga.

4. Flowchart dan Listing Program [kembali]

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  */
/* 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.0f;
float temperature = 0.0f;
uint16_t pwmValue = 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)
{

  /* MCU Configuration----------------------------------------*/

  HAL_Init();

  SystemClock_Config();

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

  /* Start PWM */
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

  while (1)
  {

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

    HAL_ADC_Start(&hadc1);

    HAL_ADC_PollForConversion(&hadc1,
                              HAL_MAX_DELAY);

    adcValue = HAL_ADC_GetValue(&hadc1);

    HAL_ADC_Stop(&hadc1);

    /* ADC -> Tegangan */
    voltage = ((float)adcValue * 3.3f) / 4095.0f;

    /* Tegangan -> Suhu LM35 */
    temperature = voltage * 100.0f;

    /* Filter supaya tidak negatif */
    if(temperature < 0.0f)
    {
      temperature = 0.0f;
    }

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

    /* Jika suhu >= 40°C */
    if(temperature >= 40.0f)
    {

      /* Motor mati total */
      HAL_GPIO_WritePin(GPIOA,
                        GPIO_PIN_2,
                        GPIO_PIN_RESET);

      HAL_GPIO_WritePin(GPIOA,
                        GPIO_PIN_3,
                        GPIO_PIN_RESET);

      pwmValue = 0;
    }

    else
    {

      /* Motor nyala */
      HAL_GPIO_WritePin(GPIOA,
                        GPIO_PIN_2,
                        GPIO_PIN_SET);

      HAL_GPIO_WritePin(GPIOA,
                        GPIO_PIN_3,
                        GPIO_PIN_RESET);

      /* ===================================== */
      /* PWM Linear                            */
      /* ===================================== */

      /*
         0°C  -> pelan
         39°C -> maksimum
      */

      pwmValue =
      (uint16_t)(
      2000.0f +
      ((temperature / 39.0f)
      * 63000.0f));

      /* Proteksi */
      if(pwmValue > 65000)
      {
        pwmValue = 65000;
      }

      if(pwmValue < 2000)
      {
        pwmValue = 2000;
      }

    }

    /* Update PWM */
    __HAL_TIM_SET_COMPARE(&htim1,
                          TIM_CHANNEL_1,
                          pwmValue);

    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;

  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;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
                      FLASH_LATENCY_0);

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}

/**
  * @brief ADC1 Initialization Function
  * @param None
  * @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;

  HAL_ADC_Init(&hadc1);

  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;

  /* Sampling lebih stabil */
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;

  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

}

/**
  * @brief TIM1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM1_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig = {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;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  HAL_TIM_PWM_Init(&htim1);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  HAL_TIMEx_MasterConfigSynchronization(&htim1,
                                        &sMasterConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  HAL_TIM_PWM_ConfigChannel(&htim1,
                            &sConfigOC,
                            TIM_CHANNEL_1);

  HAL_TIM_MspPostInit(&htim1);

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* PA2 dan PA3 sebagai output */
  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);

  /* Default LOW */
  HAL_GPIO_WritePin(GPIOA,
                    GPIO_PIN_2 | GPIO_PIN_3,
                    GPIO_PIN_RESET);

}

/**
  * @brief Error Handler
  * @retval None
  */
void Error_Handler(void)
{

  __disable_irq();

  while (1)
  {
  }

}

 5. Video Demo [kembali]



6. Kondisi [kembali]

Percobaan 3 kondisi 3
Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu <30 C maka kipas menyala dengan kecepatan rendah dan saat suhu naik maka kecepatan kipas naik secara linear dan ketika suhu 40 C kipas mati.

7. Video Simulasi [kembali]



8. Download File [kembali]
Download Rangkaian (klik disini) 
Download Datasheet Touch Sensor (klik disini)
Download Datasheet Infrared Sensor (klik disini)
Download Datasheet Resistor (klik disini)
Download Datasheet LED (klik disini)
Download Datasheet Buzzer (klik disini)










Komentar

Postingan populer dari blog ini