Tugas Pendahuluan 1
1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul
2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output
3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex
4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus
5. Simulasikan rangkaian
- STM32F103C8
- Touch Sensor
- LED
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Prinsip Kerja :
- Sensor BPM mendeteksi denyut jantung lalu mengirim sinyal ke pin ADC mikrokontroler, misalnya PA0.
- ADC pada mikrokontroler mengubah sinyal analog dari sensor menjadi data digital BPM.
- Program membaca nilai BPM secara terus-menerus dan membandingkannya dengan batas 70 BPM.
- Push button dihubungkan ke pin input digital, misalnya PB1, untuk membaca kondisi tombol ditekan atau tidak.
- Jika push button tidak ditekan, maka pin PB1 berada pada kondisi logika default sesuai rangkaian.
- Saat BPM yang terbaca lebih besar dari 70, kondisi pertama terpenuhi.
- Jika BPM > 70 dan push button tidak ditekan, maka mikrokontroler mengaktifkan output LED merah dan buzzer.
- Pin output LED, misalnya PA5, berubah menjadi HIGH sehingga LED merah menyala.
- Pin output buzzer, misalnya PA6, juga berubah menjadi HIGH sehingga buzzer berbunyi.
- LED merah dan buzzer berfungsi sebagai indikator dan alarm bahwa denyut jantung melebihi batas yang ditentukan.
- Jika BPM turun ≤ 70 atau push button ditekan, maka output dimatikan sehingga LED merah padam dan buzzer berhenti berbunyi.
Listing Program
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
/* USER CODE BEGIN PV */
uint32_t adcValue = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* Reset of all peripherals */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
/* Infinite loop */
while (1)
{
// Mulai ADC
HAL_ADC_Start(&hadc1);
// Tunggu konversi selesai
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
// Ambil nilai ADC
adcValue = HAL_ADC_GetValue(&hadc1);
// Stop ADC
HAL_ADC_Stop(&hadc1);
// Jika sensor > threshold
// dan pushbutton ditekan
if ((adcValue > 2000) &&
(HAL_GPIO_ReadPin(pushbutton_GPIO_Port, pushbutton_Pin) == GPIO_PIN_SET))
{
// LED ON
HAL_GPIO_WritePin(GPIOB, led_1_Pin, GPIO_PIN_SET);
// BUZZER ON
HAL_GPIO_WritePin(GPIOB, buzzer_Pin, GPIO_PIN_SET);
}
else
{
// LED OFF
HAL_GPIO_WritePin(GPIOB, led_1_Pin, GPIO_PIN_RESET);
// BUZZER OFF
HAL_GPIO_WritePin(GPIOB, buzzer_Pin, GPIO_PIN_RESET);
}
HAL_Delay(100);
}
}
/**
* @brief System Clock Configuration
* @retval None
*/
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
* @param None
* @retval None
*/
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;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Output default LOW */
HAL_GPIO_WritePin(GPIOB,
led_3_Pin | led_2_Pin | led_1_Pin | buzzer_Pin,
GPIO_PIN_RESET);
/* Push Button */
GPIO_InitStruct.Pin = pushbutton_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(pushbutton_GPIO_Port, &GPIO_InitStruct);
/* LED dan Buzzer */
GPIO_InitStruct.Pin = led_3_Pin |
led_2_Pin |
led_1_Pin |
buzzer_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);
}
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
M2 P1 K1: Buatlah rangkaian seperti pada gambar percobaan 1 dengan kondisi Sensor Heartbeat membaca BPM>70 dan push button tidak ditekan, maka LED menyala merah dan Buzzer berbunyi
Komentar
Posting Komentar