Tugas Pendahuluan 1


MODUL 1 PERCOBAAN 3 KONDISI 1


1. Prosedur[Kembali]

  1. Pahami terlebih dahulu kondisi yang akan digunakan
  2. Buka software Proteus 8.17
  3. Persiapkan alat dan bahan
  4. Buat rangkaian sesuai dengan kondisi dan modul
  5. Buka software STM32Cube IDE 
  6. Setelah membuka software, pilih perangkat STM32F103C8T6 
  7. Sesuaikan konfigurasi pin sesuai dengan rangkaian proteus 
  8. Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  9. Konfigurasi kan program dengan software Proteus
  10. Jalankan simulasi rangkaian.  
  11. Proses selesai

2. Hardware dan Diagram Blok[Kembali]

    Hardware

    


STM32F103C8



Motor Driver L298


LED

Sensor Suhu LM35


Kipas DC
Jumper
Adaptor

Resistor
Breadboard

    Diagram Blok

3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

Rangkaian Simulasi
Prinsip Kerja

Rangkaian tersebut bekerja sebagai sistem pengendali suhu ruangan yang memanfaatkan sensor analog, mikrokontroler, dan driver motor sebagai aktuator. Ketika sistem diberi catu daya +5V, sensor suhu LM35 langsung mulai mengukur temperatur lingkungan. Sensor ini memiliki karakteristik linier, sehingga setiap kenaikan suhu akan menghasilkan kenaikan tegangan output secara proporsional. Tegangan analog dari LM35 ini kemudian dikirim ke salah satu pin ADC pada mikrokontroler STM32F103C8.

Di dalam mikrokontroler, sinyal analog tersebut dikonversi menjadi data digital melalui modul ADC internal. Setelah itu, program yang telah ditanamkan akan mengolah data tersebut untuk mendapatkan nilai suhu aktual dalam satuan derajat Celcius. Nilai ini kemudian dibandingkan dengan nilai batas (setpoint) yang telah ditentukan dalam program. Proses ini merupakan inti dari sistem kontrol, karena keputusan untuk menyalakan atau mematikan aktuator ditentukan di tahap ini.

Apabila suhu yang terbaca melebihi setpoint, mikrokontroler akan mengirimkan sinyal logika ke driver motor L298. Driver ini berfungsi sebagai penguat arus karena mikrokontroler tidak mampu langsung menggerakkan beban seperti motor atau kipas. Dengan adanya sinyal dari STM32, L298 akan mengaktifkan outputnya sehingga motor atau kipas yang terhubung mulai berputar. Perputaran ini berfungsi untuk menurunkan suhu ruangan, misalnya dengan mengalirkan udara.

Sebaliknya, ketika suhu berada di bawah atau sama dengan batas yang ditentukan, mikrokontroler akan menghentikan sinyal ke L298. Akibatnya driver tidak lagi memberikan daya ke motor, sehingga kipas berhenti berputar. Dengan mekanisme ini, suhu ruangan dapat dijaga agar tetap berada di sekitar nilai yang diinginkan.

Selain itu, terdapat rangkaian resistor dan push button yang terhubung ke pin reset mikrokontroler. Resistor 10k berfungsi sebagai pull-up agar kondisi normal pin reset tetap tinggi. Ketika tombol ditekan, pin reset akan ditarik ke ground sehingga mikrokontroler melakukan restart dan program dijalankan ulang dari awal.

Secara keseluruhan, rangkaian ini membentuk sistem kontrol tertutup sederhana di mana sensor membaca kondisi suhu, mikrokontroler mengambil keputusan berdasarkan data tersebut, dan aktuator berupa kipas memberikan respons untuk mempengaruhi kondisi lingkungan agar sesuai dengan yang diinginkan.

4. Flowchart dan Listing Program[Kembali]



Flowchart Rangkaian
Listing Program

#include "main.h"


// ================= HANDLE =================

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim1;


// ================= PROTOTYPE =================

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_TIM1_Init(void);

void Error_Handler(void);


// ================= VARIABEL =================

uint32_t adcValue = 0;

float voltage = 0;

float temperature = 0;


// kontrol kipas

uint8_t fan_active = 0;

uint8_t triggered = 0; // anti repeat trigger

