1. Siapkan alat dan bahan yaitu dengan komponen utama STM32F103C8, sensor suhu LM35, kipas DC, Resistor, Motor Driver l298N, Push Button
2. Rangkai sesuai gambar percobaan
3. Rancang kerja rangkaian sesuai kondisi
4. Inisialisasi STM32F103C8 dengan aplikasi STM32CUBE ID
5. Setelah dapat file hex nya, masukkan file hex ke dalam stm pada proteus
4. Tekan tombol “Play” untuk menjalankan simulasi
2. Hardware dan Diagram Blok [Kembali]
a. Hardware
1. STM32F103C8
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 l298N
Motor Driver L298N adalah modul driver motor berbasis IC L298 yang digunakan untuk mengendalikan motor DC atau motor stepper dengan bantuan mikrokontroler.
b. Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
#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);
#define ADC_SAMPLES 10
uint32_t adcBuffer[ADC_SAMPLES];
uint8_t system_on = 1;
uint8_t fan_active = 0;
// ================= READ TEMPERATURE =================
float readTemperature()
{
uint32_t sum = 0;
for(int i = 0; i < ADC_SAMPLES; i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adcBuffer[i] = HAL_ADC_GetValue(&hadc1);
sum += adcBuffer[i];
}
float avg = sum / (float)ADC_SAMPLES;
float voltage = (avg / 4095.0) * 3.3;
return voltage * 100.0; // LM35
}
// ================= 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)
{
float temperature = readTemperature();
float duty = 0;
if(system_on)
{
// ===== HISTERESIS =====
if(fan_active == 0 && temperature >= 31.0)
fan_active = 1;
else if(fan_active == 1 && temperature <= 30.5)
fan_active = 0;
if(fan_active)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
// ===== PWM LINEAR (31 → 40) =====
if(temperature >= 40.0)
duty = 1.0;
else
duty = (temperature - 31.0) / 9.0;
// ===== CLAMP =====
if(duty < 0) duty = 0;
if(duty > 1) duty = 1;
}
else
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
duty = 0;
}
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 65535);
}
else
{
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 ================= */
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 ke driver motor
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);
// Tombol
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)
{
HAL_Delay(50); // debounce
system_on = !system_on;
}
}
/* ================= ERROR ================= */
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}
Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu >30 C maka kipas menyala dengan kecepatan penuh dan saat suhu turun maka kecepatan kipas menurun secara linear dan ketika 30 C kipas mati.
Komentar
Posting Komentar