Laporan Akhir 2
1. Prosedur [kembali]
1. Menyiapkan alat dan bahan berupa STM32F103C8T6, sensor suhu LM35, kipas DC, motor driver
L298N, push button, breadboard, adaptor, resistor, dan kabel jumper.
2. Menghubungkan sensor LM35 ke pin ADC STM32, motor driver dan kipas DC ke pin output
PWM, serta push button ke pin interrupt, kemudian menghubungkan seluruh VCC dan GND
komponen ke sumber tegangan.
3. Membuat program konfigurasi GPIO, ADC, PWM, timer, dan interrupt pada STM32 menggunakan
library HAL.
4. Mengatur timer TIM1 untuk menghasilkan sinyal PWM sebagai pengatur kecepatan kipas DC
melalui motor driver L298N.
5. Mengunggah program ke STM32F103C8T6 dan memastikan sistem berjalan tanpa error.
6. Menguji sensor LM35 dengan memberikan perubahan suhu untuk melihat perubahan kecepatan
kipas DC.
7. Menguji push button untuk memastikan sistem dapat diaktifkan dan dimatikan menggunakan
interrupt.
8. Mengamati respon sistem, dimana kipas akan berputar lebih cepat saat suhu meningkat dan
berhenti saat suhu rendah atau sistem dimatikan.
2. Hardware dan Diagram Blok [kembali]
A. Hardware
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja:
Sistem kontrol suhu ruangan bekerja dengan menggunakan sensor LM35 sebagai pendeteksi suhu
ruangan. Sensor LM35 menghasilkan tegangan analog yang nilainya sebanding dengan suhu.
Tegangan tersebut dibaca oleh ADC pada STM32F103C8T6 dan diubah menjadi data digital untuk
diproses oleh mikrokontroler.
Nilai suhu yang diperoleh kemudian dibandingkan dengan batas suhu yang telah ditentukan. Jika
suhu melebihi batas, STM32 akan mengaktifkan kipas DC melalui driver L298N. Kecepatan kipas
diatur menggunakan sinyal PWM dari timer TIM1, sehingga semakin tinggi suhu maka duty cycle
PWM akan semakin besar dan kipas berputar lebih cepat.
Sistem juga dilengkapi push button yang menggunakan interrupt untuk mengaktifkan atau mematikan
sistem tanpa mengganggu proses utama. Dengan kombinasi ADC, PWM, dan interrupt, sistem dapat
mengontrol suhu ruangan secara otomatis dan responsif.
4. Flowchart dan Listing Program [kembali]
B. Listing Program
#include "main.h"
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
/* Function prototypes -------------------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
/* Global variables ----------------------------------------------------------*/
uint32_t adcValue = 0;
float voltage = 0;
float temperature = 0;
uint8_t system_on = 1;
int main(void)
{
/* Initialize peripherals */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM1_Init();
/* Start PWM on Timer 1 Channel 1 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
while (1)
{
/* Read ADC Value */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adcValue = HAL_ADC_GetValue(&hadc1);
/* Convert ADC to Voltage and Temperature */
voltage = (adcValue / 4095.0) * 3.3;
temperature = (voltage * 100);
if (system_on)
{
if (temperature >= 27.0)
{
// Turn on Pin 2, Turn off Pin 3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
float duty;
if (temperature >= 35.0)
{
duty = 0.5;
}
else
{
// Linear duty cycle calculation
duty = 1.0 - ((temperature - 27.0) / 8.0) * 0.5;
}
// Update PWM Compare Value
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 65535);
}
else
{
/* Temperature below 27.0: Turn off everything */
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 is OFF: Turn off all outputs */
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);
}
}
/* Peripheral Initializations ------------------------------------------------*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Configure the main internal regulator output voltage */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/** Initialize 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;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
/** Initialize ADC peripheral clock */
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
}
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);
}
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);
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure GPIO pins : PA2 PA3 (Outputs) */
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure GPIO pin : PA4 (Interrupt Input) */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init */
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
/* Interrupt Callbacks -------------------------------------------------------*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_4)
{
// Toggle system status
system_on = !system_on;
}
}
/* Error Management ----------------------------------------------------------*/
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
7. Download File [kembali]
.png)

.jpeg)
Komentar
Posting Komentar