uint32_t startTime = 0;


// parameter

float duration = 5.0; // 5 detik dari full speed sampai mati


// =====================================================

// MAIN

// =====================================================

int main(void)

{

HAL_Init();

SystemClock_Config();


MX_GPIO_Init();

MX_ADC1_Init();

MX_TIM1_Init();


// Start PWM TIM1 CH1 (PA8)

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);


// arah motor tetap

// PA2 = IN1

// PA3 = IN2

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);


// awal kipas mati

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);


while (1)

{

// =====================================

// BACA SUHU LM35 (PA0)

// =====================================

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

adcValue = HAL_ADC_GetValue(&hadc1);


voltage = (adcValue / 4095.0f) * 3.3f;

temperature = voltage * 100.0f;


// =====================================

// RESET TRIGGER

// Harus turun dulu < 29°C

// agar bisa trigger lagi

// =====================================

if (temperature < 29.0f)

{

triggered = 0;

}


// =====================================

// SAAT SUHU >= 30°C

// kipas langsung full speed

// lalu turun linear sampai mati

// =====================================

if ((temperature >= 30.0f) && (triggered == 0))

{

fan_active = 1;

triggered = 1;

startTime = HAL_GetTick();


// langsung full speed saat trigger

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 65535);

}


// =====================================

// PENURUNAN KECEPATAN LINEAR

// dari full speed -> mati

// selama 5 detik

// =====================================

if (fan_active)

{

float elapsed =

(HAL_GetTick() - startTime) / 1000.0f;


if (elapsed <= duration)

{

// duty turun linear:

// awal = 100%

// akhir = 0%

float duty =

1.0f - (elapsed / duration);


if (duty < 0.0f)

duty = 0.0f;


uint32_t pwm =

(uint32_t)(duty * 65535.0f);


__HAL_TIM_SET_COMPARE(

&htim1,

TIM_CHANNEL_1,

pwm

);

}

else

{

// selesai -> kipas mati

__HAL_TIM_SET_COMPARE(

&htim1,

TIM_CHANNEL_1,

0

);


fan_active = 0;

}

}

else

{

// jika tidak aktif -> mati

__HAL_TIM_SET_COMPARE(

&htim1,

TIM_CHANNEL_1,

0

);

}


HAL_Delay(20); // transisi lebih halus

}

}


// =====================================================

// 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

);

}


// =====================================================

// ADC1

// PA0 -> LM35

// =====================================================

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; // PA0

sConfig.Rank =

ADC_REGULAR_RANK_1;

sConfig.SamplingTime =

ADC_SAMPLETIME_71CYCLES_5;


HAL_ADC_ConfigChannel(

&hadc1,

&sConfig

);

}


// =====================================================

// TIM1 PWM

// PA8 -> TIM1_CH1

// =====================================================

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;

htim1.Init.ClockDivision =

TIM_CLOCKDIVISION_DIV1;

htim1.Init.RepetitionCounter = 0;

htim1.Init.AutoReloadPreload =

TIM_AUTORELOAD_PRELOAD_DISABLE;


HAL_TIM_PWM_Init(&htim1);


sConfigOC.OCMode =

TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity =

TIM_OCPOLARITY_HIGH;

sConfigOC.OCFastMode =

TIM_OCFAST_DISABLE;


HAL_TIM_PWM_ConfigChannel(

&htim1,

&sConfigOC,

TIM_CHANNEL_1

);


HAL_TIM_MspPostInit(&htim1);

}


// =====================================================

// GPIO

// PA2 -> IN1

// PA3 -> IN2

// =====================================================

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

);

}


// =====================================================

// ERROR HANDLER

// =====================================================

void Error_Handler(void)

{

__disable_irq();


while (1)

{

}

}

5. Video Demo[Kembali]

6. Kondisi[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.

8. Download File[Kembali]

Rangkaian dan Program Proteus (Klik Disini)

Video Simulasi (Klik Disini)

HTML (Klik Disini)

Download Datasheet LM35 (klik disini)

Download Datasheet Motor Driver L298 (klik disini)

Download Datasheet STM32F103C8 (klik disini)

Download Datasheet Resistor (klik disini)

Download Datasheet Motor DC(klik disini)

Tidak ada komentar:

Posting Komentar