TP 2 : P8 K1





1. Prosedur [kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.

2. Tulis program untuk IC STM32 di software STM32IDE.

3. Compile program tadi, lalu upload file dengan format .hex ke dalam development board STM32.

4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.


2. Hardware dan Diagram Blok [kembali]
a. Hardware
1. STM32F103C8
Fungsi utama STM32 adalah sebagai pengontrol sistem, mampu melakukan pemrosesan data dan menjalankan instruksi untuk berbagai aplikasi, mulai dari perangkat sederhana hingga sistem yang kompleks. 

2. Potensiometer

Potensiometer adalah resistor tiga terminal dengan sambungan geser yang membentuk pembagi tegangan dapat disetel.


3. Motor DC

Fungsi utama motor DC (direct current) adalah mengubah energi listrik menjadi energi mekanik. Motor DC digunakan dalam berbagai aplikasi, mulai dari perangkat elektronik kecil hingga mesin industri yang besar. 

4. Motor Stepper

Motor stepper memiliki fungsi utama untuk mengubah pulsa listrik menjadi gerakan mekanis yang presisi, yaitu gerakan diskrit atau langkah-langkah. Gerakan ini memungkinkan kontrol posisi dan kecepatan yang akurat tanpa sensor umpan balik.

5. ULN2003A
ULN2003 adalah IC driver yang berfungsi untuk mengendalikan beban induktif seperti motor stepper, solenoid, dan relai dari mikrokontroler atau rangkaian logika lainnya. IC ini dapat digunakan untuk menggerakkan perangkat berarus tinggi atau bertegangan tinggi yang tidak dapat ditoleransi oleh mikrokontroler. 

6. Touch Sensor
Fungsi utama sensor sentuh (touch sensor) adalah untuk mendeteksi sentuhan atau tekanan pada sebuah permukaan dan merespons dengan sinyal listrik atau tindakan tertentu.

b. Diagram Blok


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Prinsip Kerja:

Pada eksperimen ini, sistem mengandalkan dua sumber input: input digital dari sensor sentuh dan input analog dari potensiometer. Sensor sentuh berfungsi sebagai saklar digital yang terhubung ke pin PB0 dari mikrokontroler STM32F103C8. Ketika disentuh, sensor ini menghasilkan sinyal logika HIGH (3.3V), dan jika tidak disentuh akan menghasilkan logika LOW (0V). Status sensor dibaca menggunakan fungsi HAL_GPIO_ReadPin(). Apabila sentuhan terdeteksi (HIGH), motor DC diaktifkan dengan mengirimkan logika HIGH ke pin PB7 yang mengendalikan driver motor ULN2003A. Pada saat yang sama, motor stepper dinonaktifkan dengan menyetel semua pin kontrolnya (IN1–IN4) ke kondisi LOW.

Sebaliknya, jika tidak ada sentuhan yang terdeteksi (LOW), sinyal LOW dikirim ke PB7 sehingga motor DC berhenti berputar. Setelah itu, sistem membaca nilai analog dari potensiometer yang tersambung ke pin PA0. Tegangan yang dihasilkan potensiometer (0–3.3V) dikonversi menjadi nilai digital 0–4095 menggunakan ADC internal STM32. Pembacaan ADC diawali dengan perintah HAL_ADC_Start() dan hasil konversi diambil menggunakan HAL_ADC_GetValue(). Nilai ini kemudian dibandingkan dengan angka 2048: jika lebih besar atau sama dengan 2048, motor stepper berputar searah jarum jam (clockwise) menggunakan urutan aktivasi STEP_SEQ_CW; jika lebih kecil, motor stepper berputar berlawanan arah jarum jam (counter-clockwise) menggunakan STEP_SEQ_CCW.

Motor stepper dikontrol melalui empat pin output yaitu PB8, PB9, PB10, dan PB11. Aktivasi pin dilakukan secara bergantian mengikuti pola tertentu melalui fungsi RunStepperSmooth(), dengan jeda antar langkah sebesar 5 ms untuk menghasilkan pergerakan yang lebih mulus. Setiap langkah menyalakan kombinasi pin sesuai tabel urutan langkah yang sudah ditentukan, lalu dilanjutkan ke langkah berikutnya setelah delay kecil.

Keseluruhan logika sistem sederhana: saat sensor sentuh aktif, motor DC berputar dan motor stepper berhenti; sedangkan saat sensor tidak aktif, motor DC mati dan motor stepper bergerak sesuai arah yang ditentukan oleh nilai potensiometer. Sistem ini mengandalkan penggunaan GPIO dan ADC pada STM32F103C8, dengan pengembangan program berbasis HAL Library untuk memudahkan akses ke perangkat keras mikrokontroler.

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

b. Listing Program


#include "stm32f1xx_hal.h"

// Konfigurasi Hardware
#define STEPPER_PORT GPIOB
#define IN1_PIN GPIO_PIN_8
#define IN2_PIN GPIO_PIN_9
#define IN3_PIN GPIO_PIN_10
#define IN4_PIN GPIO_PIN_11

#define TOUCH_SENSOR_PORT GPIOB
#define TOUCH_SENSOR_PIN GPIO_PIN_0

#define MOTOR_DC_PORT GPIOB
#define MOTOR_DC_PIN GPIO_PIN_7

// Mode Stepper
const uint8_t STEP_SEQ_CW[4] = {
    (1<<0), // IN1
    (1<<1), // IN2
    (1<<2), // IN3
    (1<<3)  // IN4
};
const uint8_t STEP_SEQ_CCW[4] = {
    (1<<0), // IN1
    (1<<3), // IN4
    (1<<2), // IN3
    (1<<1)  // IN2
};


ADC_HandleTypeDef hadc1;

// Function Prototypes
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void RunStepperSmooth(const uint8_t *sequence, uint8_t speed);
void Error_Handler(void);

// Global Variables
uint8_t step_index = 0;
uint32_t last_step_time = 0;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();

    while (1)
    {
        GPIO_PinState touchState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);

        if (touchState == GPIO_PIN_SET)
        {
            // Jika sensor disentuh
            HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); // Motor DC ON
            HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET); // Stepper OFF
        }
        else
        {
            // Jika sensor tidak disentuh
            HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); // Motor DC OFF

            // Baca ADC
            HAL_ADC_Start(&hadc1);
            if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
            {
                uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

                if (adc_val >= 2048)
                {
                    RunStepperSmooth(STEP_SEQ_CW, 5); // Bergerak searah jarum jam
                }
                else
                {
                    RunStepperSmooth(STEP_SEQ_CCW, 5); // Bergerak berlawanan jarum jam
                }
            }
            HAL_ADC_Stop(&hadc1);
        }

        HAL_Delay(1); // Delay kecil untuk stabilisasi
    }
}

