TP M2

[menuju akhir]

Tugas Pendahuluan

Modul 2 Percobaan 3 Kondisi 7


1. Prosedur [kembali] 

a. Baca terlebih dahulu kondisi yang akan diambil
b. Buka aplikasi yang digunakan, misalnya pada kondisi ini menggunakan software Proteus 8.17 dan STM32
c. Pertama, siapkan komponen yang akan digunakan dan buat rangkaian yang sesuai dengan kondisi pada Proteus 8.17
d. Lalu, untuk menjalankan rangkaiannya buka Aplikasi STM32, sesuaikan semua konfigurasi pin yang digunakan pada STM32 di Proteus
e. Setelah itu, buat codingan c/c++ pada STM32 yang disesuaikan dengan kondisi
f. Buka lagi proteus, dan masukkan file jenis 'HEX
g. Lalu simulasikan rangkaian
h. Selesai


2. Hardware dan Diagram Blok [kembali]

a. Hardware
1) STM32
    STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. 
2) Push Button
    Push button adalah saklar yang penggunaanya dengan cara ditekan untuk mengaliri aliran listrik (Pull-down). Push button memiliki 2 jenis, yaitu:
- Memotary: Push button yang apabila ditekan akan kembali ke posisi awal, push button ini yang kita gunakan dalam percobaan.
- Lalch: Push button yang apabila ditekan akan bertahan dalam posisi tersebut, dan harus ditekan kembali agar kembali ke posisi awal.
3) Resistor

    Resistor adalah komponen elektronik yang berfungsi untuk menghambat aliran arus listrik. Resistor merupakan komponen pasif yang digunakan dalam sirkuit elektronik. Fungsi Resistor Mengontrol besar arus listrik, Menurunkan tingkat tegangan, Membagi tegangan dan besaran arus yang masuk, Sebagai pengaman arus sehingga tidak terjadi lonjakan secara mendadak. Resistor di kondisi ini digunakan sebesar 220 ohm.
4) Sensor LDR
    Sensor LDR (Light Dependent Resistor) adalah resistor yang nilai hambatannya berubah sesuai dengan intensitas cahaya yang dipancarkan kepadanya. Dengan kata lain, LDR berfungsi sebagai detektor cahaya atau pengukur besaran cahaya
5) Buzzer
    Buzzer adalah komponen elektronik yang digunakan untuk menghasilkan suara atau bip. Ini adalah perangkat output yang mengubah sinyal listrik menjadi suara.
6) Motor DC
    Motor DC (Direct Current) adalah motor listrik yang menggunakan energi listrik arus searah (DC) untuk menghasilkan gerak mekanis, yaitu putaran. Motor DC bekerja dengan prinsip interaksi antara medan magnet yang dihasilkan oleh magnet permanen atau elektromagnet dan arus yang mengalir melalui kumparan jangkar (armature), yang menyebabkan torsi dan putaran. 
7) Diode
    Dioda adalah komponen elektronika aktif yang berfungsi menghantarkan arus listrik ke satu arah dan menghambat arus listrik dari arah sebaliknya atau berfungsi untuk mengubah arus bolak-balik (AC) menjadi arus searah (DC). . Dioda umumnya terbuat dari bahan semikonduktor seperti silikon atau germanium.
8) Transistor
    Transistor adalah komponen elektronik semikonduktor yang berfungsi sebagai penguat, sakelar, atau pengendali arus listrik. 

b. Blok Diagram





a. Rangkaian pada proteus
- Sebelum di run
- Setelah di run

b. Pin konfigurasi pada STM32

Prinsip Kerja:
Pada percobaan 3 kondisi 7 ini kita menggunakan dua software yaitu, proteus dan STM32. Pada proteus ini kita membutuhkan beberapa komponen seperti sensor LDR, stm32-nya lalu buzzer ,motor DC dan ada resistor sebesar 2,2 kiloohm dan 10 kiloohm, Transistor, diode, Power 3,3 volt, push button yaitu sebagai interupsinya, dan ground. Nah di sini itu untuk rangkaiannya itu kita hubungkan ke pin STM 32, dimana sensor LDR dan push button sebagai input, Buzzer dan motor DC sebagai ouput.
 Setelah kita hubungkan yang sesuai gambar pada rangkaian pada modul lanjut ke software STM32cubIDE. Untuk mengkonfigurasi pin dari rangkaian yang telah kita rangkai di proteus. Untuk konfigurasi PINnya  sensor LDR ini adalah sebagai input maka di PIN konfigurasi ini kita jadikan dia sebagai input, tapi sensor ini bekerja pada ADC maka kita jadikan dia input ADC. Lalu untuk buzzer dan motor DC adalah output maka kita jadikan dia GPIO output. Push button sebagai input kita masukkan ke GPIO input pada pb0. Pada kategori di STM32cubIDE tim 1 ini untuk channel satu itu kan kita menggunakan yang PWM channel ini maka dipilih PWM Generation ch1n lalu untuk yang tim 2 nih pada channel 3-nya kita pilih PWM Generation output. Lalu buat codingan yang untuk konfigurasi input output lalu untuk kondisi yang kita mau yaitu di mana tadi ketika 1600 treshold, 15% duty cycle maka motor gerak lambat dan buzzer berbunyi. Sedangkan untuk 3100 maka untuk motornya itu bergerak cepat dan buzzernya ini mati.
  Nah setelah kita memasukkan semua codingan lanjut ke kita debug setelah didebug nanti akan menghasilkan ada namanya file hex nah file hex nih untuk memasukkannya buka proteus, Tekan klik kanan pada STM32, lalu edit properties lalu masukkan pada program file-nya itu file hex. 
