Kamis, 08 Mei 2025

Laporan Akhir Modul 2 Percobaan 1 Praktikum Mikroprosesor dan Mikrokontroler






1. Prosedur [kembali]

    Langkah-langkah percobaan :

a. Tentukan percobaan dan kondisi yang akan dilakukan (Kondisi 6)

b. Siapakan alat dan bahan yang akan digunakan

c. Rangkai Rangkaian pada Board sesuai gambar percobaan 7 dengan komponen 1 input soil moisture capasitive, push button, STM32F103C8, 3 Resistor 220 Ohm, 1 Motor DC dam 1 Buzzer  hubungkan menggunakan jumper. 

d. Buatlah program  pada software STM32Cube IDE dengan konfigurasi Pin Input dan Output berdasarkan pada Pin GPIO STM32 yang telah dirangkai di simulasi sebelumnya.

e. Kemudian, buatlah program untuk menghasilkan Output LED-RGB dan Buzzer sesuai kondisi yang telah ditentukan.

f.  Hubungkan Laptop dengan STM32F103C8 dengan STlink 

g. Run Program, dan lihat output yang dihasilkan ketika push button ditekan



2. Hardware dan Diagram Blok [kembali]
        A. Hardware
            1. STM32F103C8



            2. Push Button



            3. LED-RGB


            4. Jumper

            5. Resistor



            6. Laptop


        B. Software
            1. STM32Cube IDE


       C. Blok Diagram



3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
           A. Rangkaian Simulasi


            B. Rangkaian Percobaan





            C. Prinsip Kerja

  1. Mulai (Start):
    Sistem dinyalakan dan mulai menjalankan proses utama.

  2. Inisialisasi Komponen:
    Semua komponen seperti sensor kelembapan tanah, push button, buzzer, dan LED RGB diatur/dikonfigurasi terlebih dahulu agar siap digunakan.

  3. Pembacaan Sensor Kelembapan:
    Sistem membaca nilai kelembapan tanah dari sensor dan mengevaluasi hasilnya ke dalam tiga kategori kondisi:

    • Tanah Normal:
      Jika nilai sensor menunjukkan bahwa kelembapan tanah berada pada tingkat normal, maka LED RGB akan menyala biru dan buzzer dalam kondisi mati.

    • Tanah Kering:
      Jika nilai kelembapan rendah (tanah kering), maka LED RGB menyala hijau sebagai tanda peringatan, dan buzzer tetap mati.

    • Tanah Basah:
      Jika nilai sensor menunjukkan tanah terlalu basah (kelembapan tinggi), maka LED RGB menyala merah dan buzzer akan aktif (berbunyi) sebagai alarm.

  4. Cek Status Push Button:
    Dalam kondisi tanah terlalu basah, buzzer berbunyi dan sistem menunggu aksi dari pengguna. Di sini, sistem akan memeriksa apakah push button ditekan atau tidak:

    • Jika Ditekan:
      Tombol dianggap sebagai respon pengguna untuk menghentikan alarm, maka buzzer akan dimatikan.

    • Jika Tidak Ditekan:
      Maka buzzer tetap aktif, artinya sistem masih memberikan peringatan karena belum ada respon dari pengguna.

  5. Selesai:
    Alur proses satu siklus selesai. Setelah ini, sistem biasanya akan mengulang pembacaan sensor secara berkala (walau tidak digambarkan eksplisit di flowchart).

  • Sensor kelembapan biasanya menghasilkan tegangan analog yang bisa dikonversi ke nilai digital dengan ADC, tergantung platform (misal: Arduino, STM32, atau Raspberry Pi Pico).

  • LED RGB dikontrol untuk menghasilkan warna berbeda dengan mengatur level PWM pada masing-masing channel (merah, hijau, biru).

  • Push button perlu diprogram agar dapat mendeteksi status tekan (biasanya menggunakan interrupt atau polling).

  • Buzzer dapat berupa buzzer aktif (langsung nyala saat diberi tegangan) atau buzzer pasif (butuh sinyal PWM untuk menghasilkan suara).

    
        

