Tugas Pendahuluan 1
1. Prosedur [kembali]
- Menyiapkan alat dan bahan.
- Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
- Menghubungkan masing masing pin input output.
- Mengunggah program menggunakan ST-LINK ke mikrokontroler.
- Jalankan Rangkaian
2. Hardware dan Diagram Blok [kembali]
- STM32F103C8T6
- Sensor Suhu Lm35
- Kipas DC
- Push Button
- Motor Driver l298N
- Breadboard
- Adaptor
- Resistor
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Rangkaian ini bekerja dengan memanfaatkan sensor suhu LM35 untuk mendeteksi temperatur lingkungan, lalu hasil tegangannya dibaca oleh mikrokontroler STM32 melalui pin ADC. Saat suhu mencapai sekitar 30°C, STM32 mulai mengaktifkan driver motor L298 untuk menyalakan kipas. Kecepatan kipas diatur menggunakan sinyal PWM (Pulse Width Modulation), di mana duty cycle awal dibuat tinggi sehingga kipas berputar cepat. Seiring waktu, duty cycle ini diturunkan secara bertahap (linear), sehingga kecepatan kipas juga ikut menurun sampai akhirnya berhenti. Jadi, sistem ini menggabungkan pembacaan sensor analog, pengolahan data oleh mikrokontroler, dan pengendalian motor berbasis PWM untuk menghasilkan kontrol kipas yang berubah terhadap waktu.
4. Flowchart dan Listing Program [kembali]
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f1xx_hal.h"
// Motor L298
#define IN1_PIN GPIO_PIN_2
#define IN1_PORT GPIOA
#define IN2_PIN GPIO_PIN_3
#define IN2_PORT GPIOA
// Push Button
#define BTN_PIN GPIO_PIN_4
#define BTN_PORT GPIOA
void Error_Handler(void);
#endif
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
#include "main.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
// Variabel
uint32_t adcValue = 0;
float voltage = 0;
float temperature = 0;
uint8_t system_on = 1;
// PWM linear turun
uint16_t duty = 60000;
uint32_t lastTick = 0;
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 LM35 =====
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adcValue = HAL_ADC_GetValue(&hadc1);
voltage = (adcValue / 4095.0) * 3.3;
temperature = voltage * 100;
// ===== LOGIKA FAN =====
if(system_on)
{
if(temperature >= 30.0)
{
// arah motor
HAL_GPIO_WritePin(IN1_PORT, IN1_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(IN2_PORT, IN2_PIN, GPIO_PIN_RESET);
// penurunan linear terhadap waktu
if(HAL_GetTick() - lastTick >= 200)
{
lastTick = HAL_GetTick();
if(duty > 1000)
{
duty -= 2000;
}
else
{
duty = 0;
}
}
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
}
else
{
// suhu turun → reset
HAL_GPIO_WritePin(IN1_PORT, IN1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN2_PORT, IN2_PIN, GPIO_PIN_RESET);
duty = 60000;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
}
else
{
HAL_GPIO_WritePin(IN1_PORT, IN1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN2_PORT, IN2_PIN, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
HAL_Delay(100);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {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);
}
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
__HAL_RCC_ADC1_CLK_ENABLE();
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};
__HAL_RCC_TIM1_CLK_ENABLE();
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};
__HAL_RCC_GPIOA_CLK_ENABLE();
// PA2 & PA3 → Output motor
GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA0 → Analog (LM35)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA4 → Button (polling)
GPIO_InitStruct.Pin = BTN_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}
5. Video Demo [kembali]
Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu 30 maka kipas menyala dengan kecepatan yang berubah dan kecepatan kipas menurun secara linear sampai 0 terhadap waktu.
7. Video Simulasi [kembali]
- Download File Rangkaian (klik disini)
- Download Video Penjelasan Rangkaian (klik disini)
- Download Datasheet Touch Sensor (klik disini)
- Download Datasheet Infrared Sensor (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
Komentar
Posting Komentar