Tugas Pendahuluan 2

[menuju akhir]

1. Prosedur [kembali]

  1. Buat rangkaian di Proteus sesuai dengan skenario pada percobaan.

  2. Kembangkan program mikrokontroler STM32F103C8 menggunakan STM32CubeIDE.

  3. Kompilasi program menjadi file berekstensi .hex, lalu unggah ke mikrokontroler.

  4. Jalankan simulasi rangkaian yang telah dibuat di Proteus.

  5. Proses selesai.

2. Hardware dan Diagram Blok [kembali]

Hardware :

1. Mikrokontroler STM32F103C8

STM32F103C8 board – Microscale

2. Touch Sensor

3. Power Supply



4. Motor DC (Dinamo DC)

5. Motor Stepper


6. ULN2003A


7. Potensiometer

Diagram Blok:

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

Rangkaian


Prinsip Kerja

  1. Deklarasi Variabel:

    • ADC_HandleTypeDef hadc1; untuk menginisialisasi ADC.

    • current_mode untuk menentukan apakah motor berputar searah jarum jam (CW) atau berlawanan arah jarum jam (CCW).

  2. Urutan Langkah Stepper:

    • STEP_SEQ_CW dan STEP_SEQ_CCW mendefinisikan urutan langkah motor untuk berputar searah atau berlawanan arah jarum jam.

  3. Fungsi RunStepper:

    • Digunakan untuk menggerakkan motor stepper sesuai dengan urutan langkah yang diberikan (STEP_SEQ_CW atau STEP_SEQ_CCW).

  4. Fungsi MX_ADC_Init dan MX_GPIO_Init:

    • MX_ADC_Init mengonfigurasi ADC untuk membaca nilai dari saluran yang diinginkan.

    • MX_GPIO_Init mengonfigurasi GPIO untuk output motor dan input sensor.

  5. Fungsi SystemClock_Config:

    • Mengonfigurasi clock sistem, yang memastikan bahwa MCU bekerja dengan frekuensi yang benar.

  6. Loop Utama:

    • Dalam loop utama, ADC dibaca dan motor stepper dijalankan berdasarkan nilai ADC (mode CW atau CCW).

        Prinsip kerja dari kode ini terhadap rangkaian adalah sebagai berikut: mikrokontroler membaca nilai tegangan analog dari sebuah sensor melalui modul ADC (Analog to Digital Converter) yang telah dikonfigurasi menggunakan fungsi MX_ADC_Init. Nilai ADC ini digunakan untuk menentukan arah putaran motor stepper, apakah searah jarum jam (CW) atau berlawanan arah jarum jam (CCW), dengan mengatur variabel current_mode. Berdasarkan nilai ini, fungsi RunStepper akan dipanggil untuk mengaktifkan urutan sinyal yang sesuai dari array STEP_SEQ_CW atau STEP_SEQ_CCW, dan sinyal tersebut dikirimkan ke pin-pin GPIO yang telah dikonfigurasi melalui fungsi MX_GPIO_Init

        Secara fisik, sensor analog (seperti potensiometer atau sensor tekanan) dihubungkan ke salah satu pin ADC mikrokontroler (misalnya PA0). Kemudian, beberapa pin GPIO output (misalnya PA1–PA4) dihubungkan ke input driver motor stepper (seperti ULN2003 atau A4988). Driver ini bertugas menerima sinyal dari mikrokontroler dan mengatur arus ke fasa-fasa motor stepper. Output dari driver dihubungkan ke empat kabel fasa motor stepper, sehingga motor dapat berputar sesuai arah yang ditentukan. Catu daya eksternal (misalnya 12V) digunakan untuk memberi daya pada motor stepper melalui driver, sementara mikrokontroler mendapat catu daya terpisah melalui USB atau regulator (misalnya 5V/3.3V). Fungsi SystemClock_Config memastikan sistem bekerja dengan frekuensi yang stabil. Dengan demikian, rangkaian ini bekerja secara otomatis dan dinamis, di mana perubahan nilai analog dari sensor langsung memengaruhi arah putaran motor stepper melalui kontrol logika yang dilakukan oleh mikrokontroler.

4. Flowchart dan Listing Program [kembali]