4. Flowchart dan Listing Program [kembali]
        A. Flowchart




        B. Listing Program  

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim2;

uint8_t sound_pattern = 0;

#define LED_RED_PIN GPIO_PIN_12

#define LED_GREEN_PIN GPIO_PIN_13

#define LED_BLUE_PIN GPIO_PIN_14

#define LED_PORT GPIOB

#define BUTTON_PIN GPIO_PIN_0

#define BUTTON_PORT GPIOB

#define BUZZER_PIN GPIO_PIN_2

#define ADC_THRESH_HIGH 3000

#define ADC_THRESH_MID 1500

const uint32_t pwm_periods[] = {1000, 50000, 719999};

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_TIM2_Init(void);

void update_leds_and_buzzer(uint32_t adc_val, uint8_t btn_state);

void change_sound_pattern(void);

void Error_Handler(void);

int main(void) {

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();

MX_TIM2_Init();

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);

HAL_ADC_Start(&hadc1);

while (1) {

static uint32_t last_adc_tick = 0;

static uint32_t last_sound_change = 0;

uint8_t button_state = HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);

if (HAL_GetTick() - last_adc_tick > 200) {

last_adc_tick = HAL_GetTick();

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {

update_leds_and_buzzer(HAL_ADC_GetValue(&hadc1), button_state);

}

}

if (button_state == GPIO_PIN_RESET && (HAL_ADC_GetValue(&hadc1) <

ADC_THRESH_MID)) {

if (HAL_GetTick() - last_sound_change > 1000) {

last_sound_change = HAL_GetTick();

change_sound_pattern();

}

}

HAL_Delay(10);

}

}

void update_leds_and_buzzer(uint32_t adc_val, uint8_t btn_state) {

HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_GREEN_PIN |

LED_BLUE_PIN, GPIO_PIN_RESET);

if (adc_val >= ADC_THRESH_HIGH) {

HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);

}

else if (adc_val >= ADC_THRESH_MID) {

HAL_GPIO_WritePin(LED_PORT, LED_BLUE_PIN, GPIO_PIN_SET);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);

}

else {

HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET);

if (btn_state == GPIO_PIN_SET) {

__HAL_TIM_SET_AUTORELOAD(&htim2, pwm_periods[sound_pattern]);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,

pwm_periods[sound_pattern] / 2);

} else {

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 0);

}

}

}

void change_sound_pattern(void) {

sound_pattern = (sound_pattern + 1) % 3;

if (HAL_ADC_GetValue(&hadc1) < ADC_THRESH_MID &&

HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_SET) {

__HAL_TIM_SET_AUTORELOAD(&htim2, pwm_periods[sound_pattern]);

__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,

pwm_periods[sound_pattern] / 2);

}

}

void SystemClock_Config(void) {

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

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_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

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

Error_Handler();

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;

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_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_IC_MspInit(&htim2);

}

static void MX_GPIO_Init(void) {

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

GPIO_InitStruct.Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

GPIO_InitStruct.Pin = BUTTON_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLUP;

HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);

}

void Error_Handler(void) {

__disable_irq();

while (1) {}

}


    

5. Analisa [kembali]
       








6. Video Demo [kembali]



7. Download file [kembali]

Rabu, 07 Mei 2025

Tugas Pendahuluan Modul 2 Up & Uc Percobaan 2






1. Prosedur [kembali]
    Langkah-langkah percobaan :

        1. Siapkan alat dan bahan yaitu dengan komponen utama Rapsberry Pi Pico, Potensiometer, Buzzer dan Motor Servo.

        2. Rangkai sesuai gambar percobaan

        3. Rancang kerja rangkaian sesuai flowchat

        4. Tekan tombol “Play” untuk menjalankan simulasi



