Tugas Pendahuluan 2
1. Prosedur [kembali]
Buat rangkaian di Proteus sesuai dengan skenario pada percobaan.
-
Kembangkan program mikrokontroler STM32F103C8 menggunakan STM32CubeIDE.
-
Kompilasi program menjadi file berekstensi
.hex
, lalu unggah ke mikrokontroler. -
Jalankan simulasi rangkaian yang telah dibuat di Proteus.
-
Proses selesai.
2. Hardware dan Diagram Blok [kembali]
Hardware :
1. Mikrokontroler STM32F103C8

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
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).
Urutan Langkah Stepper:
STEP_SEQ_CW
danSTEP_SEQ_CCW
mendefinisikan urutan langkah motor untuk berputar searah atau berlawanan arah jarum jam.
Fungsi
RunStepper
:Digunakan untuk menggerakkan motor stepper sesuai dengan urutan langkah yang diberikan (
STEP_SEQ_CW
atauSTEP_SEQ_CCW
).
Fungsi
MX_ADC_Init
danMX_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.
Fungsi
SystemClock_Config
:Mengonfigurasi clock sistem, yang memastikan bahwa MCU bekerja dengan frekuensi yang benar.
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 */
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]
Komentar
Posting Komentar