TP1 M2
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
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
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim1;
/* USER CODE BEGIN PV */
uint32_t adcValue = 0;
float voltage = 0;
float temperature = 0;
volatile uint8_t system_on = 1;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
static void MX_ADC1_Init(void);
/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_4)
{
system_on = !system_on;
}
}
/* USER CODE END 0 */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// 1. Baca Suhu dari LM35
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);
// 2. Logika Kendali (Kipas Menyala > 31 C)
if(system_on)
{
if(temperature > 31.0)
{
// Arah Putaran Motor (Maju)
HAL_GPIO_WritePin(GPIOA, IN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, IN2_Pin, GPIO_PIN_RESET);
float duty;
if(temperature >= 40.0)
{
duty = 1.0; // Kecepatan 100% jika suhu 40C atau lebih
}
else
{
// Kecepatan linear naik perlahan dari 31C ke 40C
duty = (temperature - 31.0) / (40.0 - 31.0);
// Anti-stall: Minimal 20% PWM agar motor bisa mulai berputar
if(duty < 0.20) duty = 0.20;
}
// Eksekusi nilai PWM ke Timer
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint32_t)(duty * 65535));
}
else
{
// Suhu <= 31.0 C -> Kipas Mati
HAL_GPIO_WritePin(GPIOA, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, IN2_Pin, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
}
else
{
// Sistem OFF Manual dari Interupsi Tombol PA4
HAL_GPIO_WritePin(GPIOA, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, IN2_Pin, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
}
HAL_Delay(200); // Waktu sampling 200ms
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
*/
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.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
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.DiscontinuousConvMode = 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_1CYCLE_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
static void MX_TIM1_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim1);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
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_GPIOD_CLK_ENABLE();
__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.Pull = GPIO_NOPULL;
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
e. Video Demo [Kembali]
f. Kondisi [Kembali]
kondisi 1: 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.
g. Video Simulasi [Kembali]
h. Download File [Kembali]
File Tugas Pendahuluan(.Zip) [Klik Disini]
Video Simulasi [Klik Disini]
Komentar
Posting Komentar