Flowchart

 Listing Program

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file           : main.c

  * @brief          : Main program body

  ******************************************************************************

  * @attention

  *

  * Copyright (c) 2025 STMicroelectronics.

  * All rights reserved.

  *

  * This software is licensed under terms that can be found in the LICENSE file

  * in the root directory of this software component.

  * If no LICENSE file comes with this software, it is provided AS-IS.

  *

  ******************************************************************************

  */

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

 

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

// 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

/* USER CODE END Includes */

 

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

 

/* USER CODE END PTD */

 

/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

 

/* USER CODE END PD */

 

/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

 

/* USER CODE END PM */

 

/* Private variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;

 

/* USER CODE BEGIN PV */

 

/* USER CODE END PV */

 

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

/* USER CODE BEGIN PFP */

 

/* USER CODE END PFP */

 

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

// 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

};

 

/* USER CODE END 0 */

 

/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

 

  /* USER CODE BEGIN 1 */

 

  /* USER CODE END 1 */

 

  /* MCU Configuration--------------------------------------------------------*/

 

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();

 

  /* USER CODE BEGIN Init */

 

  /* USER CODE END Init */

 

  /* Configure the system clock */

  SystemClock_Config();

 

  /* USER CODE BEGIN SysInit */

 

  /* USER CODE END SysInit */

 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_ADC1_Init();

  /* USER CODE BEGIN 2 */

 

  /* USER CODE END 2 */

 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

 

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

 

/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

 

  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

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

  }

 

  /** Initializes the CPU, AHB and APB buses clocks

  */

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

  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

  {

    Error_Handler();

  }

}

 

/**

  * @brief ADC1 Initialization Function

  * @param None

  * @retval None

  */

static void MX_ADC1_Init(void)

{

 

  /* USER CODE BEGIN ADC1_Init 0 */

 

  /* USER CODE END ADC1_Init 0 */

 

  ADC_ChannelConfTypeDef sConfig = {0};

 

  /* USER CODE BEGIN ADC1_Init 1 */

 

  /* USER CODE END ADC1_Init 1 */

 

  /** Common config

  */

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

  }

 

  /** Configure Regular Channel

  */

  sConfig.Channel = ADC_CHANNEL_0;

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN ADC1_Init 2 */

 

  /* USER CODE END ADC1_Init 2 */

 

}

 

/**

  * @brief GPIO Initialization Function

  * @param None

  * @retval None

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* USER CODE BEGIN MX_GPIO_Init_1 */

 

  /* USER CODE END MX_GPIO_Init_1 */

 

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOB, O3_Pin|O4_Pin|MOTOR_Pin|O1_Pin

                          |O2_Pin, GPIO_PIN_RESET);

 

  /*Configure GPIO pin : TOUCH_Pin */

  GPIO_InitStruct.Pin = TOUCH_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(TOUCH_GPIO_Port, &GPIO_InitStruct);

 

  /*Configure GPIO pins : O3_Pin O4_Pin MOTOR_Pin O1_Pin

                           O2_Pin */

  GPIO_InitStruct.Pin = O3_Pin|O4_Pin|MOTOR_Pin|O1_Pin

                          |O2_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 

  /* USER CODE BEGIN MX_GPIO_Init_2 */

 

  /* USER CODE END MX_GPIO_Init_2 */

}

 

/* USER CODE BEGIN 4 */

 

/* USER CODE END 4 */

 

/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}

 

#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

 5. Kondisi [kembali]

    Percobaan 8 Kondisi 2

Buatlah rangkaian seperti gambar pada percobaan 8. Jika touch sensor mendeteksi maka motor dc berputar. Jika potensiometer bernilai besar maka motor stepper bergerak berlawanan jarum jam dan jika bernilai rendah maka motor stepper bergerak searah jarum jam

6. Video Simulasi [kembali]

7. Download File [kembali]

Rangkaian Proteus [klik disini]
Video Simulasi [klik disini]
Datasheet Sensor Touch [klik disini]
Datasheet STM32 [klik disini]
Datasheet Motor Stepper [klik disini]
Datasheet Motor DC [klik disini]

Komentar

Postingan populer dari blog ini

Modul 1 General Input dan Output

Modul 1 Gerbang Logika Dasar & Monostable Multivibrator