TUGAS PENDAHULUAN 1



 1. Prosedur [kembali]

1. Buka software proteus lalu rangkai komponen sesuai dengan gambar yang ada di modul

2. Buka software STM32CubeIDE lalu lakukan konfigurasi pin pada STM untuk menentukan GPIO input dan GPIO output

3. Masukan Program ke dalam software STM32CubeIDE lalu build untuk mendapatkan file .hex

4. Masukan file .hex ke dalam file library STM32F103C8 pada proteus

5. Simulasikan rangkaian

 2. Hardware dan diagram blok [kembali]
  • STM32F103C8T6
  • Sensor Suhu Lm35
  • Kipas DC
  • Push Button
  • Motor Driver l298N
  • Breadboard
  • Adaptor
  • Resistor  


 3. Rangkaian Simulasi Dan Prinsip Kerja [kembali]

Percobaan 3 Kondisi 1

Prinsip Kerja:

Rangkaian ini bekerja dengan memanfaatkan sensor suhu LM35 untuk mendeteksi temperatur lingkungan, lalu hasil tegangannya dibaca oleh mikrokontroler STM32 melalui pin ADC. Saat suhu mencapai sekitar 30°C, STM32 mulai mengaktifkan driver motor L298 untuk menyalakan kipas. Kecepatan kipas diatur menggunakan sinyal PWM (Pulse Width Modulation), di mana duty cycle awal dibuat tinggi sehingga kipas berputar cepat. Seiring waktu, duty cycle ini diturunkan secara bertahap (linear), sehingga kecepatan kipas juga ikut menurun sampai akhirnya berhenti. Jadi, sistem ini menggabungkan pembacaan sensor analog, pengolahan data oleh mikrokontroler, dan pengendalian motor berbasis PWM untuk menghasilkan kontrol kipas yang berubah terhadap waktu


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


uint32_t adcValue = 0;

float voltage = 0;

float temperature = 0;

uint8_t system_on = 1;


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)

{

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); // LM35: 10mV/°C


if(system_on)

{

if(temperature <= 31.0)

{

// Kipas MATI saat ≤ 31°C

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

}

else

{

// Kipas MAJU

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);


float duty;


if(temperature >= 41.0)

{

duty = 1.0; // Full speed

}

else

{

// Linear dari 31°C ke 41°C

duty = (temperature - 31.0) / 10.0;

}


// Batas aman

if(duty > 1.0) duty = 1.0;

if(duty < 0.0) duty = 0.0;


__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 65535);

}

}

else

{

// System OFF → 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);

}


HAL_Delay(200);

}

}


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; // Toggle ON/OFF

}

}


void Error_Handler(void)

{

__disable_irq();

while (1) {}

}


 5. Video Demo [kembali]

 6. Kondisi [kembali] 

Percobaan 3 Kondisi 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.

 7. Video Simulasi [kembali]



 8. Download File [kembali]

Komentar

Postingan populer dari blog ini