Cortex-m4 with Proteus8 #2

천동민·2023년 6월 18일
0
post-custom-banner

버튼으로 DC motor 제어하기

#1 글과 같이 시뮬레이션을 통해 DC motor 속도 제어를 복습하려고 한다

TIM1을 사용하였고 PB1,PB2를 인터럽트로 사용했다.

클럭은 32MHZ를 사용했다

핵심이 되는 코드는 간단하다

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  int i=0, pulseWidth;
  if(GPIO_Pin == GPIO_PIN_1)
  {
     i=10;
  }
  else if(GPIO_Pin == GPIO_PIN_2)
  {
     i=-10;
  }
  dutyCycle=i+dutyCycle;
  if(dutyCycle < 0) {dutyCycle = 0;}
  else if(dutyCycle > 100) {dutyCycle = 100;}
  pulseWidth = (int)(((double)dutyCycle / 100.0) * 4000);
                    TIM1->CCR1 = pulseWidth;
}

버튼 1회당 +=10 즉 10%를 조절한다

period를 4000-1로 설정했기에 예를 들어 dutyCycle =50 이면 pulseWidth=2000으로
2000/4000 =0.5 즉 50%의 힘이 생긴다고 생각하면 되겠다

회로도

PB1 -> 속도 상승
PB2 -> 속도 하강
사진으로는 변화를 보는 것이 어렵기 때문에 Proteus의 오실로스코프를 사용해 PWM의 변화를 확인해 보았다

기본 상태

상승(버튼 7회)

상승 상태에서 하강(버튼 3회)

TIP

다음과 같이 HCLK의 값을 작게하고 그에 맞게 타이머 설정을 해주면
리얼 타임과 같은 속도로 시뮬레이션을 할 수 있는 것을 확인했다

post-custom-banner

0개의 댓글