Laporan Akhir 2

 



1. Prosedur [kembali]
    1. Menyiapkan alat dan bahan berupa STM32F103C8T6, sensor suhu LM35, kipas DC, motor driver
        L298N, push button, breadboard, adaptor, resistor, dan kabel jumper.
    2. Menghubungkan sensor LM35 ke pin ADC STM32, motor driver dan kipas DC ke pin output
        PWM, serta push button ke pin interrupt, kemudian menghubungkan seluruh VCC dan GND
        komponen ke sumber tegangan.
    3. Membuat program konfigurasi GPIO, ADC, PWM, timer, dan interrupt pada STM32 menggunakan
        library HAL.
    4. Mengatur timer TIM1 untuk menghasilkan sinyal PWM sebagai pengatur kecepatan kipas DC
        melalui motor driver L298N.
    5. Mengunggah program ke STM32F103C8T6 dan memastikan sistem berjalan tanpa error.
    6. Menguji sensor LM35 dengan memberikan perubahan suhu untuk melihat perubahan kecepatan
        kipas DC.
    7. Menguji push button untuk memastikan sistem dapat diaktifkan dan dimatikan menggunakan
        interrupt.
    8. Mengamati respon sistem, dimana kipas akan berputar lebih cepat saat suhu meningkat dan
        berhenti saat suhu rendah atau sistem dimatikan.

2. Hardware dan Diagram Blok [kembali]
    A. Hardware
    1. STM32F103C8

    2. Sensor Suhu LM35


    3. Kipas DC
    4. Push Button 
    5. Motor Driver l298N
    6. Resistor

    B. Diagram Blok

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

    Prinsip Kerja:
    Sistem kontrol suhu ruangan bekerja dengan menggunakan sensor LM35 sebagai pendeteksi suhu
    ruangan. Sensor LM35 menghasilkan tegangan analog yang nilainya sebanding dengan suhu.
    Tegangan tersebut dibaca oleh ADC pada STM32F103C8T6 dan diubah menjadi data digital untuk
    diproses oleh mikrokontroler.

    Nilai suhu yang diperoleh kemudian dibandingkan dengan batas suhu yang telah ditentukan. Jika
    suhu melebihi batas, STM32 akan mengaktifkan kipas DC melalui driver L298N. Kecepatan kipas
    diatur menggunakan sinyal PWM dari timer TIM1, sehingga semakin tinggi suhu maka duty cycle
    PWM akan semakin besar dan kipas berputar lebih cepat.

    Sistem juga dilengkapi push button yang menggunakan interrupt untuk mengaktifkan atau mematikan
    sistem tanpa mengganggu proses utama. Dengan kombinasi ADC, PWM, dan interrupt, sistem dapat
    mengontrol suhu ruangan secara otomatis dan responsif.

4. Flowchart dan Listing Program [kembali]

    A. Flowchart

    B. Listing Program
        #include "main.h"

        /* Private variables ---------------------------------------------------------*/
        ADC_HandleTypeDef hadc1;
        TIM_HandleTypeDef htim1;

        /* Function prototypes -------------------------------------------------------*/
        void SystemClock_Config(void);
        static void MX_GPIO_Init(void);
        static void MX_ADC1_Init(void);
        static void MX_TIM1_Init(void);

        /* Global variables ----------------------------------------------------------*/
        uint32_t adcValue = 0;
        float voltage = 0;
        float temperature = 0;
        uint8_t system_on = 1;

        int main(void)
        {
            /* Initialize peripherals */
            HAL_Init();
            SystemClock_Config();

            MX_GPIO_Init();
            MX_ADC1_Init();
            MX_TIM1_Init();

            /* Start PWM on Timer 1 Channel 1 */
            HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

            while (1)
            {
                /* Read ADC Value */
                HAL_ADC_Start(&hadc1);
                HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
                adcValue = HAL_ADC_GetValue(&hadc1);

                /* Convert ADC to Voltage and Temperature */
                voltage = (adcValue / 4095.0) * 3.3;
                temperature = (voltage * 100);

                if (system_on)
                {
                    if (temperature >= 27.0)
                    {
                        // Turn on Pin 2, Turn off Pin 3
                        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
                        {
                            // Linear duty cycle calculation
                            duty = 1.0 - ((temperature - 27.0) / 8.0) * 0.5;
                        }

                        // Update PWM Compare Value
                        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 65535);
                    }
                    else
                    {
                        /* Temperature below 27.0: Turn off everything */
                        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 is OFF: Turn off all outputs */
                    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);
            }
        }

        /* Peripheral Initializations ------------------------------------------------*/

        void SystemClock_Config(void)
        {
            RCC_OscInitTypeDef RCC_OscInitStruct = {0};
            RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
            RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

            /** Configure the main internal regulator output voltage */
            RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
            RCC_OscInitStruct.HSIState = RCC_HSI_ON;
            RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
            HAL_RCC_OscConfig(&RCC_OscInitStruct);

            /** Initialize CPU, AHB and APB buses clocks */
            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);

            /** Initialize ADC peripheral clock */
            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};

            /* GPIO Ports Clock Enable */
            __HAL_RCC_GPIOA_CLK_ENABLE();

            /* Configure GPIO pins : PA2 PA3 (Outputs) */
            GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
            GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
            GPIO_InitStruct.Pull = GPIO_NOPULL;
            GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
            HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

            /* Configure GPIO pin : PA4 (Interrupt Input) */
            GPIO_InitStruct.Pin = GPIO_PIN_4;
            GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
            GPIO_InitStruct.Pull = GPIO_PULLUP;
            HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

            /* EXTI interrupt init */
            HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
            HAL_NVIC_EnableIRQ(EXTI4_IRQn);
        }

        /* Interrupt Callbacks -------------------------------------------------------*/

        void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
        {
            if (GPIO_Pin == GPIO_PIN_4)
            {
                // Toggle system status
                system_on = !system_on;
            }
        }

        /* Error Management ----------------------------------------------------------*/

        void Error_Handler(void)
        {
            __disable_irq();
            while (1)
            {
            }
        }


5. Video Demo [kembali]


6. Analisa [kembali]



7. Download File [kembali]

  • Download Rangkaian Tugas Pendahulu disini
  • Download Listing Program disini
  • Download Datasheet STM32F103C8 disini
  • Download Datasheet PIR Sensor disini
  • Download Dastasheet Touch Sensor disini
    

[menuju awal]




Komentar

Postingan populer dari blog ini