TP M2 - P3K6






1. Prosedur [kembali]
  • Rangkai semua komponen 
  • Buat program di website wokwi
  • Jalankan program dan cobakan sesuai kondisi
2. Hardware dan Diagram Blok [kembali]

Hardware :

1. STM32







2. LDR











3. PUSH BUTTON












4. MOTOR DC











5. BUZZER













3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Pada rangkaian ini menggunakan STM32 sebagai mikrokontroller dengan inputnya adalah sensor LDR untuk mengatur kecepatan motor DC dan bunyi buzzer. Selain itu, juga digunakan push button sebagai interrupt pada buzzer. Karena LDR dan push button merupakan input analog, maka kedua input itu dihubungkan ke pin GPIO yang bisa berfungsi sebagai ADC, yaitu bisa pada pin PA0 - PA7, PB0, dan PB1, yang kemudian dinisialisasi sebagai input. Buzzer dan motor DC dihubungkan ke pin GPIO, lalu diinisialisasi sebagai output. Jika nilai yang dihasilkan LDR < 1700, maka motor berputar dengan duty cycle 25% dan buzzer berbunyi. jika nilai yang dihasilkan LDR > 2900, maka motor berputar dengan duty cycle 90% dan buzzer mati. Jika pada kondisi yang memenuhi untuk buzzer berbunyi, lalu button ditekan, maka buzzer akan mati.


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

Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1700 maka motor DC berputar dengan duty cycle 25% dan buzzer berbunyi dengan frekuensi rendah; jika nilai di atas threshold 2900 maka motor DC berputar dengan duty cycle 90% dan buzzer mati. 



6. Video Simulasi[Kembali]









7. Download File[Kembali]

Rangkaian [disini]
Datasheet STM32F103C8 [disini]


Tidak ada komentar:

Posting Komentar

    BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2022 Nama: Adnan Fauzan    NIM: 2210953001 Elektronika B Dosen Pengampu ; Darwison,M.T R...