Laporan Akhir M2 Percobaan 3



a. 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

b. Hardware dan Diagram Blok [Kembali]

  • Hardware

1. STM32F103C8





2. Sensor Suhu LM35




3. Fan DCrt





4. Switch




5. Driver Motor L298



6. Resistor 


  • Blok Diagram


c. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


        Prinsip kerja sistem ini berpusat pada pembacaan suhu secara terus-menerus dan penyesuaian kecepatan kipas secara otomatis. Sensor suhu LM35 mendeteksi suhu sekitar dan mengirimkan sinyal tegangan analog ke mikrokontroler STM32 (pin PA0). Mikrokontroler kemudian mengonversi tegangan ini menjadi nilai digital (ADC) dan menghitungnya kembali ke dalam satuan derajat Celcius. Selama suhu terdeteksi berada di angka 30°C atau di bawahnya, sistem memutuskan bahwa lingkungan masih dingin, sehingga mikrokontroler tidak mengirimkan sinyal penggerak (PWM = 0) dan kipas tetap mati.

        Ketika suhu lingkungan mulai memanas dan melewati angka kritis 31°C, mikrokontroler mulai mengaktifkan kipas secara bertahap. Melalui pin PA8, sinyal Pulse Width Modulation (PWM) dikirimkan ke IC Motor Driver L298 untuk mengatur daya motor. Pada suhu tepat 31°C, daya diatur pada batas minimum 20% agar baling-baling mendapat cukup tenaga awal untuk berputar. Seiring kenaikan suhu dari 31°C menuju 40°C, kecepatan putaran kipas akan meningkat secara linear dan proporsional; semakin panas suhunya, semakin cepat kipasnya berputar. Jika suhu telah mencapai atau melewati 40°C, mikrokontroler akan memerintahkan putaran maksimal (100% duty cycle) untuk pendinginan optimal. Seluruh proses otomatis ini dilengkapi dengan fitur override manual berupa tombol (pin PA4); kapan pun tombol ini ditekan, sistem interupsi pada mikrokontroler akan langsung bereaksi untuk mematikan atau menyalakan kembali seluruh operasi sistem tanpa harus menunggu proses perhitungan suhu selesai.

d. Flowchart dan Listing Program [Kembali]

  • Flowchart



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


/* ===================== VARIABLE ===================== */

uint32_t adcValue = 0;

float voltage = 0;

float temperature = 0;

uint8_t system_on = 1;


/* ===================== 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)

    {

        /* ===== BACA ADC ===== */

        HAL_ADC_Start(&hadc1);

        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

        adcValue = HAL_ADC_GetValue(&hadc1);


        /* ===== KONVERSI ===== */

        voltage = (adcValue / 4095.0) * 3.3;

        temperature = voltage * 100;


        if (system_on)

        {

            if (temperature >= 27.0)

            {

                /* LED indikator */

                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);


                /* ===== PWM CONTROL ===== */

                float duty;


                if (temperature >= 35.0)

                {

                    duty = 0.5;   // max speed

                }

                else

                {

                    duty = 1.0 - ((temperature - 27.0) / 8.0) * 0.5;

                }


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

            }

            else

            {

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

            }

        }

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

        }


        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 (TIM1) ===================== */

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

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


    /* BUTTON INTERRUPT */

    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)

    {

        system_on = !system_on;

    }

}


/* ===================== ERROR ===================== */

void Error_Handler(void)

{

    __disable_irq();

    while (1) {}

}

e. Video Demo [Kembali]



f. Analisa [Kembali]





g. Download File [Kembali]

Download File Tugas Pendahuluan(.Zip) [Klik Disini]

Download File Analisa [Klik Disini]

Video Simulasi [Klik Disini]

Video Demo [Klik Disini]

Download Datasheet Resistor (klik disini)

Download Datasheet STM32F103C8T6 [Klik Disini]

Download Datasheet Sensor Suhu Lm35 [Klik Disini]

Download Datasheet Kipas DC [Klik Disini]

Download Datasheet Push Button [Klik Disini]

Download Datasheet Motor Driver l298N [Klik Disini]



Kembali ke Halaman Atas

 

Komentar

Postingan populer dari blog ini