TP 2 : P8 K1
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
Prinsip Kerja:
Pada eksperimen ini, sistem
mengandalkan dua sumber input: input digital dari sensor sentuh dan input
analog dari potensiometer. Sensor sentuh berfungsi sebagai saklar digital yang
terhubung ke pin PB0 dari mikrokontroler STM32F103C8. Ketika disentuh, sensor
ini menghasilkan sinyal logika HIGH (3.3V), dan jika tidak disentuh akan
menghasilkan logika LOW (0V). Status sensor dibaca menggunakan fungsi
HAL_GPIO_ReadPin(). Apabila sentuhan terdeteksi (HIGH), motor DC diaktifkan
dengan mengirimkan logika HIGH ke pin PB7 yang mengendalikan driver motor
ULN2003A. Pada saat yang sama, motor stepper dinonaktifkan dengan menyetel
semua pin kontrolnya (IN1–IN4) ke kondisi LOW.
Sebaliknya, jika tidak ada
sentuhan yang terdeteksi (LOW), sinyal LOW dikirim ke PB7 sehingga motor DC
berhenti berputar. Setelah itu, sistem membaca nilai analog dari potensiometer
yang tersambung ke pin PA0. Tegangan yang dihasilkan potensiometer (0–3.3V)
dikonversi menjadi nilai digital 0–4095 menggunakan ADC internal STM32.
Pembacaan ADC diawali dengan perintah HAL_ADC_Start() dan hasil konversi
diambil menggunakan HAL_ADC_GetValue(). Nilai ini kemudian dibandingkan dengan
angka 2048: jika lebih besar atau sama dengan 2048, motor stepper berputar
searah jarum jam (clockwise) menggunakan urutan aktivasi STEP_SEQ_CW; jika
lebih kecil, motor stepper berputar berlawanan arah jarum jam
(counter-clockwise) menggunakan STEP_SEQ_CCW.
Motor stepper dikontrol melalui
empat pin output yaitu PB8, PB9, PB10, dan PB11. Aktivasi pin dilakukan secara
bergantian mengikuti pola tertentu melalui fungsi RunStepperSmooth(), dengan
jeda antar langkah sebesar 5 ms untuk menghasilkan pergerakan yang lebih mulus.
Setiap langkah menyalakan kombinasi pin sesuai tabel urutan langkah yang sudah
ditentukan, lalu dilanjutkan ke langkah berikutnya setelah delay kecil.
Keseluruhan logika sistem
sederhana: saat sensor sentuh aktif, motor DC berputar dan motor stepper
berhenti; sedangkan saat sensor tidak aktif, motor DC mati dan motor stepper
bergerak sesuai arah yang ditentukan oleh nilai potensiometer. Sistem ini mengandalkan
penggunaan GPIO dan ADC pada STM32F103C8, dengan pengembangan program berbasis
HAL Library untuk memudahkan akses ke perangkat keras mikrokontroler.
Prinsip Kerja:
Pada eksperimen ini, sistem
mengandalkan dua sumber input: input digital dari sensor sentuh dan input
analog dari potensiometer. Sensor sentuh berfungsi sebagai saklar digital yang
terhubung ke pin PB0 dari mikrokontroler STM32F103C8. Ketika disentuh, sensor
ini menghasilkan sinyal logika HIGH (3.3V), dan jika tidak disentuh akan
menghasilkan logika LOW (0V). Status sensor dibaca menggunakan fungsi
HAL_GPIO_ReadPin(). Apabila sentuhan terdeteksi (HIGH), motor DC diaktifkan
dengan mengirimkan logika HIGH ke pin PB7 yang mengendalikan driver motor
ULN2003A. Pada saat yang sama, motor stepper dinonaktifkan dengan menyetel
semua pin kontrolnya (IN1–IN4) ke kondisi LOW.
Sebaliknya, jika tidak ada
sentuhan yang terdeteksi (LOW), sinyal LOW dikirim ke PB7 sehingga motor DC
berhenti berputar. Setelah itu, sistem membaca nilai analog dari potensiometer
yang tersambung ke pin PA0. Tegangan yang dihasilkan potensiometer (0–3.3V)
dikonversi menjadi nilai digital 0–4095 menggunakan ADC internal STM32.
Pembacaan ADC diawali dengan perintah HAL_ADC_Start() dan hasil konversi
diambil menggunakan HAL_ADC_GetValue(). Nilai ini kemudian dibandingkan dengan
angka 2048: jika lebih besar atau sama dengan 2048, motor stepper berputar
searah jarum jam (clockwise) menggunakan urutan aktivasi STEP_SEQ_CW; jika
lebih kecil, motor stepper berputar berlawanan arah jarum jam
(counter-clockwise) menggunakan STEP_SEQ_CCW.
Motor stepper dikontrol melalui
empat pin output yaitu PB8, PB9, PB10, dan PB11. Aktivasi pin dilakukan secara
bergantian mengikuti pola tertentu melalui fungsi RunStepperSmooth(), dengan
jeda antar langkah sebesar 5 ms untuk menghasilkan pergerakan yang lebih mulus.
Setiap langkah menyalakan kombinasi pin sesuai tabel urutan langkah yang sudah
ditentukan, lalu dilanjutkan ke langkah berikutnya setelah delay kecil.
Keseluruhan logika sistem
sederhana: saat sensor sentuh aktif, motor DC berputar dan motor stepper
berhenti; sedangkan saat sensor tidak aktif, motor DC mati dan motor stepper
bergerak sesuai arah yang ditentukan oleh nilai potensiometer. Sistem ini mengandalkan
penggunaan GPIO dan ADC pada STM32F103C8, dengan pengembangan program berbasis
HAL Library untuk memudahkan akses ke perangkat keras 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.
Komentar
Posting Komentar