Laporan Akhir 1 Modul 2
a. Prosedur [Kembali]
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. Build program yang telah dibuat ke STM32F103C8 melalui connector
5. Simulasikan rangkaian
b. Hardware dan Diagram Blok [Kembali]
- Hardware
c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Sistem ini bekerja dengan membaca suhu secara terus-menerus melalui sensor LM35 yang terhubung ke pin PA0. Sinyal analog dari sensor dikonversi oleh ADC menjadi nilai digital, kemudian dikalkulasi ke dalam satuan derajat Celcius. Apabila suhu yang terdeteksi masih berada di bawah atau sama dengan 30°C, kipas tidak diaktifkan karena kondisi dianggap masih dalam batas normal.
Ketika suhu melampaui 30°C, mikrokontroler mulai mengaktifkan kipas melalui sinyal PWM pada pin PA8 yang diteruskan ke motor driver L298N. Kecepatan kipas meningkat secara linear seiring naiknya suhu , dimulai dari duty cycle minimum pada awal threshold hingga mencapai duty cycle penuh ketika suhu menyentuh 40°C atau lebih. Dengan demikian, semakin tinggi suhu ruangan, semakin besar daya yang diberikan ke kipas untuk mengimbanginya.
Selain kontrol otomatis berbasis suhu tersebut, sistem juga dilengkapi tombol manual pada pin PA4 yang bekerja melalui mekanisme interrupt. Saat tombol ditekan, mikrokontroler langsung menghentikan atau mengaktifkan kembali seluruh sistem tanpa menunggu siklus pembacaan suhu berikutnya, sehingga respons terhadap input pengguna bersifat instan dan tidak bergantung pada kondisi suhu saat itu.
d. Flowchart dan Listing Program [Kembali]
- Flowchart
- Listing Program
#include "main.h"
/* ===================== HANDLE ===================== */
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
/* ===================== PROTOTYPE ===================== */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
/* ===================== VARIABLE ===================== */
uint32_t adcValue = 0;
float voltage = 0;
float temperature = 0;
uint8_t system_on = 1;
/* ===================== MAIN ===================== */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
while (1)
{
/* ===== BACA ADC ===== */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adcValue = HAL_ADC_GetValue(&hadc1);
/* ===== KONVERSI ===== */
voltage = (adcValue / 4095.0) * 3.3;
temperature = voltage * 100;
if (system_on)
{
if (temperature >= 27.0)
{
/* LED indikator */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
/* ===== PWM CONTROL ===== */
float duty;
if (temperature >= 35.0)
{
duty = 0.5; // max speed
}
else
{
duty = 1.0 - ((temperature - 27.0) / 8.0) * 0.5;
}
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 65535);
}
else
{
/* MATI */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
}
else
{
/* SYSTEM OFF */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
HAL_Delay(200);
}
}
/* ===================== CLOCK ===================== */
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.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}
/* ===================== ADC ===================== */
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.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/* ===================== PWM (TIM1) ===================== */
static void MX_TIM1_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
HAL_TIM_PWM_Init(&htim1);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_MspPostInit(&htim1);
}
/* ===================== GPIO ===================== */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
/* OUTPUT */
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* BUTTON INTERRUPT */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
/* ===================== INTERRUPT ===================== */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_4)
{
system_on = !system_on;
}
}
/* ===================== ERROR ===================== */
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}
e. Video Demo [Kembali]
f. Analisa [Kembali]
g. Download File [Kembali]
Download File Tugas Pendahuluan(.Zip) [Klik Disini]
Download File Analisa [Klik Disini]
Video Demo [Klik Disini]
Download Datasheet Resistor (klik disini)
Download Datasheet STM32F103C8T6 [Klik Disini]
Download Datasheet Sensor Suhu Lm35 [Klik Disini]
Download Datasheet Kipas DC [Klik Disini]
Download Datasheet Push Button [Klik Disini]
Download Datasheet Motor Driver l298N [Klik Disini]
Komentar
Posting Komentar