[KEMBALI KE MENU SEBELUMNYA]
MODUL II
PERCOBAAN 8 KONDISI 4
1. Prosedur [Kembali]
- Rangkai semua komponen sesuai kondisi yang dipilih
- Rangkai rangkaian sesuai percobaan 8 di modul 2
- Buat program pada STMCubeIDE dan jadikan library untuk komponen di protheus
- Jalankan program pada simulasi dan cobakan sesuai dengan modul dan kondisi
1. STM32F103C8
2. ULN2003A
3. Motor DC
4. Motor DC Stepper
5. Touch Sensor
Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali] → Gambar Rangkaian Sebelum Disimulasikan
→ Gambar Rangkaian Setelah Disimulasikan
PRINSIP KERJA
Mengatur dua jenis motor—motor stepper dan motor DC—dengan bantuan sensor sentuh dan potensiometer, menggunakan mikrokontroler STM32F1 dan library HAL. Sistem bekerja secara otomatis dengan membaca status dari sensor sentuh yang terhubung ke pin PB0. Jika sensor sentuh aktif (ditekan), maka motor DC akan menyala dengan mengaktifkan pin PB7, sementara motor stepper akan dimatikan dengan menyetel semua output stepper ke kondisi LOW. Namun, jika sensor sentuh tidak aktif, motor DC dimatikan dan sistem mulai membaca nilai analog dari potensiometer menggunakan ADC internal (channel 0).
Nilai dari potensiometer ini digunakan untuk menentukan perilaku motor stepper yang dikendalikan melalui empat pin output (PB8–PB11). Jika nilai ADC lebih dari 2048, motor stepper akan berputar ke arah berlawanan jarum jam (CCW) menggunakan urutan langkah STEP_SEQ_CCW
. Jika nilainya di bawah atau sama dengan 2048, motor stepper akan bekerja dalam mode osilasi, yaitu bergerak bolak-balik antara arah searah jarum jam (CW) dan berlawanan jarum jam (CCW), dengan arah dikontrol oleh variabel oscillate_dir
yang selalu berganti nilainya setiap siklus. Fungsi RunStepper
mengatur logika pengaktifan masing-masing pin motor stepper berdasarkan urutan bit array dan memberikan delay antar langkah agar motor dapat bergerak secara bertahap. Fungsi-fungsi pendukung seperti MX_GPIO_Init
, MX_ADC1_Init
, dan SystemClock_Config
digunakan untuk menginisialisasi semua perangkat keras yang diperlukan sebelum masuk ke loop utama.
#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 TOUCH_SENSOR_PORT GPIOB
#define TOUCH_SENSOR_PIN GPIO_PIN_0
#define MOTOR_DC_PORT GPIOB
#define MOTOR_DC_PIN GPIO_PIN_7
// --- Stepper Mode ---
const uint8_t STEP_SEQ_CW[4] = {
(1<<0), // IN1
(1<<1), // IN2
(1<<2), // IN3
(1<<3) // IN4
};
const uint8_t STEP_SEQ_CCW[4] = {
(1<<3), // IN4
(1<<2), // IN3
(1<<1), // IN2
(1<<0) // IN1
};
ADC_HandleTypeDef hadc1;
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void RunStepper(const uint8_t *sequence, uint8_t speed);
void Error_Handler(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
uint8_t oscillate_dir = 0;
while (1) {
GPIO_PinState touch = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);
if (touch == GPIO_PIN_SET) {
// Jika touch aktif → hidupkan motor DC, matikan stepper
HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET);
} else {
// Touch tidak aktif → baca potensiometer
HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET);
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);
if (adc_val > 2048) {
RunStepper(STEP_SEQ_CCW, 5);
} else {
// Mode Oscillate
if (oscillate_dir == 0) {
RunStepper(STEP_SEQ_CW, 5);
} else {
RunStepper(STEP_SEQ_CCW, 5);
}
oscillate_dir = !oscillate_dir;
}
}
}
HAL_Delay(1);
}
}
// --- Fungsi Stepper ---
void RunStepper(const uint8_t *sequence, uint8_t speed) {
static uint8_t step = 0;
HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
step = (step + 1) % 4;
HAL_Delay(speed);
}
// --- Inisialisasi GPIO ---
void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
// Touch sensor input
GPIO_InitStruct.Pin = TOUCH_SENSOR_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TOUCH_SENSOR_PORT, &GPIO_InitStruct);
// Motor DC output
GPIO_InitStruct.Pin = MOTOR_DC_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(MOTOR_DC_PORT, &GPIO_InitStruct);
// Stepper motor output
GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);
}
// --- Inisialisasi ADC untuk Potensiometer ---
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();
}
}
// --- Konfigurasi Clock Default ---
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;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
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();
}
}
// --- Error Handler ---
void Error_Handler(void) {
while (1) {}
}
b. Flowchart
5. Kondisi [Kembali]Kondisi →Percobaan 8 Kondisi 4
Buatlah rangkaian seperti gambar pada percobaan 8. Jika touch sensor mendeteksi maka motor dc berputar. Jika potensiometer bernilai besar maka motor stepper bergerak berlawanan jarum jam dan jika bernilai rendah maka motor stepper bergerak dengan Oscillate Mode
Komentar
Posting Komentar