Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu 30 maka kipas menyala dengan kecepatan yang berubah dan kecepatan kipas menurun secara linear sampai 0 terhadap waktu.
2. Hardware dan Diagram Blok [Kembali]
Daftar Hardware/Komponen Utama:
Prinsip kerja rangkaian ini dimulai ketika sensor suhu LM35 membaca temperatur lingkungan dan mengubahnya menjadi tegangan analog yang sebanding dengan suhu. Tegangan ini dibaca oleh ADC pada STM32, lalu dikonversi menjadi nilai suhu dalam derajat Celsius. Sistem secara terus-menerus memantau suhu tersebut, dan ketika suhu mencapai atau melebihi 30°C sebagai nilai ambang yang ditentukan, mikrokontroler mengaktifkan kipas melalui sinyal PWM (Pulse Width Modulation). Pada saat awal aktif, kipas berputar pada kecepatan maksimum karena duty cycle PWM berada pada nilai tertinggi.
Setelah kipas menyala, sistem tidak mempertahankan kecepatan tetap, tetapi menurunkan kecepatan putaran kipas secara linear terhadap waktu. Penurunan ini dilakukan dengan secara bertahap mengurangi duty cycle PWM berdasarkan waktu yang dihitung sejak kipas mulai aktif. Semakin bertambah waktu, duty cycle semakin kecil sehingga putaran motor kipas juga menurun secara perlahan dan teratur hingga akhirnya mencapai nol, yang berarti kipas berhenti sepenuhnya. Karakteristik penurunan linear ini menghasilkan perubahan kecepatan yang halus (ramp-down), bukan perubahan mendadak.
Secara keseluruhan, sistem bekerja sebagai kontrol otomatis berbasis suhu dan waktu, di mana suhu 30°C berfungsi sebagai pemicu awal aktivasi kipas, sedangkan mekanisme PWM digunakan untuk mengatur penurunan kecepatan kipas secara bertahap sampai mati. Prinsip ini mensimulasikan sistem pendinginan otomatis yang responsif terhadap suhu namun memiliki fitur perlambatan kecepatan terkontrol, sesuai kondisi yang diminta pada percobaan.
4. Flowchart dan Listing Program [Kembali]
#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);
void Error_Handler(void);
/*=============================
VARIABLE
=============================*/
uint32_t adcValue;
float voltage;
float temperature;
uint8_t fan_active = 0;
uint32_t startTime = 0;
#define TEMP_TRIGGER 30.0
#define FAN_DECAY_TIME 10000 //10 detik (ms)
#define PWM_MAX 65535
/*=============================
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 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;
/* Trigger kipas saat 30 derajat */
if(temperature >= TEMP_TRIGGER && fan_active==0)
{
fan_active = 1;
startTime = HAL_GetTick();
HAL_GPIO_WritePin(
GPIOA,
GPIO_PIN_2,
GPIO_PIN_SET
);
}
/* Penurunan kecepatan linear terhadap waktu */
if(fan_active)
{
uint32_t elapsed;
float duty;
elapsed = HAL_GetTick()-startTime;
if(elapsed < FAN_DECAY_TIME)
{
duty = 1.0 -
((float)elapsed/FAN_DECAY_TIME);
__HAL_TIM_SET_COMPARE(
&htim1,
TIM_CHANNEL_1,
duty*PWM_MAX
);
}
else
{
/* Fan stop */
__HAL_TIM_SET_COMPARE(
&htim1,
TIM_CHANNEL_1,
0
);
HAL_GPIO_WritePin(
GPIOA,
GPIO_PIN_2,
GPIO_PIN_RESET
);
fan_active=0;
}
}
HAL_Delay(100);
}
}
/*=============================
CLOCK CONFIG
=============================*/
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
);
}
/*=============================
TIMER 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();
GPIO_InitStruct.Pin=
GPIO_PIN_2;
GPIO_InitStruct.Mode=
GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed=
GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(
GPIOA,
&GPIO_InitStruct
);
}
/*=============================
ERROR
=============================*/
void Error_Handler(void)
{
__disable_irq();
while(1)
{
}
}
Percobaan 3 Kondisi 2
Buatlah rangkaian seperti percobaan 3 dengan kondisi ketika sensor LM35 mendeteksi suhu 30 maka kipas menyala dengan kecepatan yang berubah dan kecepatan kipas menurun secara linear sampai 0 terhadap waktu.
Download Rangkaian Simulasi dan Program (klik disini)
Download Video Simulasi (klik disini)
Download HTML (klik disini)
Download Datasheet IR Sensor (klik disini)
Download Datasheet Touch Sensor (klik disini)
Download Datasheet STM32F103C8 (klik disini)
Download Datasheet Resistor (klik disini)
Download Datasheet LED (klik disini)
Download Datasheet Buzzer (klik disini)
Tidak ada komentar:
Posting Komentar