Tugas Pendahuluan Modul 2 (Percobaan 3 Kondisi 1)




Tugas Pendahuluan 2 Modul 2
(Percobaan 3 Kondisi 1)

1. Prosedur
[Kembali]
1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
5. Selesai.

2. Hardware dan Diagram Blok [Kembali]

Hardware :

1. Mikrokontroler STM32F103C8
STM32F103C8 board – Microscale

2. Sensor LDR


3. Resistor


4. Transistor NPN

5. Buzzer
Buzzer
6. Push Button

push button 4 kaki di Sabara Mikro | Tokopedia

7. Dioda


8. Motor DC (Dinamo DC)

Diagram Blok  :



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi Sebelum dirunning:

Prinsip Kerja : 
    Rangkaian ini menggunakan mikrokontroler STM32F103C8T6 sebagai pengendali utama, dengan potensiometer sebagai input dan motor DC serta buzzer sebagai output. Potensiometer terhubung ke pin ADC mikrokontroler, yaitu pin PA0-WKUP, yang berfungsi membaca tegangan analog sebagai representasi posisi potensiometer. Motor DC dikendalikan melalui transistor BD139 (Q1) yang berperan sebagai saklar elektronik. Basis transistor dihubungkan ke pin PA8 mikrokontroler melalui resistor 2,2 kΩ (R1) untuk mengatur sinyal PWM. Motor mendapatkan suplai 5V langsung, dan transistor mengendalikan jalur ground motor. Dioda D1 berfungsi sebagai freewheeling diode untuk melindungi transistor dari lonjakan tegangan balik saat motor dimatikan. Sedangkan buzzer terhubung langsung ke pin PA2 mikrokontroler untuk menerima sinyal PWM atau sinyal digital.

Selanjutnya, konfigurasi dilakukan di software STM32 CubeIDE, di mana pin dan pengaturan mikrokontroler disesuaikan dengan rangkaian di Proteus. Pengaturan debug menggunakan serial wire, dan pada bagian RCC dipilih crystal atau ceramic resonator. Setelah konfigurasi selesai, proyek disimpan dan halaman pemrograman muncul. Program menggunakan HAL Library untuk membaca nilai potensiometer melalui ADC, mengatur kecepatan motor DC dengan PWM pada Timer 1, serta mengendalikan buzzer dengan PWM pada Timer 2. Sistem memulai dengan inisialisasi clock, GPIO, ADC1, dan dua timer PWM (TIM1 dan TIM2). Timer 1 menghasilkan sinyal PWM pada kanal 1 untuk mengatur kecepatan motor, sementara Timer 2 kanal 3 menghasilkan sinyal PWM untuk buzzer.

Dalam loop utama (while(1)), program membaca nilai analog dari potensiometer lewat ADC. Berdasarkan nilai tersebut, motor dikendalikan dengan perbandingan PWM. Jika nilai ADC kurang dari 1500, motor berjalan lambat dengan duty cycle 10%. Jika nilai lebih dari 3000, motor berjalan cepat dengan duty cycle 90%. Untuk nilai antara 1500 hingga 3000, motor berjalan dengan kecepatan sedang sekitar 45%.

Buzzer hanya aktif saat nilai ADC di bawah 1500, dengan sinyal PWM frekuensi rendah (periode sekitar 144000, setara 500 Hz) dan duty cycle 50% agar suaranya stabil. Jika nilai ADC tidak memenuhi kondisi ini, buzzer dimatikan dengan mengatur nilai PWM menjadi nol. Setelah program selesai, kode dikompilasi menjadi file hex dan diunggah ke mikrokontroler di Proteus.

Prinsip kerja rangkaian ini adalah membaca nilai analog dari potensiometer, kemudian mengolahnya untuk mengatur motor dan buzzer sesuai ambang batas yang telah ditentukan. Ketika nilai ADC kurang dari 1500, motor berputar dengan duty cycle 10% menghasilkan kecepatan rendah, dan buzzer menyala dengan frekuensi rendah sebagai tanda. Saat nilai ADC melebihi 3000, motor berputar dengan duty cycle 90% menghasilkan kecepatan tinggi, dan buzzer dimatikan. Untuk nilai antara 1500 sampai 3000, sistem dapat diprogram untuk mempertahankan kondisi sebelumnya atau menambahkan logika lain. Semua pengendalian output dilakukan melalui sinyal PWM yang dikirim ke basis transistor (motor) dan ke buzzer, sehingga komponen bekerja sesuai dengan nilai input analog yang terbaca.


