Tugas Pendahuluan 2




Tugas Pendahuluan 2 Modul 2
(Percobaan 3 Kondisi 2)

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:




Rangkaian Simulasi Setelah dirunning:
 



Prinsip Kerja :

Setelah itu lakukan konfigurasi di software STM32 CubeIDE, dimana disini pin out dan konfigurasi dari mikrokontrolernya disesuaikan dengan rangkaian yang telah dibuat di proteus. Selanjutnya dilakukan konfigurasi pada debug dengan memilih serial wire, kemudian pada bagian RCC dipilih crystal / ceramic resonator. Ketika konfigurasinya telah selesai, save project dan kemudian akan ditampilkan halaman pemrograman. Disini sudah langsung tersedia beberapa program karena konfigurasi yang telah dilakukan sebelumnya. Untuk pemrogramannya dimulai dari #include “main.h” yang merupakan fungsi utamanya. Program ini menggunakan HAL Library untuk membaca nilai dari potensiometer melalui ADC, mengendalikan kecepatan motor DC menggunakan PWM pada Timer 1, serta mengontrol buzzer menggunakan PWM pada Timer 2. Program dimulai dengan inisialisasi sistem dan konfigurasi clock, GPIO, ADC1, dan dua timer PWM (TIM1 dan TIM2). Timer 1 digunakan untuk menghasilkan sinyal PWM pada kanal 1 (TIM_CHANNEL_1) untuk mengatur kecepatan motor, sedangkan Timer 2 kanal 3 (TIM_CHANNEL_3) digunakan untuk menghasilkan frekuensi PWM untuk buzzer.

Di dalam loop utama (while(1)), program membaca nilai analog dari potensiometer melalui ADC. Berdasarkan nilai ADC tersebut, motor dikontrol menggunakan perbandingan PWM. Jika nilai potensiometer di bawah 1500, maka motor berjalan lambat dengan duty cycle 30%. Jika nilai ADC melebihi 3000, maka motor berjalan cepat dengan duty cycle 80%. Untuk nilai di antara 1500 dan 3000, motor dijalankan pada kecepatan sedang (sekitar 45%). Buzzer hanya berbunyi jika nilai ADC di bawah 1500. Dalam kondisi ini, buzzer diberi sinyal PWM dengan frekuensi tinggi (periode 18000 = sekitar 4 kHz) dan duty cycle 50% agar terdengar stabil. Jika nilai ADC tidak memenuhi kondisi tersebut, maka buzzer dimatikan dengan mengatur PWM compare value ke nol. Setelah programnya selesai, dilanjutkan dengan mengcompile programnya ke dalam tipe hex, dan build program tersebut sehingga menghasilkan file dengan tipe hex. Kemudian upload file hex tersebut ke dalam mikrokontroler pada proteus.

Prinsip kerja rangkaian ini adalah membaca nilai analog dari potensiometer, lalu memprosesnya untuk mengatur kinerja motor dan buzzer berdasarkan ambang batas yang telah ditentukan. Ketika nilai ADC dari potensiometer kurang dari 1500, mikrokontroler akan mengatur motor DC berputar dengan duty cycle 30%, menghasilkan kecepatan rendah. Pada saat yang sama, buzzer akan diaktifkan dengan frekuensi tinggi untuk menandakan bahwa nilai berada di bawah ambang. Sebaliknya, ketika nilai potensiometer melebihi 3000, mikrokontroler akan mengatur motor berputar dengan duty cycle 80%, menghasilkan kecepatan tinggi, dan buzzer akan dimatikan. Pada kondisi nilai potensiometer berada di antara 1500–3000, sistem dapat diprogram untuk mempertahankan status sebelumnya atau membuat logika tambahan. Semua pengendalian dilakukan melalui sinyal PWM yang dikirim ke basis transistor (untuk motor) dan ke buzzer, sehingga komponen output bekerja sesuai kondisi 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, 19660); // Lambat duty cycle 30%

}

else if (adc_val > THRESH_MID)

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 52428); // Cepat duty cycle 80%

}

else

{

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

}


// --- Buzzer Logic ---

if (adc_val < THRESH_LOW && buzzer_enabled)

{

// Buzzer ON dengan frekuensi tinggi tetap (contoh: 4 kHz)

uint32_t period = 18000; // Untuk frekuensi sekitar 4 kHz

__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_RESET)

{

buzzer_enabled = 1;

__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 2
Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1500 maka motor DC berputar dengan duty cycle 30% dan buzzer berbunyi dengan frekuensi tinggi; jika nilai di atas threshold 3000 maka motor DC berputar dengan duty cycle 80% dan buzzer mati.

6. Video Simulasi [Kembali]

7. Download File [Kembali]

Download HTML [Download]
Download File Rangkaian [Download]
Download Video Simulasi [Download]
Download Listing Program [Download]
Download Datasheet Mikrokontroler STM32F103C8 [Download]
Download Datasheet Sensor LDR [Download]
Download Datasheet Dioda [Download]
Download Datasheet Resistor [Download]
Download Datasheet Buzzer [Download]
Download Datasheet Transistor [Download]
Download Datasheet Motor DC [Download]
Download Datasheet Push Button [Download]
 

Tidak ada komentar:

Posting Komentar

   BAHAN PRESENTASI UNTUK MATA KULIAH  MIKROPROSESOR DAN MIKROKONTROLER 2024 Nama   : Ichsan Aditia NIM : 221095 3 007 Dosen Pengamp...

Cari Blog Ini