LA1 MODUL2



1. Prosedur[Kembali]

  1. Siapkan alat alat yang diperlukan pada STM32
  2. Hubungkan setiap komponen
  3. Inputkan Listing Program
  4. Running

2. Hardware dan Diagram Blok [Kembali]

Hardware yang digunakan dalam rangkaian ini meliputi:

  • STM32F103C8 – Sebagai mikrokontroler utama untuk mengendalikan sistem.





  • Motor Stepper






  • Driver Motor Stepper





  • Motor Dc

     


  • Potensiometer




  • Touch Sensor






Diagram Blok







3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]




Prinsip Kerja :

1. Touch Sensor

  • Pin yang digunakan: Output sensor → salah satu pin GPIO STM32 (misalnya PA0 atau PA1).

  • Fungsi: Sebagai input digital yang mengirim sinyal HIGH saat disentuh.

  • Kenapa pin itu?

    • Pin PA0–PA15 adalah pin GPIO standar dan mendukung input digital.

    • Mudah diakses dari sisi kiri chip pada board Blue Pill.

    • Bisa menggunakan interrupt jika ingin deteksi sentuhan secara efisien.


2. STM32F103C8 (Blue Pill)

  • Peran: Sebagai pusat kendali logika.

  • Pin output ke ULN2003A: PB0, PB1, PB2, PB3, dll (PBx atau PAx).

  • Kenapa pin PB0–PB3?

    • Pin ini merupakan GPIO output yang sering digunakan untuk kendali digital seperti aktivasi input ULN2003.

    • Mendukung output digital yang stabil dan bisa dikontrol melalui kode.

    • Banyak dari pin PBx juga mendukung PWM (jika digunakan untuk kendali kecepatan motor).


3. ULN2003A (Driver Motor)

  • Input: Pin 1B–7B → menerima sinyal dari STM32.

  • Output: Pin 1C–7C → mengendalikan motor.

  • COM pin: Terhubung ke +3.3V → digunakan untuk flyback diode internal (penting saat menggerakkan motor).

  • Kenapa digunakan ULN2003A?

    • Karena STM32 tidak mampu menyuplai arus besar langsung ke motor.

    • ULN2003A dapat menguatkan arus dan melindungi mikrokontroler dari beban berlebih.

    • Cocok digunakan untuk motor stepper dan BLDC kecil.


4. Motor BLDC (M1)

  • Terhubung ke output ULN2003A.

  • Diberi suplai +3.3V dan GND.

  • Kenapa tidak langsung dari STM32?

    • Karena motor memerlukan arus lebih besar daripada yang bisa disediakan oleh pin STM32.

    • ULN2003A bertindak sebagai saklar yang kuat untuk mengalirkan arus ke motor.


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) {} }



6. Kondisi[Kembali]

Percobaan 8 kondisi 3

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 dengan Oscillate Mode

7. Video Simulasi[Kembali]



8. Download File[Kembali]

File Rangkaian 

Datasheet Raspberry Pi Pico


Komentar

Postingan populer dari blog ini

Modul 1 Sistem Digital

Home

Modul 3 Sistem Digital