제우스전자
게시판

  • 상담안내
    고객님께 만족도 높은 서비스를 위해 항상 친절하게 답변해 드리겠습니다.
    H. 010-7183-6976
    F. 054-972-7790
    E.master@zeus-elec.com
    평 일 : 08:30 ~ 17:30
공지사항

NUCLEO-F103RB

페이지 정보

작성자 최고관리자 작성일25-03-01 19:08 조회80회 댓글0건

본문

#include "stm32f1xx_hal.h"
#include <stdio.h>

UART_HandleTypeDef huart2;
TIM_HandleTypeDef htim1;

// PID 제어 변수
double setpoint = 90.0, input = 90.0, output;
double Kp = 2.0, Ki = 0.5, Kd = 0.1;
double previous_error = 0, integral = 0;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM1_Init(void);
void writeServo(int angle);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();
    MX_TIM1_Init();
   
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
   
    char msg[50];
    while (1) {
        // PID 제어 연산
        double error = setpoint - input;
        integral += error;
        double derivative = error - previous_error;
        output = (Kp * error) + (Ki * integral) + (Kd * derivative);
        previous_error = error;
       
        double newPosition = input + output;
        if (newPosition < 0) newPosition = 0;
        if (newPosition > 180) newPosition = 180;
        writeServo((int)newPosition);
        input = newPosition; // 현재 각도 갱신
       
        sprintf(msg, "Target: %.1f | Current: %.1f | Output: %.1f\r\n", setpoint, input, output);
        HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
       
        HAL_Delay(20);
    }
}

void writeServo(int angle) {
    uint32_t pulseWidth = (angle * 2000 / 180) + 500; // 500~2500us
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulseWidth);
}

// HAL 설정 함수들 (클럭, GPIO, USART, TIM 초기화)
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

등록된 댓글이 없습니다.