Tugas Pendahuluan 2
Tugas Pendahuluan 2 Modul 2
(Percobaan 8 Kondisi 1)
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

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