[menuju akhir]

Langkah-langkah percobaan :

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
TM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang  dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai  metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain.

2. Sensor Suhu LM35

LM35 temperature sensor adalah sensor suhu analog berbasis IC yang digunakan untuk mengukur temperatur lingkungan dalam satuan derajat Celsius (°C).

3. Kipas DC

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.


5. Push Button

Push button adalah saklar mekanik sederhana yang bekerja saat ditekan untuk menghubungkan atau memutus aliran listrik dalam suatu rangkaian.

6. Resistor 

Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

b. Diagram Blok





3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]




Prinsip Kerja :


4. Flowchart dan Listing Program [Kembali]
a. Flowchart



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


#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) {}

}



5. Video Demo [Kembali]


6. Kondisi [Kembali]

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]
1. Download File Rangkaian  
2. Download Video Simulasi 

Komentar

Postingan populer dari blog ini