void RunStepperSmooth(const uint8_t *sequence, uint8_t speed)
{
    if (HAL_GetTick() - last_step_time >= speed)
    {
        HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step_index] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step_index] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step_index] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step_index] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET);

        step_index = (step_index + 1) % 4;
        last_step_time = HAL_GetTick();
    }
}

void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE(); // Untuk PA0 ADC

    __HAL_AFIO_REMAP_SWJ_NOJTAG(); // Optional: Membebaskan pin JTAG

    // Touch Sensor sebagai input
    GPIO_InitStruct.Pin = TOUCH_SENSOR_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(TOUCH_SENSOR_PORT, &GPIO_InitStruct);

    // Motor DC Output
    GPIO_InitStruct.Pin = MOTOR_DC_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(MOTOR_DC_PORT, &GPIO_InitStruct);

    // Stepper Motor Output
    GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);
}

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; // PA0
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    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();
    }
}

void Error_Handler(void)
{
    while (1)
    {
        // Loop error di sini
    }
}


5. Video Demo [kembali]


6. Kondisi [kembali]
Percobaan 8 Kondisi 1

 Buatlah rangkaian seperti gambar pada percobaan 8. Jika touch sensor mendeteksi maka motor dc berputar. Jika potensiometer bernilai besar maka motor stepper bergerak searah jarum jam dan jika bernilai rendah maka motor stepper bergerak berlawanan jarum jam.


7. Video Simulasi [kembali]

8. Download file [kembali]
Download Video Simulasi klik disini
Download rangkaian proteus klik disini
Download program.hex klik disini
Download Datashett STM32 klik disini
Download Datasheet Touch sensor klik disini
Download Datasheet Motor stepper klik disini
Download Datasheet  Motor DC klik disini
Download Datasheet Resistor variabel klik disini
Download Datasheet ULN2003A klik disini


Komentar

Postingan populer dari blog ini