M2 TP1



1. Prosedur [kembali]

  1. Menyiapkan alat dan bahan.
  2. Merangkai komponen pada breadboard sesuai dengan gambar rangkaian percobaan.
  3. Menghubungkan masing masing pin input output.
  4. Mengunggah program menggunakan ST-LINK ke mikrokontroler.
  5. Jalankan Rangkaian

2. Hardware dan Diagram Blok [kembali]

  • ST-LINK 
  • STM32F103C8 (BLUEPILL)  
  • LM35 Sensor Suhu 
  • Push button interrupt 
  • Motor Driver l298N
  • Motor DC
  • Resistor 220 OHM 

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

Percobaan 3

Prinsip Kerja:

Secara prinsip, rangkaian ini bekerja dengan cara mikrokontroler membaca sinyal analog dari sensor LM35 melalui pin PA0. Sensor ini mendeteksi perubahan suhu lingkungan dan mengubahnya menjadi tegangan linear yang kemudian dikonversi oleh ADC (Analog-to-Digital Converter) internal STM32. Data suhu tersebut diolah untuk menentukan siklus kerja (duty cycle) PWM yang dikirimkan ke driver L298 melalui pin input (IN1 dan IN2). Driver L298 kemudian berfungsi sebagai jembatan daya untuk menggerakkan motor DC, di mana kecepatan motor akan berbanding lurus dengan nilai suhu yang terbaca—semakin tinggi suhu, semakin cepat motor berputar.

Selain kendali otomatis berbasis suhu, terdapat dua tombol tekan (push button) yang terhubung ke pin PA1 dan PB0. Tombol-tombol ini berfungsi sebagai input manual, kemungkinan untuk melakukan override (menghidupkan/mematikan motor secara paksa) atau mengatur arah putaran motor. Resistor R1 (10k) yang terhubung pada jalur tombol berfungsi sebagai pull-up untuk menjaga kestabilan logika input agar tidak mengambang (floating) saat tombol tidak ditekan. Seluruh sistem ini memungkinkan kontrol motor yang presisi dan responsif terhadap perubahan termal maupun intervensi pengguna secara langsung.

4. Flowchart dan Listing Program [kembali]

Flowchart

Listing Program:


#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 global untuk kontrol kipas

uint32_t adcValue = 0;

float voltage = 0;

float temperature = 0;

uint8_t system_on = 1;


// Variabel untuk kontrol kecepatan kipas linear

uint32_t fan_speed = 0; // Kecepatan kipas saat ini (0-65535)

uint32_t max_fan_speed = 65535; // Kecepatan maksimum

uint32_t speed_step = 100; // Penurunan kecepatan per iterasi (dapat disesuaikan)

uint8_t fan_active = 0; // Status kipas aktif/mati

uint32_t counter = 0; // Counter untuk timing


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 sensor 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);


if(system_on)

{

if(temperature >= 30.0) // Ubah threshold ke 30°C

{

// LED indikator suhu tinggi

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);


// RESET kecepatan maksimum jika suhu masih >= 30°C

if(!fan_active)

{

fan_speed = max_fan_speed;

fan_active = 1;

}


// Penurunan kecepatan linear terhadap waktu

counter++;

if(counter >= 50) // Setiap 50 iterasi (sekitar 10 detik dengan delay 200ms)

{

if(fan_speed > speed_step)

{

fan_speed -= speed_step; // Turun secara linear

}

else

{

fan_speed = 0;

fan_active = 0;

}

counter = 0;

}


// Set PWM duty cycle

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, fan_speed);

}

else

{

// Suhu < 30°C → Kipas MATI

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);

fan_active = 0;

fan_speed = 0;

counter = 0;

}

}

else

{

// System off

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);

fan_active = 0;

fan_speed = 0;

}


HAL_Delay(200); // Delay 200ms

}

}


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);

}


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};


__HAL_RCC_GPIOA_CLK_ENABLE();


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);


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);

}


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_4)

{

system_on = !system_on;

}

}


void Error_Handler(void)

{

__disable_irq();

while (1) {}

}

5. Video Demo [kembali]


6. Kondisi [kembali]

    Percobaan 3 Kondisi 2

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]

Mengupload: 7663500 dari 77243359 byte diupload.

Percobaan 3 Kondisi 2

8. Download File [kembali]










Komentar