Lalu simulasikan rangkaiannya, ketika lux di atas 32 atau pada nilai 33 buzzernya ini akan hidup dan motornya itu bergerak lamban maka ini adalah kondisi saat thresholdnya itu 1600. Ketika lux di bawah 33, maka kondisinya itu threshold 3100, karena buzzernya ini mati dan motornya ini bergerak cepat. Push button Nah di sini berfungsi sebagai interrupt atau interupsi, ketika kita menekan pas button buzzernya ini akan mati.

Jadi, Rangkaian ini berfungsi untuk mengatur kecepatan motor DC dan mengontrol bunyi buzzer berdasarkan cahaya yang diterima sensor LDR, yang pada simulasi ini digantikan oleh potensiometer. Sensor LDR menghasilkan sinyal berupa tegangan analog yang dibaca oleh STM32 untuk menentukan pengaturan motor dan buzzer. Jika nilai ADC yang dibaca lebih rendah dari 1600, motor DC berputar lambat dengan duty cycle 15% dan buzzer berbunyi dengan frekuensi tinggi. Sebaliknya, jika nilai ADC melebihi 3100, motor DC berputar lebih cepat dengan duty cycle 85% dan buzzer akan berhenti berbunyi. Selain itu, push button digunakan untuk mematikan buzzer (interrupt) saat buzzer sedang aktif.

a. Flowchart

b. 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 variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim1;

TIM_HandleTypeDef htim2;


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

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_TIM1_Init(void);

static void MX_TIM2_Init(void);


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();

MX_TIM1_Init();

MX_TIM2_Init();


HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // Motor PWM

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); // Buzzer PWM

HAL_ADC_Start(&hadc1);


uint8_t buzzer_enabled = 1;

uint32_t last_buzzer_change = 0;

uint8_t buzzer_freq_index = 0;


const uint32_t buzzer_periods[] = {143999, 71999, 47999}; // Frekuensi berbeda


// Threshold (dari rendahsedangtinggi)

const uint16_t THRESH_LOW = 1600;

//const uint16_t THRESH_MID_LOW = 1601; //diantara

//const uint16_t THRESH_MID_HIGH = 3099; //diantara

const uint16_t THRESH_HIGH = 3100;

while (1)

{

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 10);

uint32_t adc_val = HAL_ADC_GetValue(&hadc1);


// --- Motor Control ---

if (adc_val < THRESH_LOW)

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 9830); // motor Lambat, buzzer hidup

}

else if (adc_val > THRESH_LOW && adc_val < THRESH_HIGH)

{

//motor mati

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0); // motor mati,buzzer mati

// Buzzer mati

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);

}

else if (adc_val < THRESH_HIGH)

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 55704); // motor Cepat, buzzer mati

}


// --- Buzzer Logic ---

if (adc_val < THRESH_LOW && buzzer_enabled)

{

// Ubah frekuensi buzzer setiap 500ms

if (HAL_GetTick() - last_buzzer_change >= 500)

{

last_buzzer_change = HAL_GetTick();

buzzer_freq_index = (buzzer_freq_index + 1) % 3;


uint32_t period = buzzer_periods[buzzer_freq_index];

__HAL_TIM_SET_AUTORELOAD(&htim2, period);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, period / 2); // 50% duty

}

}

else

{

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Matikan buzzer

}


// --- Button Logic (PB0 ditekan = nonaktifkan buzzer) ---

if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET)

{

buzzer_enabled = 0;

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Paksa matikan buzzer

}


HAL_Delay(10);

}

}




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 TIM1 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM1_Init(void)

{


/* USER CODE BEGIN TIM1_Init 0 */


/* USER CODE END TIM1_Init 0 */


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};

TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};


/* USER CODE BEGIN TIM1_Init 1 */


/* USER CODE END TIM1_Init 1 */

htim1.Instance = TIM1;

htim1.Init.Prescaler = 0;

htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

htim1.Init.Period = 65535;

htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim1.Init.RepetitionCounter = 0;

htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

{

Error_Handler();

}

sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;

sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;

sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;

sBreakDeadTimeConfig.DeadTime = 0;

sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;

sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;

if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN TIM1_Init 2 */


/* USER CODE END TIM1_Init 2 */

HAL_TIM_MspPostInit(&htim1);


}


/**

* @brief TIM2 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM2_Init(void)

{


/* USER CODE BEGIN TIM2_Init 0 */


/* USER CODE END TIM2_Init 0 */


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};


/* USER CODE BEGIN TIM2_Init 1 */


/* USER CODE END TIM2_Init 1 */

htim2.Instance = TIM2;

htim2.Init.Prescaler = 0;

htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

htim2.Init.Period = 65535;

htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN TIM2_Init 2 */


/* USER CODE END TIM2_Init 2 */

HAL_TIM_MspPostInit(&htim2);


}


/**

* @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 : PB0 */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLUP;

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]
Pada tugas pendahuluan modul 1 saya mengambil percobaan 3 kondisi 7, yaitu:
    Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1600 maka motor DC berputar dengan duty cycle 15% dan buzzer berbunyi dengan frekuensi tinggi; jika nilai di atas threshold 3100 maka motor DC berputar dengan duty cycle 85% dan buzzer mati.

Rangkaian  [tekan disini]
Video Rangkaian [tekan disini]
Datasheet Resistor [tekan disini]
Datasheet STM32F103C8 [tekan disini]


[menuju awal]

Komentar

Postingan populer dari blog ini