Laporan Akhir 1
1. Prosedur [kembali]
- Susun rangkaian alat sesuai prosedur yang tercantum pada modul.
- Jalankan Proteus, lalu buat rangkaian komponen mengikuti skema pada modul.
- Buka STM32CubeIDE dan lakukan pengaturan pin untuk menentukan fungsi GPIO sebagai input dan output.
- Upload program ke mikrokontroler STM32.
- Jalankan sistem untuk menguji program.
2. Hardware dan Diagram Blok [kembali]
Hardware
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
4. Flowchart dan Listing Program [kembali]
- Flowchart
- Listing Program
#include "main.h" // HANDLE ADC_HandleTypeDef hadc1; TIM_HandleTypeDef htim3; // VARIABLE uint8_t manual_mode = 0; uint8_t posisi_servo = 0; uint8_t last_button = 1; // THRESHOLD #define LDR_THRESHOLD 2000 // ================= CLOCK ================= void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); } // ================= GPIO ================= void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; // LDR PA0 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // BUTTON PB1 GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// SERVO PA6
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// ================= ADC =================
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
HAL_ADC_Init(&hadc1);
}
// ================= PWM (FIX SERVO) =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
// FIX: 1us tick (assume 48MHz clock)
htim3.Init.Prescaler = 48 - 1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20000 - 1; // 20ms = 50Hz (servo standard)
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // posisi tengah awal
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
// ================= SERVO CONTROL =================
void set_servo(uint8_t state)
{
if (state == 0)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000); // masuk atap
}
else
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000); // keluar
atap
}
}
// ================= ADC READ =================
uint16_t read_LDR(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
return HAL_ADC_GetValue(&hadc1);
}
// ================= MAIN =================
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM3_Init();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
while (1)
{
// ===== BUTTON TOGGLE =====
uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
if (last_button == 1 && button == 0)
{
manual_mode = !manual_mode;
posisi_servo = !posisi_servo;
set_servo(posisi_servo);
HAL_Delay(50);
}
last_button = button;
// ===== MODE OTOMATIS =====
if (!manual_mode)
{
uint16_t ldr = read_LDR();
if (ldr < LDR_THRESHOLD)
{
posisi_servo = 0; // mendung → masuk
}
else
{
posisi_servo = 1; // terang → keluar
}
set_servo(posisi_servo);
}
HAL_Delay(100);
}
}
5. Video Demo [kembali]
6. Analisa [kembali]
Analisa bagaimana perbedaan implementasi PWM antara STM32 serta dampaknya terhadap kontrol motor dan LED.!
PWM pada STM32 dihasilkan menggunakan timer internal untuk mengatur duty cycle dan frekuensi sinyal. Pada LED, PWM digunakan untuk mengatur kecerahan berdasarkan besar duty cycle, sedangkan pada motor DC digunakan untuk mengatur kecepatan putaran motor. Duty cycle besar menghasilkan LED lebih terang dan motor berputar lebih cepat. Motor biasanya memerlukan driver tambahan karena membutuhkan arus lebih besar dibanding LED.Analisa bagaimana cara pembacaan nilai sensor analog menggunakan ADC pada STM32!
ADC pada STM32 digunakan untuk mengubah sinyal analog dari sensor menjadi data digital. Prosesnya dilakukan dengan mengonfigurasi pin analog, menjalankan ADC menggunakan fungsi HAL, lalu membaca hasil konversi menggunakanHAL_ADC_GetValue(). Nilai ADC biasanya memiliki resolusi 12-bit dengan rentang 0–4095 yang mewakili tegangan 0–3.3V.Analisa bagaimana penggunaan interrupt eksternal dalam mendeteksi input dari sensor atau tombol pada STM32!
Interrupt eksternal pada STM32 digunakan untuk mendeteksi perubahan input dari tombol atau sensor tanpa polling terus-menerus. Saat terjadi perubahan sinyal pada pin EXTI, mikrokontroler langsung menjalankan fungsi callback sehingga respon sistem menjadi lebih cepat dan penggunaan CPU lebih efisien. Interrupt banyak digunakan pada tombol, sensor PIR, dan limit switch.Analisa bagaimana cara kerja fungsi HAL_GetTick() pada STM32!
FungsiHAL_GetTick()pada STM32 digunakan untuk menghitung waktu dalam milidetik sejak sistem mulai berjalan dengan memanfaatkan timer SysTick. Fungsi ini sering digunakan untuk delay non-blocking, pengukuran waktu, dan pengaturan interval proses tanpa menghentikan program utama sehingga lebih efisien dibandingHAL_Delay().Analisa bagaimana perbedaan konfigurasi dan kontrol pin PWM serta pemanfaatan timer internal pada STM32 dalam menghasilkan sinyal PWM
PWM pada STM32 dihasilkan menggunakan timer internal dengan konfigurasi prescaler, period, dan compare value untuk mengatur frekuensi serta duty cycle. Pin PWM harus diatur dalam mode alternate function sesuai channel timer yang digunakan. Pengaturan timer yang tepat menghasilkan sinyal PWM stabil untuk kebutuhan seperti kontrol LED dan motor.Bagaimana mengatur pergerakan motor servo pada stm 32?
Motor servo pada STM32 dikendalikan menggunakan sinyal PWM dengan frekuensi sekitar 50 Hz. Posisi servo ditentukan oleh lebar pulsa PWM, misalnya 1 ms untuk 0°, 1.5 ms untuk 90°, dan 2 ms untuk 180°. Pergerakan servo diatur dengan mengubah nilai compare register (CCR) pada timer PWM.
7. Download File [kembali]
- Download Analisa [klik disini]

Komentar
Posting Komentar