TP 2 M2




PERCOBAAN 8 KONDISI 3

1. Prosedur[Kembali]

  1. Rangkai semua komponen di Proteus sesuai dengan percobaan pada modul 
  2. Buat program untuk STM32 di STM32CubeIDE, sesuaikan konfigurasinya dengan rangkaian pada proteus dan kondisi yang dipakai
  3. Masukkan Program ke STM32 di rangkaian proteus
  4. Simulasikan rangkaian

2. Hardware dan Diagram Blok[Kembali]

1. STM32F103C8








2. Touch Sensor




3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

Rangkaian: 




Prinsip Kerja:

Prinsip kerja rangkaian ini adalah sebagai berikut:

  1. Sensor Sentuh:

    • Jika sensor sentuh aktif, motor DC dinyalakan, dan motor stepper dimatikan.

    • Jika sensor sentuh tidak aktif, motor DC dimatikan.

  2. Pembacaan ADC:

    • Nilai dari ADC digunakan untuk mengatur pergerakan motor stepper.

    • Jika nilai ADC > 2048, motor stepper bergerak searah jarum jam.

    • Jika nilai ADC ≤ 2048, motor stepper bergerak secara osilasi (CW-CCW).

  3. Motor Stepper:

    • Motor stepper dikendalikan dengan urutan langkah (CW atau CCW), yang mengatur gerakan motor berdasarkan pembacaan ADC.

  4. Motor DC:

    • Motor DC dikendalikan oleh status sensor sentuh, dinyalakan saat sensor sentuh aktif.

Sistem ini mengintegrasikan sensor sentuh dan pembacaan ADC untuk mengontrol motor DC dan stepper dengan pola pergerakan yang berbeda berdasarkan input yang diterima. setiap siklus pemrosesan.

4. Flowchart dan Listing Program[Kembali] 


Flowchart:



Listing Program:
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_adc.h"

// Konfigurasi pin motor stepper dan motor DC
#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

// Langkah stepper searah jarum jam (CW)
const uint8_t STEP_SEQ_CW[4] = {
  (1 << 0), // IN1
  (1 << 1), // IN2
  (1 << 2), // IN3
  (1 << 3)  // IN4
};

// Langkah stepper berlawanan arah jarum jam (CCW)
const uint8_t STEP_SEQ_CCW[4] = {
  (1 << 3), // IN4
  (1 << 2), // IN3
  (1 << 1), // IN2
  (1 << 0)  // IN1
};

ADC_HandleTypeDef hadc1;
uint8_t oscillate_dir = 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) {
    GPIO_PinState touch = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);

    if (touch == GPIO_PIN_SET) {
      HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); // DC ON
      HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET); // Stepper OFF
    } else {
      HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); // DC OFF

      HAL_ADC_Start(&hadc1);
      if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
        uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

        if (adc_val > 2048) {
          // Hanya bergerak searah jarum jam
          RunStepper(STEP_SEQ_CW, 5);
        } else {
          // Bergerak osilasi (CW lalu CCW bergantian)
          if (oscillate_dir == 0) {
            RunStepper(STEP_SEQ_CW, 5);
            oscillate_dir = 1;
          } else {
            RunStepper(STEP_SEQ_CCW, 5);
            oscillate_dir = 0;
          }
        }
      }
    }

    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(); // Nonaktifkan JTAG, aktifkan GPIO PB3-PB4

  // Sensor sentuh sebagai input
  GPIO_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 sebagai output
  GPIO_InitStruct.Pin = MOTOR_DC_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(MOTOR_DC_PORT, &GPIO_InitStruct);

  // Stepper motor sebagai output
  GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);
}

void MX_ADC1_Init(void) {
  ADC_ChannelConfTypeDef sConfig = {0};
  __HAL_RCC_ADC1_CLK_ENABLE();

  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  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;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

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

5. 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


6. Video Simulasi[Kembali]







7. Download File[Kembali]

Rangkaian [download]
Video simulasi [download]
Datasheet Resistor [Download]
Datasheet STM32F1038 [download]



Posting Komentar

Lebih baru Lebih lama