tp 2 modul 2

 




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.

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




1. Pembacaan Nilai Potensiometer:

Potensiometer yang terhubung ke mikrokontroler STM32F103C8 berfungsi sebagai input analog yang akan diubah menjadi nilai digital melalui ADC internal mikrokontroler.
Nilai ADC dari potensiometer ini kemudian dibaca oleh mikrokontroler untuk menentukan kondisi pengendalian motor DC dan buzzer. Nilai tersebut akan dibandingkan dengan dua threshold, yaitu 2000 dan 3500.

2. Pengendalian Motor (Dengan Menggunakan PWM):

PWM (Pulse Width Modulation) digunakan untuk mengatur kecepatan motor DC sesuai nilai potensiometer.

  • Jika nilai potensiometer di bawah threshold 2000
    → Motor DC akan berputar dengan duty cycle sebesar 40%, yang berarti motor akan berputar dengan kecepatan sedang.

  • Jika nilai potensiometer di atas threshold 3500
    → Motor DC akan berputar dengan duty cycle sebesar 60%, menunjukkan kecepatan lebih tinggi dibandingkan kondisi sebelumnya.

3. Pengendalian Buzzer:

Buzzer pada rangkaian ini dikendalikan langsung oleh mikrokontroler melalui sinyal PWM.

  • Jika nilai potensiometer di bawah 2000
    → Buzzer akan berbunyi dengan frekuensi sedang. Mikrokontroler menghasilkan sinyal PWM dengan frekuensi tertentu untuk mengaktifkan buzzer.

  • Jika nilai potensiometer di atas 3500
    → Buzzer akan mati. Mikrokontroler menghentikan sinyal ke buzzer sehingga tidak mengeluarkan suara.

4. PWM pada Motor DC dan Buzzer:

Mikrokontroler STM32F103C8 mengatur dua sinyal PWM terpisah:

  • PWM untuk Motor DC:
    Digunakan untuk mengatur kecepatan motor DC dengan duty cycle 40% atau 60% tergantung nilai potensiometer.

  • PWM untuk Buzzer:
    Menghasilkan frekuensi sedang saat potensiometer di bawah 2000, dan menghentikan sinyal saat nilai potensiometer di atas 3500.

4. Flowchart dan listing program [Kembali]

  • Flowchart




  • Listing Program
  • #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);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
      HAL_ADC_Start(&hadc1);

      uint8_t buzzer_enabled = 1;

      #define THRESH_LOW 1500
      #define THRESH_MID 3000

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

        if (adc_val < THRESH_LOW)
        {
          __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 13000);
        }
        else if (adc_val > THRESH_MID)
        {
          __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 65535);
        }
        else
        {
          __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
        }

        if (adc_val < THRESH_LOW && buzzer_enabled)
        {
          uint32_t period = 71999;
          __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;
          __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);
        }

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

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

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

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

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

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

    void Error_Handler(void)
    {
      __disable_irq();
      while (1)
      {
      }
    }


5. Kondisi [Kembali]

Percobaan 3 kondisi 3, Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 2000 maka motor DC berputar dengan duty cycle 40% dan buzzer berbunyi dengan frekuensi sedang; jika nilai di atas threshold 3500 maka motor DC berputar dengan duty cycle 60% dan buzzer mati.

6. Video Simulasi [Kembali]





7. Download File [Kembali]



Tidak ada komentar:

Posting Komentar

  BAHAN PRESENTASI UNTUK MATA KULIAH  SISTEM DIGITAL 2024 OLEH: Afifah Febry Nabilla 2210952001 Dosen Pengampu: Darwison, M.T Referensi:  a....