Tugas Pendahuluan 2
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]
- 1. STM32F103C8TM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain.2. Sensor Suhu LM353. Kipas DC
LM35 temperature sensor adalah sensor suhu analog berbasis IC yang digunakan untuk mengukur temperatur lingkungan dalam satuan derajat Celsius (°C).
Kipas DC adalah kipas yang menggunakan sumber listrik arus searah (Direct Current / DC) untuk menggerakkan motor sehingga menghasilkan aliran udara.
4. Motor Driver l298NMotor Driver L298N adalah modul driver motor berbasis IC L298 yang digunakan untuk mengendalikan motor DC atau motor stepper dengan bantuan mikrokontroler.
5. Push ButtonPush button adalah saklar mekanik sederhana yang bekerja saat ditekan untuk menghubungkan atau memutus aliran listrik dalam suatu rangkaian.6. ResistorResistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.7. Adaptor
8. Jumper
9. Breadboard
Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip kerja dari sistem ini dimulai saat sensor suhu LM35 membaca kondisi lingkungan sekitarnya dan menghasilkan tegangan analog yang kemudian dibaca oleh pin ADC (Analog-to-Digital Converter) pada mikrokontroler STM32. Mikrokontroler akan mengonversi nilai tegangan tersebut menjadi data suhu dalam satuan derajat Celcius dan mengevaluasinya berdasarkan logika yang telah diprogram. Ketika sistem mendeteksi suhu berada di bawah 20°C, mikrokontroler akan mulai mengirimkan sinyal PWM (Pulse Width Modulation) ke IC driver motor L298 untuk memutar motor DC (kipas). Kecepatan putaran kipas ini diatur agar tidak konstan, melainkan menurun secara linear; mikrokontroler secara otomatis akan mengurangi nilai duty cycle PWM seiring dengan turunnya suhu. Hal ini membuat putaran kipas semakin melambat sejalan dengan suhu yang semakin mendingin. Pada akhirnya, ketika suhu terus turun hingga menyentuh batas 10°C atau lebih rendah, mikrokontroler akan menghentikan sinyal PWM sepenuhnya (memberikan nilai duty cycle 0%), sehingga driver L298 memutus arus listrik menuju motor dan kipas pun mati total.
4. Flowchart dan Listing Program [kembali]
- Flowchart
- Listing Program
#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 < 20C maka kipas menyala dengan kecepatan yang berubah dan kecepatan kipas menurun secara linear sampai 0 terhadap suhu dan ketika suhu menyentuh 10 C kipas mati.
7. Video Simulasi [kembali]
- Rangkaian Simulasi (klik disini)
- Download Datasheet Sensor Suhu (klik disini)
- Download Datasheet motor driver (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
- Datasheet STM32 NUCLEO-G474RE (klik disini)
- Datasheet LDR (klik disini)
- Datasheet Motor Servo (klik disini)
Komentar
Posting Komentar