Percobaan 2



 1. Prosedur[kembali]

  1. Susun rangkaian alat sesuai langkah-langkah yang terdapat pada modul.
  2. Buka software Proteus, kemudian rangkai komponen mengikuti skema pada modul.
  3. Jalankan STM32CubeIDE dan lakukan konfigurasi pin untuk menentukan fungsi GPIO sebagai input maupun output.
  4. Upload atau masukkan program ke mikrokontroler STM32.
  5. Eksekusi program untuk menjalankan sistem.

 2. Hardware dan Diagram Blok [kembali]

1. Resistor


2. Push Button


3. Breadboard

4. Motor Driver

5. Kipas DC
6. Sensor Suhu lm35

7. Adaptor

 8. STM32F103C8


  • Diagram Blog


 3. Rangkaian Simulasi Dan Prinsip Kerja [kembali]


  • Deteksi Suhu (Input Analog): Sensor LM35 temperature sensor mengukur suhu lingkungan dan menghasilkan tegangan linier sekitar 10 mV untuk setiap kenaikan 1°C.
  • Konversi Data (ADC): Tegangan analog tersebut masuk ke mikrokontroler STM32F103C8T6 dan dikonversi menjadi data digital 12-bit dengan rentang 0–4095.
  • Pengolahan Logika Kontrol: Data digital diolah untuk mendapatkan nilai suhu aktual, kemudian dibandingkan dengan setpoint guna menentukan tingkat kecepatan kipas.
  • Penggerak Daya (Motor Driver): Karena arus dari mikrokontroler terbatas, sinyal kontrol diteruskan ke L298N motor driver module yang berfungsi sebagai penguat daya untuk menggerakkan kipas DC.
  • Modulasi Kecepatan (PWM): Kecepatan kipas diatur menggunakan sinyal PWM; semakin tinggi suhu, duty cycle meningkat sehingga putaran kipas menjadi lebih cepat.
  • Interaksi Manual (Interrupt): Push button dengan sistem interrupt (EXTI) memungkinkan kontrol ON/OFF secara langsung tanpa menunggu proses utama selesai.
  • Manajemen Waktu: Fungsi HAL_GetTick() digunakan untuk mengatur pembacaan sensor dan pembaruan kecepatan secara periodik tanpa menghentikan eksekusi program (non-blocking).

   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);
if(system_on)
{
if(temperature >= 27.0)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
float duty;
if(temperature >= 35.0)
{
duty = 0.5;
}
else

(temperature - 27.0) / 8.0) * 0.5;
}
__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);
}
}
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);
}
}
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. Analisa [kembali]




 7. Download File [kembali]












Komentar

Postingan populer dari blog ini