Percobaan 3
- Siapkan alat dan bahan.
- Pastikan semua komponen telah disiapkan dan siap digunakan. Siapkan STM32F103C8 mikrokontroler, sensor LDR, buzzer, transistor BD139, serta resistor yang diperlukan.
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Ω).
Hubungkan Sumber Daya:
Pastikan mikrokontroler STM32F103C8 mendapat 3.3V melalui pin VDDA dan buzzer mendapat 5V.
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.
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.
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.
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.
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.
- STM32F103C8
- Resistor 10K dan 2.2k ohm
- Push Button
- LDR
- Buzzer
- Motor DC
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 3000while (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){}}
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.
- Datasheet STM32F103C8 klik disini
- Datasheet motor dc klik disini
- Datasheet resistor klik disini
- Datasheet buzzer klik disini
- Data Sheet LDR klik disini
- Datasheet push button klik disini
Tidak ada komentar:
Posting Komentar