LA Percobaan 2 (Modul 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 STM32F103C8 dengan sensor soil moisture sebagai input dan LED RGB serta motor stepper sebagai output. Sensor soil moisture terhubung ke pin PA0-WKUP. Motor stepper dikendalikan melalui pin PB8, PB9, PB10, dan PB11 yang terhubung ke Stepper Driver ULN2003. LED RGB terhubung dengan kaki merah ke pin PB12, kaki hijau ke pin PB13, dan kaki biru ke pin PB14, masing-masing melalui resistor.
Konfigurasi pada STM32 CubeIDE dilakukan dengan memilih serial wire untuk debugging dan crystal/ceramic resonator pada bagian RCC. Setelah konfigurasi disimpan, program utama ditulis dengan diawali dengan #include "main.h".
Setelah program selesai dibuat, kode di-build dan diunggah ke mikrokontroler melalui ST-Link. Saat dijalankan, sistem akan memberikan output yang berbeda berdasarkan tingkat kelembapan tanah yang terdeteksi oleh sensor soil moisture. Jika tanah basah, LED RGB akan berwarna merah dan motor stepper berputar searah jarum jam (clockwise). Jika tanah kering, LED RGB akan berwarna biru dan motor stepper berputar bolak-balik (oscillate). Jika tanah normal, LED RGB akan berwarna hijau dan motor stepper berputar berlawanan arah jarum jam (counter-clockwise).
#include "stm32f1xx_hal.h"
// ======================== Konfigurasi Hardware ========================
#define STEPPER_PORT GPIOB
#define IN1_PIN GPIO_PIN_8
#define IN2_PIN GPIO_PIN_9
#define IN3_PIN GPIO_PIN_10
#define IN4_PIN GPIO_PIN_11
#define LED_PORT GPIOB
#define LED_RED_PIN GPIO_PIN_12
#define LED_GREEN_PIN GPIO_PIN_13
#define LED_BLUE_PIN GPIO_PIN_14
// ======================== Mode Stepper Motor ========================
const uint16_t STEP_SEQ_CW[4] = {0x0100, 0x0200, 0x0400, 0x0800}; // Clockwise
const uint16_t STEP_SEQ_CCW[4] = {0x0800, 0x0400, 0x0200, 0x0100}; // Counter-Clockwise
// ======================== Variabel Global ========================
ADC_HandleTypeDef hadc1;
uint8_t current_mode = 0; // 0 = CW, 1 = CCW, 2 = Oscillate
uint8_t direction = 0; // Untuk mode Oscillate
// ======================== Deklarasi Fungsi ========================
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void RunStepper(const uint16_t *sequence, uint8_t speed);
void Error_Handler(void);
// ======================== Fungsi Utama ========================
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1) {
// Baca potensiometer
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);
// Tentukan mode berdasarkan nilai ADC
if (adc_val < 1365) {
current_mode = 0; // CW
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN | LED_BLUE_PIN, GPIO_PIN_RESET);
} else if (adc_val < 2730) {
current_mode = 1; // CCW
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_BLUE_PIN, GPIO_PIN_RESET);
} else {
current_mode = 2; // Oscillate
HAL_GPIO_WritePin(LED_PORT, LED_BLUE_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_GREEN_PIN, GPIO_PIN_RESET);
}
}
// Eksekusi mode berdasarkan nilai current_mode
switch (current_mode) {
case 0: // CW
RunStepper(STEP_SEQ_CW, 10);
break;
case 1: // CCW
RunStepper(STEP_SEQ_CCW, 10);
break;
case 2: // Oscillate
if (direction == 0) {
RunStepper(STEP_SEQ_CW, 5);
if ((STEPPER_PORT->ODR & 0x0F00) == STEP_SEQ_CW[3])
direction = 1;
} else {
RunStepper(STEP_SEQ_CCW, 5);
if ((STEPPER_PORT->ODR & 0x0F00) == STEP_SEQ_CCW[3])
direction = 0;
}
break;
}
}
}
// ======================== Fungsi Stepper ========================
void RunStepper(const uint16_t *sequence, uint8_t speed) {
static uint8_t step = 0;
STEPPER_PORT->ODR = (STEPPER_PORT->ODR & 0x00FF) | sequence[step];
step = (step + 1) % 4;
HAL_Delay(speed);
}
// ======================== Konfigurasi 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;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
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;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
Error_Handler();
}
}
// ======================== Inisialisasi GPIO ========================
void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
// Konfigurasi LED
GPIO_InitStruct.Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// Konfigurasi Stepper Motor
GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);
}
// ======================== Inisialisasi ADC ========================
void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
}
// ======================== Error Handler ========================
void Error_Handler(void) {
while (1) {}
}
Komentar
Posting Komentar