TUGAS PENDAHULUAN 1
- Pahami terlebih dahulu kondisi yang akan digunakan
- Buka software Proteus 8.17
- Persiapkan alat dan bahan
- Buat rangkaian sesuai dengan kondisi dan modul
- Buka software STM32Cube IDE
- Setelah membuka software, pilih perangkat STM32F103C8T6
- Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus
- Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi
- Konfigurasi kan program dengan software Proteus
- Jalankan simulasi rangkaian.
- Proses selesai
2. Hardware dan Diagram Blok[Kembali]
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
LM35 mendeteksi suhu lingkungan dan mengubahnya menjadi tegangan analog yang sebanding dengan suhu (10 mV per 1°C).
Tegangan output dari LM35 masuk ke pin ADC pada mikrokontroler STM32F103C8.
STM32 mengubah sinyal analog menjadi data digital, kemudian menghitung nilai suhu dalam satuan derajat Celsius.
Nilai suhu dibandingkan dengan batas (threshold) yang sudah ditentukan dalam program.
- Jika suhu di bawah batas → motor mati / kecepatan rendah
- Jika suhu di atas batas → motor menyala / kecepatan tinggi
STM32 mengirimkan sinyal digital (IN1, IN2, ENA/PWM) ke driver L298 sesuai hasil pengolahan.
L298 memperkuat sinyal dari STM32 agar mampu mengalirkan arus yang cukup untuk menggerakkan motor DC.
Motor berputar sesuai perintah (ON/OFF atau cepat/lambat), biasanya berfungsi sebagai kipas pendingin.
- STM32 menggunakan tegangan 3.3V
- L298 dan motor menggunakan 5V
- Semua ground harus terhubung agar sistem bekerja stabil
4. Flowchart dan Listing Program[Kembali]
#include "main.h" // Library utama STM32 HAL
ADC_HandleTypeDef hadc1; // Handle untuk ADC1
TIM_HandleTypeDef htim1; // Handle untuk Timer1 (PWM)
// Prototype fungsi
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM1_Init(void);
// Variabel global
uint32_t adcValue = 0; // Menyimpan nilai ADC (0–4095)
float voltage = 0; // Tegangan hasil konversi ADC
float temperature = 0; // Suhu dalam derajat Celcius
volatile uint8_t system_on = 1; // Status sistem (1=ON, 0=OFF)
int main(void)
{
HAL_Init(); // Inisialisasi HAL library
SystemClock_Config(); // Konfigurasi clock sistem
MX_GPIO_Init(); // Inisialisasi GPIO
MX_ADC1_Init(); // Inisialisasi ADC
MX_TIM1_Init(); // Inisialisasi Timer PWM
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // Mulai PWM pada TIM1 Channel 1
/* USER CODE BEGIN WHILE */
uint32_t start_time = 0;
uint8_t cooling_active = 0;
const uint32_t duration = 10000; // Durasi penurunan kecepatan (misal: 10 detik / 10000ms)
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adcValue = HAL_ADC_GetValue(&hadc1);
// Konversi ADC ke Suhu (LM35: 10mV/°C pada Vref 3.3V)
voltage = (adcValue / 4095.0f) * 3.3f;
temperature = (voltage * 100.0f);
if (system_on)
{
// TRIGGER: Jika suhu menyentuh 30 derajat dan proses pendinginan belum jalan
if (temperature >= 30.0f && !cooling_active)
{
cooling_active = 1;
start_time = HAL_GetTick(); // Catat waktu mulai
// Indikator LED (Opsional: Hijau ON saat proses aktif)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // Merah OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); // Hijau ON
}
if (cooling_active)
{
uint32_t current_time = HAL_GetTick();
uint32_t elapsed_time = current_time - start_time;
if (elapsed_time < duration)
{
// Hitung penurunan linear: Kecepatan awal (65535) menuju 0
// Rumus: PWM = Max_PWM * (1 - (waktu_berjalan / total_durasi))
float factor = 1.0f - ((float)elapsed_time / (float)duration);
uint32_t pwm_value = (uint32_t)(65535 * factor);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_value);
}
else
{
// Durasi habis, matikan kipas dan reset status
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
cooling_active = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); // Hijau OFF
}
}
}
else
{
// Jika sistem OFF secara paksa
cooling_active = 0;
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
}
HAL_Delay(50); // Delay lebih kecil agar transisi PWM halus
}
}
// ================= CLOCK CONFIG =================
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; // Struktur konfigurasi oscillator
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // Struktur konfigurasi clock
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; // Struktur clock peripheral
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; // Gunakan HSI (internal clock)
RCC_OscInitStruct.HSIState = RCC_HSI_ON; // Aktifkan HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // Tidak pakai PLL
HAL_RCC_OscConfig(&RCC_OscInitStruct); // Terapkan konfigurasi
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; // Jenis clock
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // Sumber clock dari HSI
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); // Terapkan konfigurasi
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; // Pilih clock ADC
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; // Divider ADC
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); // Terapkan
}
// ================= ADC CONFIG =================
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0}; // Struktur konfigurasi channel
hadc1.Instance = ADC1; // Gunakan ADC1
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Tidak scan multiple channel
hadc1.Init.ContinuousConvMode = DISABLE; // Tidak continuous
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Trigger manual
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Align kanan
hadc1.Init.NbrOfConversion = 1; // 1 channel
HAL_ADC_Init(&hadc1); // Inisialisasi ADC
sConfig.Channel = ADC_CHANNEL_0; // Channel 0
sConfig.Rank = ADC_REGULAR_RANK_1; // Rank 1
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; // Waktu sampling
HAL_ADC_ConfigChannel(&hadc1, &sConfig); // Terapkan channel
}
// ================= TIMER PWM =================
static void MX_TIM1_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0}; // Struktur konfigurasi PWM
htim1.Instance = TIM1; // Gunakan Timer 1
htim1.Init.Prescaler = 0; // Prescaler 0 (kecepatan tinggi)
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // Counter naik
htim1.Init.Period = 65535; // Resolusi 16-bit
HAL_TIM_PWM_Init(&htim1); // Inisialisasi PWM
sConfigOC.OCMode = TIM_OCMODE_PWM1; // Mode PWM1
sConfigOC.Pulse = 0; // Duty awal 0%
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;// Polaritas low
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); // Konfigurasi channel
HAL_TIM_MspPostInit(&htim1); // Inisialisasi GPIO PWM
}
// ================= GPIO =================
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Struktur GPIO
__HAL_RCC_GPIOA_CLK_ENABLE(); // Aktifkan clock GPIOA
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; // Pin LED
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Output push-pull
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Kecepatan rendah
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan
GPIO_InitStruct.Pin = GPIO_PIN_4; // Pin tombol
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // Interrupt rising edge
GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Terapkan
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0); // Set prioritas interrupt
HAL_NVIC_EnableIRQ(EXTI4_IRQn); // Aktifkan interrupt
}
// ================= INTERRUPT =================
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_4) // Jika tombol ditekan
{
system_on = !system_on; // Toggle ON/OFF sistem
}
}
// ================= ERROR =================
void Error_Handler(void)
{
__disable_irq(); // Disable interrupt
while (1) {} // Loop selamanya jika error
}
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
Rangkaian dan Program Proteus (Klik Disini)
Video Simulasi (Klik Disini)
HTML (Klik Disini)
Download Datasheet IR Sensor (klik disini)
Download Datasheet Touch Sensor (klik disini)
Download Datasheet STM32F103C8 (klik disini)
Download Datasheet Resistor (klik disini)
Download Datasheet LED (klik disini)
Download Datasheet Buzzer (klik disini)
Komentar
Posting Komentar