TUGAS PENDAHULUAN 1 MODUL 2




Tugas Pendahuluan 1 Modul 2
(Percobaan 3 Kondisi 5)

1. Prosedur
[Kembali]
  • Rangkai semua komponen di protheus
  • Buat program di pwm
  • Jalankan program dan cobakan sesuai kondisi
2. Hardware dan Diagram Blok [Kembali]

Hardware :

a) Mikrokontroler STM32F103C8

Hardware :

  • Raspberry pi pico



  • Push button





  • Resistor


  • motor
  • sensor Infrared
  • protheus

Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

















Prinsip Kerja : 

Sistem ini memanfaatkan mikrokontroler STM32F103C8 sebagai pusat kendali utama. Sensor LDR (Light Dependent Resistor) digunakan untuk mendeteksi tingkat pencahayaan, dan disusun menyerupai potensiometer guna menyediakan input analog ke ADC (Analog to Digital Converter). Tegangan analog yang dibaca akan dikonversi menjadi data digital oleh mikrokontroler. Ketika nilai ADC berada di bawah 1500, mikrokontroler mengirimkan sinyal PWM dengan duty cycle sebesar 20% ke basis transistor BD139 melalui resistor R1. Transistor tersebut bertindak sebagai saklar untuk mengontrol putaran motor DC yang menerima daya dari sumber +5V, sehingga motor berputar dengan kecepatan rendah. Pada saat yang sama, buzzer akan berbunyi dengan frekuensi sedang, yang dihasilkan dari salah satu pin digital STM32. Sebaliknya, apabila nilai ADC melebihi 3000, mikrokontroler akan menghasilkan sinyal PWM dengan duty cycle penuh (100%), sehingga motor berputar pada kecepatan maksimum. Dalam kondisi ini, buzzer tetap aktif namun dengan frekuensi rendah sebagai penanda kondisi berbeda. Sebagai tambahan pengaman, dioda D1 dipasang untuk melindungi rangkaian dari arus balik yang dihasilkan oleh motor DC yang bersifat induktif. Dengan mekanisme ini, rangkaian dapat secara otomatis mengatur kecepatan motor dan frekuensi buzzer berdasarkan intensitas cahaya yang terdeteksi.


4. Flowchart dan Listing Program [Kembali]

  a. Flowchart
    
    b. Listing Program

#include "main.h"

// Handle untuk ADC dan Timer
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;

// Deklarasi fungsi konfigurasi
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();

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

  uint8_t buzzer_enabled = 1;

  // Batas ambang ADC
  #define THRESH_LOW  1500
  #define THRESH_MID  3000

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

    // Kontrol motor berdasarkan nilai ADC
    if (adc_val < THRESH_LOW)
    {
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 13000); // Kecepatan rendah
    }
    else if (adc_val > THRESH_MID)
    {
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 65535); // Kecepatan penuh
    }
    else
    {
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0); // Motor mati
    }

    // Kontrol buzzer berdasarkan nilai ADC
    if (adc_val < THRESH_LOW && buzzer_enabled)
    {
      uint32_t period = 71999; // Frekuensi sedang
      __HAL_TIM_SET_AUTORELOAD(&htim2, period);
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, period / 2);
    }
    else if (adc_val > THRESH_MID && buzzer_enabled)
    {
      uint32_t period = 143999; // Frekuensi rendah
      __HAL_TIM_SET_AUTORELOAD(&htim2, period);
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, period / 2);
    }
    else
    {
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Buzzer mati
    }

    // Nonaktifkan buzzer jika tombol ditekan
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET)
    {
      buzzer_enabled = 0;
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);
    }

    HAL_Delay(10); // Delay antar pembacaan
  }
}

// Fungsi konfigurasi clock
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);
}

// Inisialisasi ADC
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;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// Inisialisasi Timer untuk motor
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;
  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.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);

  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;
  HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

  HAL_TIM_MspPostInit(&htim1);
}

// Inisialisasi Timer untuk buzzer
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;
  HAL_TIM_PWM_Init(&htim2);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);

  HAL_TIM_MspPostInit(&htim2);
}

// Inisialisasi GPIO (untuk tombol input)
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();

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

// Penanganan error
void Error_Handler(void)
{
  __disable_irq();
  while (1)
  {
    // Loop tak berakhir jika terjadi error
  }
}



5. Kondisi [Kembali]

Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1500 maka motor DC berputar dengan duty cycle 20% dan buzzer berbunyi dengan frekuensi sedang; jika nilai di atas threshold 3000 maka motor DC berputar dengan duty cycle 100% dan buzzer berbunyi dengan frekuensi rendah.
6. Video Simulasi [Kembali]











7. Download File [Kembali]

Download HTML [download]
Download File Rangkaian [download]
Download Video Simulasi [download]
Download Listing Program [download]

Komentar

Postingan populer dari blog ini

MODUL 1

modul 2 sistem digital

Tugas Pendahuluan 1 Modul 1 (Percobaan 1 Kondisi 10)