LA PERCOBAAN 8 MODUL 2
LA 2
1. Rangkaian perangkat hardware berdasarkan dengan rangkaian pada modul
2. Konfigurasi Kodingan pada Thonny IDE
2. Hardware dan Diagram Blok [Kembali]
Hardware :
a) STM32F103C8
STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain. Adapun spesifikasi dari STM32F4 yang digunakan dalam praktikum ini adalah sebagai berikut:
Parameter | Spesifikasi |
---|
Mikrokontroler : | STM32F103C8T6 |
Arsitektur : | ARM Cortex-M3 |
Frekuensi Clock Maksimum : | 72 MHz |
Memori Flash : | 64 KB (beberapa varian memiliki 128 KB) |
SRAM | : 20 KB |
Voltase Operasi : | 2.0V – 3.6V |
Jumlah Pin I/O Digital | : Hingga 37 pin |
Timer | : 3 × 16-bit Timer, 1 × 16-bit Advanced Timer |
ADC (Analog to Digital Converter) | : 2 unit, 12-bit, hingga 16 channel |
DAC (Digital to Analog Converter) : | Tidak tersedia |
USART/UART : | 3 (USART1, USART2, USART3) |
SPI | : 2 buah |
I2C | : 2 buah |
PWM Output : | Ya (melalui Timer) |
USB | : USB 2.0 Full Speed (Device only) |
Debug Interface | : SWD (Serial Wire Debug) |
DMA Controller : | 7 Channel DMA |
Package : | LQFP-48 |
Diagram Blok :
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
Prinsip Kerja :
Sistem ini dirancang untuk mengendalikan motor stepper dan motor DC menggunakan mikrokontroler STM32F1 yang terintegrasi dengan sensor sentuh dan pembacaan nilai analog melalui ADC. Saat sistem dinyalakan, semua komponen seperti GPIO dan ADC diinisialisasi terlebih dahulu. Sensor sentuh berperan sebagai saklar utama untuk mengaktifkan atau menonaktifkan motor DC, sementara motor stepper dikendalikan berdasarkan nilai tegangan analog yang dibaca dari ADC channel 0. Dalam kondisi normal saat sensor sentuh tidak ditekan, sistem membaca nilai ADC secara terus-menerus; jika nilainya kurang dari 2048, motor stepper akan berputar searah jarum jam (clockwise), dan jika nilainya lebih besar atau sama dengan 2048, motor akan berputar berlawanan arah jarum jam (counter-clockwise). Sebaliknya, saat sensor sentuh ditekan, interrupt akan dijalankan dan sistem akan mengaktifkan motor DC serta mematikan motor stepper dengan mematikan semua pin kontrolnya. Ketika sensor dilepas, motor DC kembali mati dan kontrol motor stepper akan dilanjutkan oleh loop utama berdasarkan nilai ADC yang terbaca. Sistem ini bekerja secara otomatis dan bergantian antara dua motor tergantung pada status sensor sentuh dan input analog yang diterima.
4. Flowchart dan Listing Program [Kembali]
Flowchart :
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 Stepperconst 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<<3), // IN4 (1<<2), // IN3 (1<<1), // IN2(1<<0) // IN1 };ADC_HandleTypeDef hadc1;uint8_t current_mode = 0; // 0=CW, 1=CCW volatile uint8_t touch_state = 0;void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_ADC1_Init(void);void RunStepper(const uint8_t *sequence, uint8_t speed); void Error_Handler(void);int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init();while (1) {// Saat tidak disentuh, jalankan stepper seperti biasaif (HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN) == GPIO_PIN_RESET) { |
HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {uint16_t adc_val = HAL_ADC_GetValue(&hadc1);current_mode = (adc_val < 2048) ? 0 : 1; // 0 = CW, 1 = CCW }if (current_mode == 0) { RunStepper(STEP_SEQ_CW, 5);} else { RunStepper(STEP_SEQ_CCW, 5);} }HAL_Delay(1); }}void RunStepper(const uint8_t *sequence, uint8_t speed) { static uint8_t step = 0;HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET);HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET);HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET);HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET);step = (step + 1) % 4; HAL_Delay(speed);}void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; |
__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_AFIO_REMAP_SWJ_NOJTAG(); // Optional: disable JTAG to free PB3-PB4 if needed// Konfigurasi Touch Sensor sebagai input dengan EXTI (interrupt) GPIO_InitStruct.Pin = TOUCH_SENSOR_PIN; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(TOUCH_SENSOR_PORT, &GPIO_InitStruct);// Aktifkan NVIC untuk EXTI0 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);// Konfigurasi Motor DC (PB7) 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);// Konfigurasi Stepper Motor (PB8-PB11)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.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_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 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == TOUCH_SENSOR_PIN) {GPIO_PinState pinState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);if (pinState == GPIO_PIN_SET) {// Touch sensor ditekan - nyalakan motor DC, matikan stepper HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN|IN2_PIN|IN3_PIN|IN4_PIN, GPIO_PIN_RESET); } else {// Touch sensor dilepas - matikan motor DC HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); }} }// IRQ Handler untuk EXTI0 void EXTI0_IRQHandler(void) {HAL_GPIO_EXTI_IRQHandler(TOUCH_SENSOR_PIN); }void Error_Handler(void) { while(1) {}} |
5. Analisa[Kembali]
6. Video Demo[Kembali]
7. Download File [Kembali]
File Analisa [Download]
Raspberry Pi Pico [Download]
Datasheet LED [Download]
Datasheet Resistor [Download]
Komentar
Posting Komentar