Laporan Akhir Percobaan 2
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Build program yang telah dibuat, lalu inputkan program ke dalam mikrokontroler melalui stlink.
4. Setelah program diinputkan, uji rangkaian yang telah dirangkai sesuai dengan output yang ditentukan.
Rangkaian ini menggunakan mikrokontroler STM32F103C8T6 sebagai pusat kendali utama, dengan input dari potensiometer yang terhubung ke pin ADC PA0 untuk membaca nilai tegangan analog yang dihasilkan oleh potensiometer. Nilai tegangan ini akan mewakili posisi putaran potensiometer, yang kemudian diproses untuk mengatur kecepatan motor DC dan mengontrol buzzer. Motor DC dikendalikan melalui transistor BD139 yang bertindak sebagai saklar elektronik, dengan basis transistor dihubungkan ke pin PA8 mikrokontroler menggunakan resistor pembatas. Pengendalian motor dilakukan melalui sinyal PWM (Pulse Width Modulation), yang dihasilkan dari Timer 1 pada kanal 1 (TIM1_CH1), mengatur kecepatan motor berdasarkan duty cycle yang ditentukan oleh nilai ADC dari potensiometer. Motor mendapatkan suplai 5V langsung dan dikendalikan melalui jalur ground oleh transistor. Sebagai langkah proteksi, dioda D1 dipasang paralel dengan motor untuk melindungi transistor dari lonjakan tegangan balik saat motor dimatikan.
Selain motor, rangkaian ini juga mengontrol sebuah buzzer yang dihubungkan langsung ke pin PA2 mikrokontroler, yang menerima sinyal PWM dari Timer 2 pada kanal 3 (TIM2_CH3). Setelah inisialisasi, sistem membaca nilai potensiometer yang digunakan untuk menentukan kecepatan motor dengan teknik Pulse Width Modulation (PWM) dan juga untuk mengatur kondisi buzzer.
Nilai potensiometer kemudian diklasifikasikan menjadi tiga kondisi berdasarkan persentase ambang batas (threshold). Pada kondisi pertama, jika nilai potensiometer berada di bawah 33%, motor berjalan dengan kecepatan lambat (PWM = 20%) dan buzzer dalam keadaan mati. Pada kondisi kedua, jika nilai potensiometer berada antara 33% hingga 66%, motor berjalan dengan kecepatan sedang (PWM = 60%) dan buzzer tetap tidak aktif. Pada kondisi ketiga, ketika nilai potensiometer melebihi 66% namun kurang dari 99%, terdapat pengecekan tambahan pada tombol kontrol. Jika tombol tidak aktif, motor berjalan dengan kecepatan penuh (PWM = 100%) dan buzzer tetap mati. Namun, jika tombol ditekan (aktif), motor tetap berkecepatan penuh, tetapi buzzer akan menyala sebagai tanda peringatan.
#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, 200); // Lambat } else if (adc_val < THRESH_MID) { __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 600); // 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 } }
Komentar
Posting Komentar