TP M2 PERCOBAAN 3 KONDISI 2





Tugas Pendahuluan M2 Percobaan 3 Kondisi 2

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.

1. Prosedur [kembali]
    Percobaan 3 
  1. Siapkan alat dan bahan.
  2. Pastikan semua komponen telah disiapkan dan siap digunakan. Siapkan STM32F103C8 mikrokontroler, sensor LDR, buzzer, transistor 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


STM32F103C8 adalah mikrokontroler 32-bit yang diproduksi oleh STMicroelectronics. Mikrokontroler ini termasuk dalam keluarga STM32 yang menggunakan inti ARM Cortex-M3. STM32F103C8 dilengkapi dengan berbagai fitur, seperti memori flash 64KB, SRAM 20KB, dan banyak pin I/O (Input/Output) untuk berbagai aplikasi.
  • Resistor 10K dan 2.2k ohm
Resistor adalah komponen elektronik yang berfungsi untuk menghambat arus listrik dalam suatu rangkaian. Nilai hambatan resistor diukur dalam ohm (Ω) dan sering digunakan untuk mengontrol tegangan, membatasi arus, serta melindungi komponen lain seperti LED dari kerusakan akibat arus berlebih. Resistor tersedia dalam berbagai jenis, seperti tetap, variabel (potensiometer), dan termistor yang peka terhadap suhu.

  • Push Button
Push button adalah sakelar mekanik yang bekerja saat ditekan dan kembali ke posisi semula saat dilepas. Komponen ini digunakan untuk mengaktifkan atau menonaktifkan sirkuit listrik, seperti dalam sistem kontrol, input pengguna pada perangkat elektronik, dan tombol reset atau start dalam rangkaian mikroprosesor. Push button sering dikombinasikan dengan mikrokontroler untuk menangkap input pengguna dalam berbagai aplikasi interaktif.
  • LDR


LDR (Light Dependent Resistor) adalah jenis resistor yang nilai resistansinya berubah tergantung pada intensitas cahaya yang diterimanya. Ketika cahaya jatuh pada permukaan LDR, resistansinya akan menurun, sementara dalam kondisi gelap, resistansinya akan meningkat. Fungsi utama LDR adalah untuk mendeteksi tingkat cahaya, yang sering digunakan dalam aplikasi seperti pengaturan otomatis pencahayaan, sensor cahaya pada perangkat elektronik, serta sebagai input pada sistem pengukuran intensitas cahaya atau pengendalian pencahayaan secara otomatis.
  • Buzzer


Buzzer adalah komponen elektronik yang menghasilkan suara sebagai output dari sinyal listrik yang diterimanya. Buzzer biasanya digunakan untuk memberi tanda atau peringatan melalui suara dalam berbagai perangkat, seperti alarm, perangkat pengingat, atau sistem kontrol. Terdapat dua jenis buzzer, yaitu piezoelectric dan elektromagnetik. Buzzer piezoelectric bekerja dengan mengubah sinyal listrik menjadi getaran mekanik yang menghasilkan suara, sedangkan buzzer elektromagnetik menghasilkan suara dengan cara menggerakkan membran menggunakan medan magnet. Buzzer sering digunakan dalam aplikasi yang membutuhkan pemberitahuan atau peringatan suara, seperti alarm keamanan, timer, atau indikator status perangkat.
  • Motor DC


Motor DC (Direct Current) adalah jenis motor listrik yang beroperasi menggunakan arus searah (DC). Motor ini mengubah energi listrik menjadi energi mekanik untuk menghasilkan gerakan rotasi. Motor DC memiliki dua komponen utama, yaitu stator (bagian diam) dan rotor (bagian yang berputar). Motor DC digunakan dalam berbagai aplikasi untuk menggerakkan perangkat mekanik, seperti dalam robotika, kendaraan listrik, kipas angin, dan sistem penggerak otomatis lainnya. Motor DC dapat dikendalikan kecepatan rotasinya dengan mengubah tegangan atau arus yang diberikan.

Blok Diagram :



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


Prinsip Kerja Rangkaian Berdasarkan Perintah Tugas:

  1. Pembacaan Nilai Potensiometer:

    • Potensiometer yang terhubung ke mikrokontroler STM32F103C8 akan memberikan input analog yang akan diubah menjadi nilai digital oleh mikrokontroler.

    • Nilai potensiometer ini kemudian dibaca oleh mikrokontroler untuk menentukan kondisi yang akan dijalankan pada rangkaian. Nilai ini akan dibandingkan dengan dua threshold, yaitu 1500 dan 3000.

  2. Pengendalian Motor (Dengan Menggunakan PWM):

    • Karena pada rangkaian tidak ada motor yang secara eksplisit terlihat, prinsip kerja ini akan disesuaikan dengan penggunaan PWM (Pulse Width Modulation) untuk mengatur kecepatan motor DC yang seharusnya ada pada aplikasi nyata.

    • Ketika nilai potensiometer di bawah threshold 1500, motor DC akan berputar dengan duty cycle 30%. Dalam hal ini, duty cycle sebesar 30% menunjukkan bahwa motor akan berputar dengan kecepatan rendah.

    • Ketika nilai potensiometer di atas threshold 3000, motor DC akan berputar dengan duty cycle 80%, yang berarti motor akan berputar dengan kecepatan lebih tinggi dibandingkan dengan kondisi pertama.

  3. Pengendalian Buzzer:

    • Pada rangkaian ini, buzzer dikendalikan oleh mikrokontroler melalui output digital.

    • Jika nilai potensiometer di bawah 1500, buzzer akan berbunyi dengan frekuensi tinggi. Mikrokontroler akan menghasilkan sinyal PWM dengan frekuensi tinggi untuk menghasilkan suara frekuensi tinggi dari buzzer.

    • Jika nilai potensiometer di atas 3000, buzzer dimatikan. Mikrokontroler akan menghentikan output yang menuju ke buzzer, sehingga buzzer tidak mengeluarkan suara.

  4. PWM pada Motor DC dan Buzzer:

    • Mikrokontroler STM32F103C8 akan mengatur PWM baik untuk motor DC maupun buzzer berdasarkan nilai potensiometer.

      • PWM untuk Motor DC: Dengan duty cycle 30% atau 80%, mikrokontroler mengatur kecepatan motor DC.

      • PWM untuk Buzzer: Mikrokontroler menghasilkan sinyal dengan frekuensi tinggi (untuk buzzer berbunyi) atau tidak menghasilkan sinyal sama sekali (untuk mematikan buzzer).


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]

Percobaan 3 kondisi 2 
"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

KELEBIHAN DAN KEKURANGAN MENJADI SEORANG PEMIMPIN

KOMITMEN TERHADAP KESELAMATAN DAN RESIKO DALAM PEKERJAAN