2. Hardware dan Diagram Blok [kembali]
        A. Hardware
            1. Rapsberyy Pi Pico



            2. Potensiometer






            3. Motor Servo





            4. Buzzer




                      B. Blok Diagram


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


    Pada rangkaian terdiri dari rapsberry pi pico, Potensiometer, Buzzer dan Motor servo. Prinsip kerjanya ketika potensiometer digeser maka akan memengaruhi buzzer apakah aktif atau tidak, sesuai kondisi diantara sudut 0 derajat hingga 180 derajat, maka buzzer akan aktif . Sementara pada motor servo akan memengaruhi pergeseran motor berdasarkan tingkat sudut bergesernya potensiometernya, pada kondisi yang digunakan maka servo akan bergeser dan bergerak berlawanan arah jarum jam ketika potensiometer kita gerakan searah jarum jam.

4. Flowchart dan Listing Program [kembali]
        A. Flowchart


        B. Listing Program  

from machine import Pin, PWM, ADC
from time import sleep
import utime

# Inisialisasi
pot = ADC(26)  # GP26 = ADC0
servo = PWM(Pin(16))
buzzer = PWM(Pin(14))

# Konfigurasi PWM
servo.freq(50)  # 50 Hz untuk servo
buzzer.freq(1000)  # Set awal frekuensi buzzer

def map_value(value, in_min, in_max, out_min, out_max):
    return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

while True:
    val = pot.read_u16()  # Nilai ADC 16-bit (0 - 65535)
   
    # Membaca nilai potensiometer
    pot_value = pot.read_u16()
   
    # Karena kamu mau *berlawanan jarum jam* saat potensiometer membesar,
    # maka kita balik mappingnya: besar pot → kecil sudut
    angle = map_value(pot_value, 0, 65535, 180, 0)
   
    # Konversi sudut ke duty cycle untuk servo
    duty = map_value(angle, 0, 180, 1500, 7500)
    servo.duty_u16(duty)
   
    # Print untuk debugging
    print(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}")
   
    # === Buzzer Control ===
    if 0 < angle < 180:
        freq = int(200 + (val / 65535) * (2000 - 200))  # Mapping frekuensi
        buzzer.freq(freq)
        buzzer.duty_u16(30000)  # Buzzer berbunyi
    else:
        buzzer.duty_u16(0)  # Buzzer mati
   
    sleep(0.05)


5. Kondisi [kembali]

       - Percobaan 4 Kondisi 6

       Buatlah rangkaian seperti gambar pada percobaan 4, jika nilai pada potensiometer diperkecil maka servo bergerak berlawanan jarum jam dan jika jika sudut servo <0 ° dan >180 ° buzzer berbunyi.

6. Video Simulasi [kembali]



7. Download file [kembali]

Tugas Pendahuluan Modul 2 Up & Uc Percobaan 1






1. Prosedur [kembali]
    Langkah-langkah percobaan :


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]
        A. Hardware
            1. Mikrokontroler STM32F103C8




            2. LDR










            3. DC Motor
  





             4. Power Supply









              5. Buzzer



                 6. Push Button





          B. Blok Diagram



3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
           A. Rangkaian Simulasi

- Rangkaian sebelum dijalankan


- Rangkaian setelah dijalankan



- Prinsip kerja

        Pada rangkaian ini terdiri dari beberapa komponen yaitu LDR, DC Motor, Push Button, Buzzer dan Mikrokontroler. Dimana LDR (Light Dependent Resistor) sebagai inputan, buzzer dan motor dc sebagai ouput serta push button sebagai interrupt. Disini rangkaian telah diberikan kode program untuk mikrokontrollernya dimana telah di atur threshold untuk pengkondisian agar buzzer dapat aktif dan mati serta motor dc dapat bekerja sesuai duty cycle dari kondisi yang diinginkan. Push button bekerja sebagai interrupt untuk memberi kondisi baru di tengah kondisi yang sedang berjalan. 

4. Flowchart dan Listing Program [kembali]
        A. Flowchart






        B. Listing Program  
    

#include "main.h"


/* Private variables ---------------------------------------------------------*/

ADC_HandleTypeDef hadc1;