4. Flowchart dan Listing Program [Kembali]

Flowchart :

Listing Program :

#include "main.h"


ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim1;

TIM_HandleTypeDef htim2;


void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_TIM1_Init(void);

static void MX_TIM2_Init(void);


int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();

MX_TIM1_Init();

MX_TIM2_Init();


HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // Motor PWM

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); // Buzzer PWM

HAL_ADC_Start(&hadc1);


uint8_t buzzer_enabled = 1;

uint32_t last_buzzer_change = 0;

uint8_t buzzer_freq_index = 0;


const uint32_t buzzer_periods[] = {143999, 71999, 47999}; // Frekuensi berbeda


// Threshold (dari rendahsedangtinggi)

const uint16_t THRESH_LOW = 1500;

const uint16_t THRESH_MID = 3000;


while (1)

{

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 10);

uint32_t adc_val = HAL_ADC_GetValue(&hadc1);


// --- Motor Control ---

if (adc_val < THRESH_LOW)

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 6553); // Lambat duty cycle 10%

}

else if (adc_val > THRESH_MID)

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 58981); // Cepat duty cycle 90%

}

else

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 30000); // Sedang

}


// --- Buzzer Logic ---

if (adc_val < THRESH_LOW && buzzer_enabled)

{

// Buzzer ON dengan frekuensi rendah tetap (contoh: 500 Hz)

uint32_t period = 144000; // Untuk frekuensi sekitar 500 Hz

__HAL_TIM_SET_AUTORELOAD(&htim2, period);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, period / 2); // 50% duty cycle

}

else

{

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Matikan buzzer

}


// --- Button Logic (PB0 ditekan = nonaktifkan buzzer) ---

if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET)

{

buzzer_enabled = 0;

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0); // Paksa matikan buzzer

}


HAL_Delay(10);

}

}



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;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}


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;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

{

Error_Handler();

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Error_Handler();

}

}


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;

if (HAL_ADC_Init(&hadc1) != HAL_OK)

{

Error_Handler();

}


sConfig.Channel = ADC_CHANNEL_0;

sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

{

Error_Handler();

}


}


static void MX_TIM1_Init(void)

{


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};

TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};


htim1.Instance = TIM1;

htim1.Init.Prescaler = 0;

htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

htim1.Init.Period = 65535;

htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim1.Init.RepetitionCounter = 0;

htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

{

Error_Handler();

}

sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;

sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;

sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;

sBreakDeadTimeConfig.DeadTime = 0;

sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;

sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;

if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

{

Error_Handler();

}


HAL_TIM_MspPostInit(&htim1);


}


static void MX_TIM2_Init(void)

{


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};



htim2.Instance = TIM2;

htim2.Init.Prescaler = 0;

htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

htim2.Init.Period = 65535;

htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)

{

Error_Handler();

}


HAL_TIM_MspPostInit(&htim2);


}


static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/*Configure GPIO pin : PB0 */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


}


void Error_Handler(void)

{


__disable_irq();

while (1)

{

}


}


#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{


}

#endif /* USE_FULL_ASSERT */



5. Kondisi [Kembali]
Percobaan 3 Kondisi 1
Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1500 maka motor DC berputar dengan duty cycle 10% dan buzzer berbunyi dengan frekuensi rendah; jika nilai di atas threshold 3000 maka motor DC berputar dengan duty cycle 90% dan buzzer mati.

6. Video Simulasi [Kembali]


7. Download File [Kembali]
File Rangkaian [Download]
Video Simulasi [Download]
Datasheet Mikrokontroler STM32F103C8 [Download]
Datasheet Sensor LDR [Download]
Datasheet Dioda [Download]
Datasheet Resistor [Download]
Datasheet Buzzer [Download]
Datasheet Transistor [Download]
Datasheet Motor DC [Download]
Datasheet Push Button [Download]
 

Komentar

Postingan populer dari blog ini

Modul 1: Gerbang Logika Dasar, Monostable Multivibrator, & Flip flop

Tugas Besar

Tugas Pendahuluan Modul 2 (Percobaan 1 Kondisi 21)