[KEMBALI KE MENU SEBELUMNYA]



Tugas Pendahuluan 1 Modul 2
(Percobaan 8 Kondisi 1)
1. Prosedur [Kembali]
  •   Langkah-langkah percobaan :

    a. Pahami dulu kondisi atau fungsi yang akan dibuat
    b. Buka STM32CubeIDE dan Proteus
    c. Siapkan komponen: STM32F103C8T6, sensor touch, potensiometer, motor DC, motor stepper, dan driver stepper
    d. Rakit rangkaian sesuai kebutuhan
    e. Buat program C di STM32CubeIDE
    f. Jalankan simulasi di Proteus
    g. Selesai


2. Hardware dan Diagram Blok [Kembali]

Hardware :


 1. Mikrokontroler STM32F103C8


STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 dengan prosesor 32-bit, frekuensi clock hingga 72 MHz, dan dilengkapi dengan 64K Flash serta 20K SRAM, menjadikannya ideal untuk berbagai aplikasi embedded.
Mikrokontroler ini populer dalam proyek hobi dan industri karena kombinasi antara performanya yang tinggi dan harga yang terjangkau, sering kali dijuluki "Blue Pill" karena ukuran dan desainnya yang compact.


            2.  Touch Sensor






            3. Motor DC



            4. Potensiometer
       






 

            5. Motor Stepper



Diagram Blok :


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]






Prinsip Kerja : 
  Rangkaian ini menggunakan mikrokontroler STM32F103C8T6 sebagai unit pengendali utama. Sensor sentuh berfungsi sebagai input digital untuk mendeteksi interaksi pengguna. Ketika sensor aktif (tersentuh), mikrokontroler akan membaca nilai analog dari potensiometer yang berfungsi sebagai pengatur kecepatan atau referensi kontrol. Berdasarkan nilai tersebut, STM32 mengirimkan sinyal kontrol ke motor DC atau motor stepper melalui modul driver motor stepper untuk mengatur arah dan kecepatan putaran motor. Semua proses ini dikendalikan oleh program yang dikembangkan menggunakan STM32CubeIDE, sementara validasi fungsi dan kinerja rangkaian dilakukan melalui simulasi pada software Proteus.

4. Flowchart dan Listing Program [Kembali]

Flowchart :






Listing Program :

#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 Stepper

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;

uint8_t current_mode = 0; // 0=CW, 1=CCW

volatile uint8_t touch_state = 0;


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();


while (1) {

// Saat tidak disentuh, jalankan stepper seperti biasa

if (HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN) == GPIO_PIN_RESET) {

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {

uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

current_mode = (adc_val > 2048) ? 0 : 1; // 0 = CW, 1 = CCW

}


if (current_mode == 0) {

RunStepper(STEP_SEQ_CW, 5);

} else {

RunStepper(STEP_SEQ_CCW, 5);

}

}


HAL_Delay(1);

}

}


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);

}


void MX_GPIO_Init(void) {

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_AFIO_REMAP_SWJ_NOJTAG(); // Optional: disable JTAG to free PB3-PB4 if needed


// Touch Sensor input dengan interrupt

GPIO_InitStruct.Pin = TOUCH_SENSOR_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(TOUCH_SENSOR_PORT, &GPIO_InitStruct);


HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI0_IRQn);


// Motor DC (PB7)

GPIO_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 (PB8-PB11)

GPIO_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.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();

}

}


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 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {

if (GPIO_Pin == TOUCH_SENSOR_PIN) {

GPIO_PinState pinState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);


if (pinState == GPIO_PIN_SET) {

// Saat ditekan: nyalakan 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 {

// Saat dilepas: matikan motor DC

HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET);

}

}

}


// IRQ Handler untuk EXTI0

void EXTI0_IRQHandler(void) {

HAL_GPIO_EXTI_IRQHandler(TOUCH_SENSOR_PIN);

}


void Error_Handler(void) {

while (1) {}

}


5. Kondisi [Kembali]
Percobaan 8 Kondisi 1
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.
    

6. Video Simulasi [Kembali]









7. Download File [Kembali]

Download HTML [Download]
Download File Rangkaian [Download]
Download Video Simulasi [Download]