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]
PWM pada STM32 digunakan untuk mengatur lebar pulsa sehingga besar daya yang diterima beban dapat diubah. Pada motor DC, PWM mempengaruhi kecepatan putaran karena duty cycle menentukan rata-rata tegangan motor. Pada LED, PWM digunakan untuk mengatur tingkat kecerahan. Semakin besar duty cycle, semakin cepat motor berputar dan semakin terang LED menyala. Perbedaannya terletak pada efek outputnya, motor menghasilkan perubahan mekanik sedangkan LED menghasilkan perubahan intensitas cahaya.
2. Analisa bagaimana cara pembacaan nilai sensor analog menggunakan ADC pada STM32
ADC pada STM32 bekerja dengan mengubah sinyal analog menjadi data digital. Sensor analog seperti LDR atau LM35 menghasilkan tegangan tertentu yang masuk ke pin ADC STM32, kemudian dikonversi menjadi nilai digital sesuai resolusi ADC, misalnya 12-bit dengan rentang 0–4095. Nilai tersebut lalu diolah program untuk menentukan kondisi sensor, seperti suhu atau intensitas cahaya.
3. Analisa bagaimana penggunaan interrupt eksternal dalam mendeteksi input dari sensor atau tombol pada STM32
Interrupt eksternal pada STM32 digunakan untuk mendeteksi perubahan sinyal dari tombol atau sensor tanpa harus terus-menerus melakukan polling. Ketika terjadi perubahan logika pada pin, seperti rising edge atau falling edge, STM32 langsung menjalankan fungsi interrupt callback. Cara ini membuat sistem lebih cepat dan efisien karena mikrokontroler dapat merespons event secara otomatis.
4. Analisa bagaimana cara kerja fungsi HAL_GetTick() pada STM32
Fungsi HAL_GetTick() pada STM32 digunakan untuk mengambil nilai waktu sistem dalam satuan milidetik sejak mikrokontroler mulai berjalan. Nilai ini berasal dari timer SysTick yang bertambah setiap 1 ms. Fungsi ini sering dipakai untuk membuat delay non-blocking, pengukuran waktu, atau penjadwalan proses tanpa menghentikan program utama.
5. 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 yang dikonfigurasi pada mode PWM. Frekuensi PWM diatur melalui prescaler dan period timer, sedangkan duty cycle diatur melalui nilai compare register. Setiap channel timer dapat dihubungkan ke pin tertentu sehingga satu timer dapat menghasilkan beberapa sinyal PWM sekaligus. Penggunaan timer internal membuat PWM lebih stabil dan presisi dibanding pengaturan manual menggunakan delay biasa.
6. Bagaimana mengatur pergerakan motor servo pada stm 32?
Pergerakan motor servo pada STM32 diatur menggunakan sinyal PWM dengan frekuensi sekitar 50 Hz. Posisi servo ditentukan oleh lebar pulsa PWM, biasanya sekitar 1 ms untuk sudut 0°, 1,5 ms untuk 90°, dan 2 ms untuk 180°. STM32 mengubah duty cycle PWM sesuai sudut yang diinginkan sehingga servo bergerak ke posisi tertentu secara presisi.
7. Download File [kembali]
- Download Analisa [Klik]

Tidak ada komentar:
Posting Komentar