x축 또는 y축으로 평행한 직선을 step motor나 servo motor로 제어할 때 사용되며

   loss Pulse를 해결하기 위한 한 방법입니다.

   제작 하고자 하는 cnc가 리니어 스케일러를 가지고 있다면 현재 이동되는 위치를 선형

   적인 위치를 알 수 있어 절대 좌표계에서 프로그램 하듯이 구현해도 잃어버리는 좌표가

   없으나,  step motor나 servo motor만 장착 되어 있다면 고민을 많이 해야 합니다.

   현재 위치를 공급한 펄스의 수에 의해 파악 하고 있어 한 개의 펄스만 잃어 버려도, 그

   펄스가 누적이 되어 최종 단에서는 큰 오차가 발생됩니다.

   아래 알고리즘은 잃어버리는 펄스를 보완 하는 것으로서, cnc 제어 장치를 만들어 보고

   자 하시는 회원 분들을 위해 예를 들어 설명하기로 하겠습니다.
  

   예를 들어 제작된 cnc 머신은 x축 , y축 , z축 에 스텝모터를 각각 장착되어 있으며, x축의 스텝모터는 한 펄스 당 이동거리가 1mm/pulse이고, y축의 스텝모터는 한 펄스 당 이동거리는 3mm/pulse 라고 하고, x축 분해능은 1mm 씩 이동한다고 가정 합니다.

그리고 z축은 직선보간법에는 적용을 하지 않고 설명 하겠습니다.

한 펄스 당 이동거리가 정밀 급이 아님을 느끼시겠지만 직선 보간법을 설명하기 위해 복잡한 수식은 빼고 설명하기로 하였습니다.

우선 현재 위치가 (0mm, 0mm)에서 (12mm, 24mm)로 사선을 그린다고 가정해보면.


중학교 1학년 때의 수학책을 머릿속으로 생각하며 아래 직선의 식을 프로그램에 적용해야 합니다.

   직선의 식은 y=Ax+B임이 기억이 가물 가물 하실겁니다.

   여기서 A는 기울기이고 B는 y절편을 나타냅니다.

   우리는 0,0에서 출발하여 12,24까지의 사선을 그린다고하면 기울기 A는

    1.jpg

위의 좌표로 이동하기 위해서는 y=2x라는 수식에 의해 이동하게 됩니다.

여기서 y=2x라는 식이 우리가 만들어 놓은 cnc의 스테핑모터를 어떻게 구동하면서

이동을 시키는 가에 대해 생각해보겠습니다.


위에서 정의하기를 x축의 분해능이 1mm라고, 하였습니다. 그 뜻은 x축이 1mm씩 이동할 때 y축의 변화를 나타내자는 뜻입니다. 


x축이 1mm 이동할 때 y축은 y=2x=2*1=2가됩니다.

즉 x축이 1mm 이동 될 때 y축은 2mm 이동 시켜야 한다는 의미입니다.

그런데 스테핑모터가 x축은 한 펄스당 1mm 이동되나, y축은 한펄스당 3mm가 이동됩니다.

그래서 0,0에서 1,2로 이동 할 때 x축은 펄스를 1번 발생 시키면 되지만 y축은 펄스를 발생 시 킬 수 없게 됩니다. y축은 3mm가 되어야 펄스를 발생시 킬 수 있지만 2mm가 되므로 스텝모터를 돌릴 수 없게 됩니다. 즉 3mm가 될 때가지 tmxpq 모터는 구동 할수 없게 됩니다.  


이런 관계를 쉽게 프로그램하기 위해 정리를 하였습니다.

스텝모터를 어떤 상태 에서는 구동하고 또 어떤 상태에서는 구동을 해서는 안 되는 것을 판단할 수 있도록 알고리즘 해야 합니다.

x값과 y값을 아래 수식에 대입하면 몫과 나머지가 나옵니다.

여기서 몫은 펄스수가 되며 나머지는 저장해 놓고, 다음 값에 더해지도록 하여야 합니다.

(현재이동거리-전 이동거리+저장값) / 펄스당이동거리 = 몫,나머지


아래 표를 위의 수식에 의해 만들어 보았습니다.

step1을 보면 0,0에서 1,2로 이동 하는 직선입니다.

<x축>

(현재이동거리-전이동거리+저장값)/펄스당이동거리= 몫, 나머지

      1           0         0         1          1 , 0

  몫이 1, 나머지가 0입니다. 그래서 1개의 펄스를 발생시키고, 저장값은 0입니다.


<y축>

(현재이동거리-전이동거리+저장값)/펄스당이동거리= 몫, 나머지

      2           0         0         3          0 , 2

  몫이 0, 나머지가 2입니다. 그래서 0개의 펄스를 발생시키고, 저장값은 2입니다.

  여기서 펄스를 발생 시키지 못했으며 저장값 2를 store Y에 보관합니다.



step2를 보면 1,2에서 2,4로 이동 하는 직선입니다.

<x축>

(현재이동거리-전이동거리+저장값)/펄스당이동거리= 몫, 나머지

      2           1         0         1          1 , 0

  몫이 1, 나머지가 0입니다. 그래서 1개의 펄스를 발생시키고, 저장값은 0입니다.


<y축>

(현재이동거리-전이동거리+저장값)/펄스당이동거리= 몫, 나머지

      4           2         2         3          1 , 1

  몫이 1, 나머지가 1입니다. 그래서 1개의 펄스를 발생시키고, 저장값은 1입니다. 저장값 1은 store Y에 저장합니다.


이런 방법으로 아래 표를 완성하였습니다.

그리고 아래 표에 의해 이동되는 모양을 그림으로 표시 하였습니다.

그림을 보면 이동되는 모습이 지그제그 모양이지만 세밀하게 분해능을 조정하고, 펄스당 이동거리를 정상적으로 조정한다면 정확한 사선을 그리게 됩니다.



한 펄스 당 이동거리 x축 : 1mm/pulse

한 펄스 당 이동거리 y축 : 3mm/pulse 

3.jpg