TP M2 P3K2


[KEMBALI KE MENU SEBELUMNYA]


1. Prosedur [kembali]
    Percobaan 3 
  1. Siapkan alat dan bahan.
  2. Pastikan semua komponen telah disiapkan dan siap digunakan. Siapkan STM32F103C8 mikrokontroler, sensor LDRbuzzertransistor BD139, serta resistor yang diperlukan.
  3. Rangkai komponen sesuai diagram:

    • Sensor LDR (LDR1):

      • Hubungkan satu kaki LDR ke +3.3V.

      • Hubungkan kaki lainnya ke pin ADC (PC0) pada mikrokontroler STM32F103C8.

      • Pasang resistor pull-down (R2 = 10kΩ) antara kaki LDR yang terhubung ke pin ADC dan ground untuk menjaga kondisi pin tetap pada level LOW saat tidak ada cahaya.

    • Buzzer (BUZ1):

      • Hubungkan buzzer ke +5V.

      • Hubungkan sisi lainnya ke kaki kolektor transistor BD139.

      • Emitor transistor BD139 dihubungkan ke ground.

    • Transistor BD139 (Q1):

      • Kaki kolektor transistor terhubung ke buzzer.

      • Kaki emitor transistor terhubung ke ground.

      • Kaki basis transistor dihubungkan ke pin PA0 STM32F103C8 melalui resistor R1 (2.2kΩ).

  4. Hubungkan Sumber Daya:

    • Pastikan mikrokontroler STM32F103C8 mendapat 3.3V melalui pin VDDA dan buzzer mendapat 5V.

  5. Masukkan program ke mikrokontroler:

    • Gunakan STM32CubeIDE atau software lain yang kompatibel untuk memprogram mikrokontroler STM32F103C8.

    • Program yang digunakan akan membaca nilai ADC dari sensor LDR dan menentukan apakah nilai cahaya yang diterima lebih rendah dari ambang batas. Jika ya, maka pin PA0 akan memberikan sinyal HIGH untuk mengaktifkan transistor dan buzzer.

  6. Program untuk Sensor LDR:

    • Program ini akan membaca nilai ADC dari sensor LDR yang terhubung ke pin PC0.

    • Jika nilai ADC (yang dikonversi menjadi lux) lebih rendah dari ambang batas tertentu, maka pin PA0 akan memberikan sinyal HIGH yang mengaktifkan transistor Q1 dan buzzer.

    • Jika nilai lux lebih tinggi dari ambang batas, transistor akan dimatikan dan buzzer akan berhenti berbunyi.

  7. Pengujian:

    • Uji dengan mengubah tingkat cahaya yang diterima oleh sensor LDR (misalnya dengan menutup atau membuka sumber cahaya).

    • Jika cahaya rendah (lux < ambang batas), buzzer akan aktif berbunyi.

    • Jika cahaya cukup (lux > ambang batas), buzzer akan mati.

  8. Verifikasi Output:

    • Pastikan bahwa buzzer berbunyi saat cahaya rendah dan berhenti saat cahaya cukup terang.

    • Cek output dari mikrokontroler yang mencetak nilai ADC atau lux pada terminal untuk memverifikasi bahwa sensor LDR berfungsi dengan baik.

  9. Selesai:

    • Setelah semua komponen berfungsi sesuai dengan yang diharapkan, percobaan ini selesai. Anda telah berhasil membuat sistem peringatan berbasis cahaya menggunakan sensor LDR dan buzzer.

2. Hardware dan Diagram Blok [kembali]
Hardware 
  • STM32F103C8



  • Resistor 10K dan 2.2k ohm


  • Push Button

  • LDR



  • Buzzer



  • Motor DC




Blok Diagram :