TIM_HandleTypeDef htim1;

TIM_HandleTypeDef htim2;


/* Private function prototypes -----------------------------------------------*/

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 rendah → sedang → tinggi)

const uint16_t THRESH_LOW = 1800;

const uint16_t THRESH_MID = 3200;


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, 32767); // Lambat

}

else if (adc_val < THRESH_MID)

{

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

}

else

{

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000); // Cepat

}


// --- Buzzer Logic ---

if (adc_val < THRESH_LOW && buzzer_enabled)

{

// Ubah frekuensi buzzer setiap 500ms

if (HAL_GetTick() - last_buzzer_change >= 500)

{

last_buzzer_change = HAL_GetTick();

buzzer_freq_index = (buzzer_freq_index + 1) % 3;


uint32_t period = buzzer_periods[buzzer_freq_index];

__HAL_TIM_SET_AUTORELOAD(&htim2, period);

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

}

}

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};


/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

*/

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();

}


/** Initializes the CPU, AHB and APB buses clocks

*/

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();

}

}


/**

* @brief ADC1 Initialization Function

* @param None

* @retval None

*/

static void MX_ADC1_Init(void)

{


/* USER CODE BEGIN ADC1_Init 0 */


/* USER CODE END ADC1_Init 0 */


ADC_ChannelConfTypeDef sConfig = {0};


/* USER CODE BEGIN ADC1_Init 1 */


/* USER CODE END ADC1_Init 1 */


/** Common config

*/

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();

}


/** Configure Regular Channel

*/

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();

}

/* USER CODE BEGIN ADC1_Init 2 */


/* USER CODE END ADC1_Init 2 */


}


/**

* @brief TIM1 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM1_Init(void)

{


/* USER CODE BEGIN TIM1_Init 0 */


/* USER CODE END TIM1_Init 0 */


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};

TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};


/* USER CODE BEGIN TIM1_Init 1 */


/* USER CODE END TIM1_Init 1 */

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();

}

/* USER CODE BEGIN TIM1_Init 2 */


/* USER CODE END TIM1_Init 2 */

HAL_TIM_MspPostInit(&htim1);


}


/**

* @brief TIM2 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM2_Init(void)

{


/* USER CODE BEGIN TIM2_Init 0 */


/* USER CODE END TIM2_Init 0 */


TIM_MasterConfigTypeDef sMasterConfig = {0};

TIM_OC_InitTypeDef sConfigOC = {0};


/* USER CODE BEGIN TIM2_Init 1 */


/* USER CODE END TIM2_Init 1 */

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();

}

/* USER CODE BEGIN TIM2_Init 2 */


/* USER CODE END TIM2_Init 2 */

HAL_TIM_MspPostInit(&htim2);


}


/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* USER CODE BEGIN MX_GPIO_Init_1 */


/* USER CODE END MX_GPIO_Init_1 */


/* GPIO Ports Clock Enable */

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


/* USER CODE BEGIN MX_GPIO_Init_2 */


/* USER CODE END MX_GPIO_Init_2 */

}


/* USER CODE BEGIN 4 */


/* USER CODE END 4 */


/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

__disable_irq();

while (1)

{

}

/* USER CODE END Error_Handler_Debug */

}


#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

           
5. Kondisi [kembali]
       
Pada tugas pendahuluan modul 1 saya mengambil percobaan 3 kondisi 4, yaitu:

    Buatlah rangkaian seperti gambar pada percobaan 3, Jika nilai potensiometer di bawah threshold 1800 maka motor DC berputar dengan duty cycle 50% dan buzzer berbunyi dengan frekuensi tinggi; jika nilai di atas threshold 3200 maka motor DC berputar dengan duty cycle 70% dan buzzer mati.

6. Video Simulasi [kembali]


7. Download file [kembali]



LAPORAN AKHIR DEMO PROJECT PRAKTIKUM Up & Uc

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Pendahuluan 2. Tujuan 3. Alat dan Komponen 4. Landasan Teori 5. Flowchart dan ...