Tugas Pendahuluan 2



Tugas Pendahuluan 2 Modul 2

(Percobaan 8 Kondisi 1)

1. Prosedur[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.

2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.

3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.

4. Jalankan simulasi rangkaian pada proteus.

5. Selesai.

.

2. Hardware dan Diagram Blok[Kembali]

Hardware:

1. Mikrokontroler STM32F103C8

STM32F103C8 board – Microscale

2. Touch Sensor

Touch Sensor Module — SunFounder Ultimate Sensor Kit documentation



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 Simulasi sebelum dirunning:

Rangkaian Simulasi setelah dirunning:


Prinsip Kerja:

Pada rangkaian ini, microcontroller STM32F103C8 berfungsi sebagai pusat pengendali utama yang menerima input dari touch sensor dan potensiometer, serta mengontrol keluaran untuk motor DC dan motor stepper melalui driver ULN2003A. 

Saat touch sensor mendeteksi adanya sentuhan, microcontroller akan mengaktifkan motor DC sehingga motor DC berputar, sedangkan motor stepper tidak bergerak. Pada kondisi ini, semua output yang mengontrol motor stepper akan diset ke keadaan LOW sehingga motor stepper diam. Sebaliknya, jika tidak ada sentuhan terdeteksi oleh touch sensor, maka motor DC akan dimatikan dan sistem akan beralih untuk mengaktifkan motor stepper berdasarkan nilai dari potensiometer. Microcontroller membaca nilai analog dari potensiometer melalui pin ADC (PA0) dan menentukan arah gerak motor stepper. Jika nilai potensiometer tinggi (≥ 2048), maka motor stepper akan berputar searah jarum jam. Sebaliknya, jika nilai potensiometer rendah (< 2048), maka motor stepper akan berputar berlawanan arah jarum jam. 

Pergerakan motor stepper diatur menggunakan pola aktivasi langkah (step sequence) yang telah ditentukan sebelumnya untuk arah searah dan berlawanan jarum jam. Keseluruhan sistem ini bekerja secara real-time di mana pembacaan sensor dan pengontrolan motor dilakukan secara terus-menerus dalam loop utama program. Dengan demikian, sistem memastikan bahwa motor DC dan motor stepper tidak akan aktif secara bersamaan, serta perubahan kondisi pada sensor atau potensiometer langsung tercermin pada gerakan motor dengan respons cepat dan stabil.


4. Flowchart dan Listing Program[Kembali]

Flowchart:


Listing Program:

/* USER CODE BEGIN Header */

/**

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

  * @file           : main.c

  * @brief          : Main program body

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

  */

/* USER CODE END Header */

 

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

#include "main.h"

 

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

/* USER CODE BEGIN Includes */

 

/* USER CODE END Includes */

 

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

/* USER CODE BEGIN PTD */

 

/* USER CODE END PTD */

 

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

/* USER CODE BEGIN PD */

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

 

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

/* USER CODE BEGIN PM */

 

/* USER CODE END PM */

 

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

ADC_HandleTypeDef hadc1;

/* USER CODE BEGIN PV */

 

// 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<<0), // IN1

    (1<<3), // IN4

    (1<<2), // IN3

    (1<<1)  // IN2

};

 

uint8_t step_index = 0;

uint32_t last_step_time = 0;

 

/* USER CODE END PV */

 

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

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

void RunStepperSmooth(const uint8_t *sequence, uint8_t speed);

void Error_Handler(void);

/* USER CODE BEGIN PFP */

 

/* USER CODE END PFP */

 

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

/* USER CODE BEGIN 0 */

 

/* USER CODE END 0 */

 

/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

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

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_ADC1_Init();

 

  /* Infinite loop */

  while (1)

  {

    GPIO_PinState touchState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);

 

    if (touchState == GPIO_PIN_SET)

    {

      // Sensor disentuh

      HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); // Motor DC ON

      HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET); // Stepper OFF

    }

    else

    {

      // Sensor tidak disentuh

      HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); // Motor DC OFF

 

      // Baca ADC

      HAL_ADC_Start(&hadc1);

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

      {

        uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

 

        if (adc_val >= 2048)

        {

          RunStepperSmooth(STEP_SEQ_CW, 5); // Searah jarum jam

        }

        else

        {

          RunStepperSmooth(STEP_SEQ_CCW, 5); // Berlawanan jarum jam

        }

      }

      HAL_ADC_Stop(&hadc1);

    }

 

    HAL_Delay(1); // Delay kecil supaya stabil

  }

}

 

/**

  * @brief Stepper motor control

  */

void RunStepperSmooth(const uint8_t *sequence, uint8_t speed)

{

  if (HAL_GetTick() - last_step_time >= speed)

  {

    HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step_index] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET);

    HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step_index] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET);

    HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step_index] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET);

    HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step_index] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET);

 

    step_index = (step_index + 1) % 4;

    last_step_time = HAL_GetTick();

  }

}

 

/**

  * @brief System Clock Configuration

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_PeriphCLKInitTypeDef PeriphClkInit = {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();

  }

 

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

  {

    Error_Handler();

  }

}

 

/**

  * @brief ADC1 Initialization Function

  */

static void MX_ADC1_Init(void)

{

  ADC_ChannelConfTypeDef sConfig = {0};

 

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

  }

 

  sConfig.Channel = ADC_CHANNEL_0; // PA0

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;

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

  {

    Error_Handler();

  }

}

 

/**

  * @brief GPIO Initialization Function

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

 

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

 

  /* Touch Sensor 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);

 

  /* DC Motor Output */

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

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

}

 

/**

  * @brief Error Handler

  */

void Error_Handler(void)

{

  __disable_irq();

  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]




















Komentar

Postingan populer dari blog ini