1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.2. Tulis program untuk IC STM32 di software STM32IDE.3. Compile program tadi, lalu upload file dengan format .hex ke dalam development board STM32.4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
4. Motor Stepper
6. Touch Sensor
Pada percobaan ini, sistem mengandalkan dua jenis input, yaitu input digital dari touch sensor dan input analog dari potensiometer. Touch sensor berfungsi sebagai saklar digital yang terhubung ke pin PB0 dari mikrokontroler STM32F103C8. Sensor ini akan mendeteksi sentuhan pengguna dan mengeluarkan sinyal logika HIGH (3.3V) jika disentuh, atau logika LOW (0V) jika tidak disentuh. Program membaca status sensor ini menggunakan fungsi HAL_GPIO_ReadPin()
. Jika sensor mendeteksi sentuhan (HIGH), maka motor DC akan diaktifkan dengan memberi sinyal HIGH pada pin PB7 yang terhubung ke driver motor ULN2003A. Bersamaan dengan itu, motor stepper akan dimatikan dengan mengatur semua pin kendalinya (IN1βIN4) menjadi LOW.
Sebaliknya, jika touch sensor tidak mendeteksi sentuhan (LOW), maka motor DC akan dimatikan dengan memberikan sinyal LOW pada PB7. Selanjutnya, sistem akan membaca nilai analog dari potensiometer yang dihubungkan ke pin PA0 menggunakan ADC (Analog to Digital Converter) internal STM32. Potensiometer ini menghasilkan tegangan antara 0V hingga 3.3V, yang kemudian dikonversi menjadi nilai digital antara 0 hingga 4095. Program memulai proses pembacaan dengan HAL_ADC_Start()
dan mengambil hasil konversi menggunakan HAL_ADC_GetValue()
. Nilai ADC yang diperoleh dibandingkan dengan angka 2048. Jika nilai lebih besar atau sama dengan 2048, motor stepper akan bergerak searah jarum jam (clockwise) dengan mengikuti pola aktivasi STEP_SEQ_CW
. Sebaliknya, jika nilai lebih kecil dari 2048, motor stepper akan bergerak berlawanan arah jarum jam (counter-clockwise) dengan mengikuti pola STEP_SEQ_CCW
.
Motor stepper dikendalikan oleh empat buah output dari pin PB8, PB9, PB10, dan PB11. Keempat output ini diaktifkan secara bergiliran dalam pola tertentu yang diatur oleh fungsi RunStepperSmooth()
, dengan delay antar langkah sebesar 5 ms untuk menghasilkan pergerakan yang halus. Setiap langkah mengaktifkan kombinasi pin sesuai dengan tabel step yang telah didefinisikan, kemudian langkah berikutnya dijalankan setelah jeda waktu tertentu. Sedangkan motor DC hanya memiliki satu kontrol sederhana, yaitu ON atau OFF berdasarkan status touch sensor.
Saat touch sensor aktif, motor DC berputar dan motor stepper berhenti; saat touch sensor tidak aktif, motor DC berhenti dan motor stepper bergerak dengan arah tergantung dari nilai analog potensiometer. Sistem ini menggunakan kontrol berbasis GPIO dan ADC dari STM32F103C8, dengan pemrograman berbasis HAL Library yang mempermudah pengelolaan peripheral mikrokontroler.
#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// Mode Stepperconst 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<<0), // IN1(1<<3), // IN4(1<<2), // IN3(1<<1) // IN2};ADC_HandleTypeDef hadc1;// Function Prototypesvoid SystemClock_Config(void);void MX_GPIO_Init(void);void MX_ADC1_Init(void);void RunStepperSmooth(const uint8_t *sequence, uint8_t speed);void Error_Handler(void);// Global Variablesuint8_t step_index = 0;uint32_t last_step_time = 0;int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();while (1){GPIO_PinState touchState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);if (touchState == GPIO_PIN_SET){// Jika sensor disentuhHAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); // Motor DC ONHAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET); // Stepper OFF}else{// Jika sensor tidak disentuhHAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); // Motor DC OFF// Baca ADCHAL_ADC_Start(&hadc1);if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK){uint16_t adc_val = HAL_ADC_GetValue(&hadc1);if (adc_val >= 2048){RunStepperSmooth(STEP_SEQ_CW, 5); // Bergerak searah jarum jam}else{RunStepperSmooth(STEP_SEQ_CCW, 5); // Bergerak berlawanan jarum jam}}HAL_ADC_Stop(&hadc1);}HAL_Delay(1); // Delay kecil untuk stabilisasi}}void RunStepperSmooth(const uint8_t *sequence, uint8_t speed){if (HAL_GetTick() - last_step_time >= speed){HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step_index] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET);HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step_index] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET);HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step_index] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET);HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step_index] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET);step_index = (step_index + 1) % 4;last_step_time = HAL_GetTick();}}void MX_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE(); // Untuk PA0 ADC__HAL_AFIO_REMAP_SWJ_NOJTAG(); // Optional: Membebaskan pin JTAG// Touch Sensor sebagai inputGPIO_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 OutputGPIO_InitStruct.Pin = MOTOR_DC_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(MOTOR_DC_PORT, &GPIO_InitStruct);// Stepper Motor OutputGPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);}void MX_ADC1_Init(void){ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = DISABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}sConfig.Channel = ADC_CHANNEL_0; // PA0sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}}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();}}void Error_Handler(void){while (1){// Loop error di sini}}
Buatlah rangkaian seperti gambar pada percobaan 8. Jika touch sensor mendeteksi maka motor dc berputar. Jika potensiometer bernilai besar maka motor stepper bergerak searah jarum jam dan jika bernilai rendah maka motor stepper bergerak berlawanan jarum jam.
Tidak ada komentar:
Posting Komentar