3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
  • Rangkaian sebelum dijalankan

  • Rangkaian sesudah dijalankan


        Prinsip Kerja Rangkaian 

  1. Cara Kerja Rangkaian Pembacaan Potensiometer:

    Potensiometer yang terhubung ke mikrokontroler STM32F103C8 berfungsi sebagai sumber sinyal analog yang akan dikonversi menjadi sinyal digital oleh mikrokontroler tersebut.

    Data yang diperoleh dari potensiometer ini dibaca oleh mikrokontroler untuk menentukan aksi yang harus dilakukan oleh rangkaian. Nilai tersebut akan dibandingkan dengan dua batas tertentu, yaitu 1500 dan 3000.

    Pengaturan Motor (Melalui Sinyal PWM):

    Meski motor DC tidak terlihat secara langsung pada rangkaian, prinsip kerjanya disimulasikan dengan menggunakan sinyal PWM (Pulse Width Modulation), yang umum digunakan dalam pengaturan kecepatan motor DC.

    Jika pembacaan potensiometer menunjukkan nilai di bawah 1500, maka motor akan dijalankan dengan duty cycle sebesar 30%. Artinya, motor akan beroperasi pada kecepatan rendah.

    Sebaliknya, jika nilai yang terbaca melebihi 3000, duty cycle akan dinaikkan menjadi 80%, menandakan bahwa motor akan berputar dengan kecepatan tinggi.

    Kontrol Terhadap Buzzer:

    Buzzer dalam rangkaian ini dikendalikan oleh output digital dari mikrokontroler.

    Apabila nilai potensiometer di bawah 1500, buzzer akan diaktifkan dan menghasilkan suara dengan nada tinggi. Ini dilakukan dengan mengeluarkan sinyal PWM berfrekuensi tinggi dari mikrokontroler.

    Namun jika nilai potensiometer melebihi 3000, maka buzzer akan dimatikan dengan cara menghentikan keluaran sinyal dari mikrokontroler.

    Penggunaan PWM pada Motor DC dan Buzzer:

    STM32F103C8 menggunakan sinyal PWM untuk mengendalikan baik kecepatan motor maupun bunyi dari buzzer.

    • PWM untuk Motor DC: Duty cycle diatur ke 30% atau 80%, tergantung pada nilai potensiometer, guna mengatur kecepatan motor.

    • PWM untuk Buzzer: Mikrokontroler menghasilkan frekuensi tinggi agar buzzer berbunyi, atau tidak mengeluarkan sinyal sama sekali jika buzzer ingin dimatikan.


4. Flowchart dan Listing Program [kembali]
  • Flowchart



  • Listing Program
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;

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

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

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // Motor PWM
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); // Buzzer PWM
  HAL_ADC_Start(&hadc1);

  uint8_t buzzer_enabled = 1;
  uint32_t last_buzzer_change = 0;
  uint8_t buzzer_freq_index = 0;

  const uint32_t buzzer_periods[] = {143999, 71999, 47999}; // Frekuensi berbeda

  // Threshold (dari rendah → sedang → tinggi)
  const uint16_t THRESH_LOW = 1500;
  const uint16_t THRESH_MID = 3000;

  while (1)
  {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 10);
    uint32_t adc_val = HAL_ADC_GetValue(&hadc1);

    // --- Motor Control ---
    if (adc_val < THRESH_LOW)
    {
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 19660); // Lambat
    }
    else if (adc_val < THRESH_MID)
    {
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,52428); // Sedang
    }
    else
    {
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000); // Cepat
    }

    // --- Buzzer Logic ---
    if (adc_val < THRESH_LOW && buzzer_enabled)
    {
      // Ubah frekuensi buzzer setiap 500ms
      if (HAL_GetTick() - last_buzzer_change >= 500)
      {
        last_buzzer_change = HAL_GetTick();
        buzzer_freq_index = (buzzer_freq_index + 1) % 3;

        uint32_t period = buzzer_periods[buzzer_freq_index];
        __HAL_TIM_SET_AUTORELOAD(&htim2, period);
        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, period / 2); // 50% duty
      }
    }
    else
    {
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Matikan buzzer
    }

    // --- Button Logic (PB0 ditekan = nonaktifkan buzzer) ---
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET)
    {
      buzzer_enabled = 0;
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Paksa matikan buzzer
    }

    HAL_Delay(10);
  }
}


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

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

  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

static void MX_TIM1_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {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;
  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.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim1);

}

static void MX_TIM2_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};


  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 65535;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &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(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim2);

}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PB0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

void Error_Handler(void)
{

  __disable_irq();
  while (1)
  {
  }

}

#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{

}
#endif /* USE_FULL_ASSERT */


5. Kondisi [kembali]

    P3 K2

"Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1500 maka motor DC berputar dengan duty cycle 30% dan buzzer berbunyi dengan frekuensi tinggi; jika nilai di atas threshold 3000 maka motor DC berputar dengan duty cycle 80% dan buzzer mati"

6. Video Simulasi [kembali]



7. Download file [kembali]



Komentar

Postingan populer dari blog ini