728x90
반응형

// 타이머3로 PWM 제어

 

static void MX_TIM3_Init(void)
{
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 15; // 16MHz
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 1000-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.Pulse = 0;

  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* PWM 신호 시작 함수 */
void PWM_Start(void) {
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);  // IN1에 대한 PWM 시작
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);  // IN2에 대한 PWM 시작
}

/* 듀티 사이클 설정 함수 */
void PWM_SetDutyCycle(uint16_t duty_IN1, uint16_t duty_IN2) {
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty_IN1);  // IN1 (CH1)에 듀티 사이클 설정
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, duty_IN2);  // IN2 (CH2)에 듀티 사이클 설정
}

/* 모터 제어 함수 */
void Motor_Control(uint16_t pwm_IN1, uint16_t pwm_IN2) {
    PWM_SetDutyCycle(pwm_IN1, pwm_IN2);
}

int main(void)
{
  MX_TIM3_Init();
  PWM_Start();  // PWM 시작

  while (1)
  {
      // 시계 방향 회전: IN1에 PWM, IN2는 0
       Motor_Control(750, 0);  // IN1: 75% 듀티, IN2: 0% (시계 방향)
       HAL_Delay(2000);  // 2초 대기

       // 반시계 방향 회전: IN1은 0, IN2에 PWM
       Motor_Control(0, 750);  // IN1: 0%, IN2: 75% (반시계 방향)
       HAL_Delay(2000);  

       // 모터 정지: IN1과 IN2 모두 PWM 적용 (브레이크)
       Motor_Control(750, 750);  // IN1: 75%, IN2: 75% (정지)
       HAL_Delay(2000);  

       // 25%, 50%, 75%, 100% 시험
       // 25%는 구동 안함. 모터마다 다를 수 있음
       Motor_Control(400, 0);  // IN1: 40% 듀티, IN2: 0% (시계 방향)
       HAL_Delay(2000);  

       Motor_Control(500, 0);  // IN1: 50% 듀티, IN2: 0% (시계 방향)
       HAL_Delay(2000); 

       Motor_Control(750, 0);  // IN1: 75%, IN2: 0% (시계 방향)
       HAL_Delay(2000); 

       Motor_Control(1000, 0);  // IN1: 100%, IN2: 0% (시계 방향)
       HAL_Delay(2000);

       Motor_Control(0, 0);  // IN1: 0%, IN2: 0% (정지)
       HAL_Delay(2000);
  }
}

728x90
반응형

+ Recent posts