Laporan Akhir 1




Percobaan 8

1. Prosedur [kembali]
 Prosedur Percobaan dengan STM32F103C8 :
  1. Menentukan Komponen Percobaan : STM32 Board (STM32F103C8T6), Motor DC, Stepper Motor, Modul Sensor Touch, Potentiometer, Resistor, Transistor (untuk kontrol motor DC), ST-Link Programmer, Kabel Jumper dan Breadboard
  2. Konfigurasi Pin pada STM32CubeIDE
    Motor DC: Pilih pin GPIO untuk PWM motor.
    Stepper Motor: Pilih pin GPIO untuk IN1, IN2, IN3, IN4.
    Sensor Touch: Pilih pin GPIO untuk input.
    Potentiometer: Pilih pin ADC untuk pembacaan analog.
    Transistor: Pilih pin GPIO untuk mengontrol transistor Motor DC.
  3.  New Project program di STM32CubeIDE
    Buat proyek baru dan pilih STM32 model yang sesuai. Atur pin pin GPIO untuk semua komponen yang digunakan. Set pin motor dan stepper ke mode output, sensor touch dan potentiometer ke input atau analog.
  4. Program di STM32CubeIDE
    Tulis kode untuk kontrol motor DC menggunakan PWM, kontrol stepper, dan pembacaan sensor touch. Gunakan ADC untuk membaca nilai dari potentiometer.
  5. Hubungkan STM32 ke Laptop
    Sambungkan STM32 ke laptop menggunakan ST-Link. Pastikan ST-Link terdeteksi di STM32CubeIDE.
  6. Build dan Run Program
    Build proyek dan upload ke STM32 melalui ST-Link. Jalankan program dan verifikasi kontrol motor dan stepper sesuai dengan input sensor touch.
  7. Hasil Pengujian
    Pastikan lalu amati motor DC dan stepper apakah motor berfungsi sesuai dengan input yang diterima dari sensor touch dan potentiometer. dimana motor DC dan Stepper akan bergerak.
2. Hardware dan Diagram Blok [kembali]
     a. Hardware
1) Laptop yang sudah terinstal Software STM32
2) ST Link (Port sambungan kabel dari laptop ke STM32)
3) White Board atau Project Board
4) STM 32

5) Motor Stepper


6) Motor DC


7) Jumper
8) Sensor Touch
9) Potensiometer

10) Transistor



11) Stepper


b. Blok Diagram
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

Rangkaian Simulasi: 
  

Prinsip Kerja:

      Prinsip kerja dari percobaan 8 ini adalah mengendalikan motor stepper dan motor DC menggunakan STM32 berbasis input dari sensor sentuh (touch sensor) dan potentiometer. Pin pin yang terhubung, PB0 digunakan untuk sensor touch sebagai input digital. Ketika sensor tidak disentuh (logika low), STM32 akan membaca nilai analog dari potentiometer melalui ADC di channel 0 (biasanya terhubung pin PA0). Nilai ini digunakan untuk menentukan arah putaran stepper motor,searah jarum jam/berlawanan jarum jam. Stepper dikontrol melalui 4 pin output (PB8–PB11) yang diatur secara bergantian untuk menghasilkan gerakan motor.    

   Saat sensor disentuh (logika high) maka motor DC akan bergerak(berputar) yang dimana interupsi EXTI dipicu, dan callback `HAL_GPIO_EXTI_Callback()` menyalakan motor DC melalui pin PB7 serta mematikan stepper motor (semua coil dimatikan). Ini artinya hanya salah satu motor yang aktif dalam satu waktu: jika tidak disentuh → stepper berjalan sesuai potentiometer; jika disentuh → motor DC menyala, stepper berhenti.

    Transistor yang terhubung di motor DC berfungsi memperkuat arus PWM dari mikrokontroler agar motor bisa berjalan dengan aman. Sistem bekerja secara loop di fungsi `main()`, dengan monitoring terus-menerus terhadap kondisi sensor dan pembacaan nilai potentiometer untuk kontrol dinamis.

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


// Konfigurasi Touch Sensor sebagai input dengan EXTI (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);


// Aktifkan NVIC untuk EXTI0

HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI0_IRQn);


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


// Konfigurasi 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) {

// Touch sensor 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 {

// Touch sensor 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. Analisa [kembali]

    

6. Kondisi [kembali]

Buatlah rangkaian seperti percobaan 8-Motor DC (Dinamo DC), Motor Stepper, Touch Sensor, Potensiometer

7. Video Simulasi [kembali]

8. Download file [kembali]

Analisa [Tekaann]
Vid. Simulasi [Tekaann]
Datasheet Resistor [tekan disini]
Datasheet Motor servo [tekan disini]
Datasheet STM32F103C8 [tekan disini]

Komentar

Postingan populer dari blog ini

HOME

Modul 1

HOME