TUGAS PENDAHULUAN 1
MODUL 2
TUGAS PENDAHULUAN 1
1. Prosedur [kembali]
Membuat proyek baru pada STM32CubeIDE dengan memilih mikrokontroler STM32F103C8, kemudian mengatur pin dengan menjadikan PA0 sebagai input ADC untuk sensor LM35, serta beberapa pin output (misalnya PA2, PA3, PA8) untuk mengontrol driver motor L298 (IN1, IN2, dan ENA).
Selanjutnya dilakukan generate code, lalu menambahkan program pada file main.c dengan logika membaca suhu dari LM35, dimana jika suhu melebihi batas tertentu maka motor akan aktif melalui driver L298, dan jika di bawah batas maka motor berhenti.
Setelah itu, program di-build hingga menghasilkan file berekstensi .hex yang akan digunakan dalam simulasi di Proteus.
Kemudian merancang rangkaian pada Proteus sesuai gambar, dengan menambahkan komponen STM32F103C8, sensor LM35, resistor 10 kΩ (pull-up/reset), driver L298, motor DC, serta sumber tegangan +3.3V dan +6V. Koneksi dilakukan dengan menghubungkan output LM35 ke PA0, pin kontrol L298 (IN1, IN2, ENA) ke pin output STM32, serta motor ke output L298, dan memastikan semua ground terhubung menjadi satu.
Berikutnya, file .hex dimasukkan ke dalam komponen STM32 pada Proteus melalui pengaturan program file.
Terakhir, simulasi dijalankan untuk mengamati hasil, dimana perubahan suhu pada LM35 akan mempengaruhi kerja motor, yaitu motor akan menyala saat suhu tinggi dan berhenti saat suhu rendah sesuai dengan program yang dibuat.
2. Hardware [kembali]
1. STM32F103C8
Microcontroller | ARM Cortex-M3 |
Operating Voltage | 3.3 V |
Input Voltage (recommended) | 5 V |
Input Voltage (limit) | 2 – 3.6 V |
Digital I/O Pins | 32 |
PWM Digital I/O Pins | 15 |
Analog Input Pins | 10 (dengan resolusi 12-bit ADC) |
DC Current per I/O Pin | 25 mA |
DC Current for 3.3V Pin | 150 mA |
Flash Memory | 64 KB |
SRAM | 20 KB |
EEPROM | Emulasi dalam Flash |
Clock Speed | 72 MHz |
3. Resistor
5. LM35
LM35 adalah sensor suhu yang sangat populer dalam rangkaian elektronika karena mudah digunakan dan cukup akurat.
6. Motor Driver
Motor driver adalah rangkaian atau modul yang digunakan untuk mengendalikan motor (DC, stepper, atau servo) karena mikrokontroler seperti Arduino atau STM32 tidak mampu langsung memberi arus besar ke motor.
7. Motor DC
Motor DC adalah perangkat yang mengubah energi listrik arus searah (DC) menjadi energi mekanik berupa putaran.
8. Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
Prinsip Kerja :
4. Flowchart dan Listing Program [kembali]
Listing Program :
#include "main.h"
/* ================= VARIABLE ================= */
ADC_HandleTypeDef hadc1;
/* ================= PROTOTYPE ================= */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
/* ================= ADC ================= */
uint32_t Read_ADC(void)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint32_t adc = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
return adc;
}
float Read_Temperature(void)
{
uint32_t adc = Read_ADC();
float voltage = adc * 3.3f / 4095.0f;
return voltage * 100.0f;
}
/* ================= FAN ================= */
void Fan_ON(void)
{
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);
}
void Fan_OFF(void)
{
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, GPIO_PIN_RESET);
}
/* ================= STOP PERLAHAN 5 DETIK ================= */
void Fan_Slow_Stop(void)
{
int steps = 20;
int total_time = 5000;
int delay_step = total_time / steps;
for (int duty = 100; duty >= 0; duty -= (100 / steps))
{
uint32_t start = HAL_GetTick();
while (HAL_GetTick() - start < delay_step)
{
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_SET);
HAL_Delay(duty / 10);
HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, GPIO_PIN_RESET);
HAL_Delay((100 - duty) / 10);
}
}
Fan_OFF();
}
/* ================= MAIN ================= */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
uint8_t fan_status = 0;
uint8_t last_button = GPIO_PIN_SET;
Fan_OFF();
while (1)
{
float suhu = Read_Temperature();
uint8_t button = HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin);
/* Tombol sekali tekan */
if (button == GPIO_PIN_RESET && last_button == GPIO_PIN_SET)
{
HAL_Delay(50);
if (HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET)
{
fan_status = 1;
Fan_ON();
}
}
last_button = button;
/* Suhu > 30°C */
if (fan_status == 1 && suhu > 30.0f)
{
fan_status = 0;
Fan_Slow_Stop();
}
HAL_Delay(100);
}
}
/* ================= GPIO ================= */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, IN1_Pin | IN2_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = IN1_Pin | IN2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = BUTTON_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/* ================= 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_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
/* ================= CLOCK ================= */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {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;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
/* ================= ERROR ================= */
void Error_Handler(void)
{
__disable_irq();
while (1) {}
}
5. Video Demo [kembali]
6. Kondisi [kembali]
Percobaan 3 Kondisi 6
Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor tombol ditekan sekali maka kipas hidup dan ketika sensor suhu >30 C maka kipas mati secara perlahan selama 5 detik.
7. Video Simulasi [kembali]
8. Link Download [kembali]
- Rangkaian Proteus [Download]
- Program [Download]
- Datasheet STM32F103C8 [Download]
- Datasheet LM35 [Download]
- Datasheet Motor Driver [Download]
Komentar
Posting Komentar