https://e2e.ti.com/blogs_/b/motordrivecontrol/archive/2015/02/19/start-your-bldc-journey-with-motor-startup-part-iii-initial-position-detection-ipd


초기 위치 감지(initial position detection; IPD)는 회전이 시작하기 전에 모터 위치를 감지하는 방법입니다. BEMF(back electromotive force)에 연관된 방법은 모터가 스타트 하기 전에는 불가능하기 때문에 우리는 모터 위치의 함수인 또 다른 모터 특성을 찾을 필요가 있습니다. 모터 권선 인덕턴스 (포화)는 이 요구를 만족시킬 수 있습니다.


모터 고정자 권선의 등가회로는 저항과 직렬 연결된 인덕터(inductor)입니다. 권선에 자기장(magnetic field)은 상이 전류로 구동될 때 증가합니다.



권선 코어 재질인 규소(silicon) 강판에 자기장은 인가된 전류가 증가하는 것만큼 빠르게 증가할 수 없는 곳에 포화지점(saturation point)을 갖습니다. 이 포화지점은 재질의 자화 곡선(BH curve)에 의해서 결정됩니다.



BLDC 모터의 영구 자석은 권선 코어에 자기장을 생성하는데, 이 자기장은 상전류에 의해서 생성된 자기장에 중복될 수 있습니다.



여기에 이 원리를 입증하는 간단한 실험입니다:


1) 스위치를 켭니다. 12V 전원은 인덕터에 에너지를 축적하기 시작합니다.

2) 인덕터 전류가 1.6A에 도달했을때 스위치를 끕니다.

3) 전류 파형을 캡쳐합니다.

4) 영구자석을 인덕터 가까히 위치시킵니다.

5) 인덕터 코어에 여분의 자기장을 공급합니다.

6) 테스트를 반복합니다.



결과:

자석이 가까히 존재할 때 인덕터는 포화되고 전류는 빠르게 증가합니다.



또한 강한 영구 자석을 선택할수록 전류가 임계값(threshold)에 도달하는데 더 빠릅니다.



우리는 이 개념을 모터에 적용할 수 있습니다. 모터의 3상 중의 두 상에 전압을 이런 식으로 순차적으로 공급합니다: VW WV UV VU WU UW. 전류가 임계값에 도달했을 때 모터에 걸린 전압은 멈추게 됩니다. 전압이 공급된 후로부터 전류 임계치에 도달할 때까지 걸린 시간을 측정합니다. 이 시간은 모터 권선에 인덕턴스의 함수로서 변하게 됩니다.



가장 짧은 시간을 갖는 상태는 최소 인덕턴스를 갖는 상태(마치 minimum inductive kick과 같은)를 나타냅니다. 최소 인덕턴스는 이들 특별한 구동 상태에서 위 그림에서와 같이 모터의 N극에 정렬되었기 때문입니다. 정확한 IPD 결과를 얻기 위해서 다음의 파라미터가 적절히 선택되어야 합니다.


1. IPD current threshold

2. IPD clock

3. IPD release mode


전류가 임계치에 도달하였을 때 모터에 공급되는 전압을 중단하는데는 2가지 방법이 있는데 recirculate 모드와 하이 임피던스 모드입니다. 하이 임피던스 모드에서 전류는 출력 MOSFET의 body diode를 통해서 전원으로 흐르게 됩니다. 하이 임피던스 상태에서 상전류는 보다 빠른 settle-down 시간을 갖지만 VCC에 서지(surge)를 초래할 수 있습니다. 그러므로 하이 임피던스 모드를 적용하기 위해서는 적당한 클램프 회로나 VCC와 GND 사이에 충분한 커패시턴스가 요구됩니다.




'Flight Controller 이해 > 모터제어이론' 카테고리의 다른 글

Start up with BLDC(PMSM) - align and go  (2) 2018.01.18
전기회로 vs. 자기회로  (5) 2016.02.26
SPM vs. IPM  (1) 2016.02.26
PMSM의 모델식  (0) 2016.02.26
PMSM의 토크 제어 방법  (0) 2016.01.28
Posted by Nature & Life


https://e2e.ti.com/blogs_/b/motordrivecontrol/archive/2014/11/20/start-your-brushless-dc-journey-with-motor-startup-part-i
https://www.infineon.com/dgdl/ap0801810_Sensorless_Variable_Inductance_Sensing.pdf?fileId=db3a304412b407950112b40c7c150b39


빠르고 신뢰성 있는 startup는 많은 시스템 설계자가 이미 해왔던 것처럼 도전입니다. 가장 어려운 도전은 거의 모든 센서리스 해법이 위치 추정을 위해서 BEMF(back electromotive force) 감지에 의존하기 때문에 정지 상태로부터 출발이라는 것입니다. BEMF는 모터 속도에 비례하고 startup 전에는 '0'입니다. 결과적으로 초기 위치 감지(initial position detection; IPD)를 위해서는 inductive sense, mutual inductance 등 혹은 모터를 간단히 회전시키는 방법(blindly spin up; "align and go") 등 다른 방법을 찾을 필요가 있다는 것입니다. 이들 2가지 방법은 장점과 단점을 가지며 어떤 애플리케이션에 대해서는 유용합니다. 우리의 애플리케이션에 대해서 최상의 해법과 최상의 파라미터를 찾기 위해서 이들 장단점 사이에서 trade off를 결정해야만 합니다. 다양한 애플리케이션을 지원하기 위해서 이상적으로 모터 드라이버는 유연성과 startup 방법과 startup 파라미터를 선택할 수 있는 옵션을 제공해야 합니다.


'blind' startup (혹은 ramp up method)


비록 많은 새로운 첨단의 BLDC 제어 알고리즘이 위치 관측(position observation), 위치 추정(position estimation) 그리고 FOC(field-oriented control)를 강조할지라도, 알려진 commutation 시퀀스를 간단히 이용해 모터를 "blindly" 강제 구동하는 방법이 여전히 종종 사용됩니다.


스텝퍼(stepper) 모터를 생각해보면, 스텝퍼 모터의 위치는 피드백 센서 없이 수백 개의 스텝 중의 하나로 이동하고 멈추도록 명령될 수 있습니다. 이는 부하가 너무 크지 않는 이상 적당한 애플리케이션에서 잘 동작합니다. 모터가 잘못된 스텝으로 그리고 멈추기도 합니다. 피드백 센서 없이 제어기는 잘못된 스텝이나 정지 조건을 알아차리지 못합니다. 그러므로 'blind' 혹은 'open loop control'이라 부릅니다.


Brushed DC 모터 제어를 생각해보면, brushed DC 모터는 피드백 센서 없이, 제어기 조차도 없이 DC 전원으로부터 작동되도록 설계됩니다. 모터의 속도는 부하가 증가하는 동안 떨어집니다. 모터 속도를 감지하기 위한 특별한 기술이 존재하지 않는 이상, brushed DC 모터는 'blindly' 제어됩니다.


이러한 개념을 3상 BLDC 모터에 구현하면 다음과 같습니다. U상에서 V상으로 DC 전류를 공급하고 모터가 자리잡을 때까지 기다립니다(실제로 우리는 충분히 길게 기다릴 수 있습니다. 왜냐하면 우리는 'blind' 제어를 수행하고 있고 우리는 모터가 정지했는지 아닌지 알 수 없기 때문입니다). 그리고 나서 W상에서 V상으로 DC 전류를 공급하고 기다립니다. 이를 다음의 시퀀스 WU->VU->VW->UW->UV->WV->WU로 지속합니다. 모터는 약간의 흔들림과 함께 회전을 시작할 것입니다.



각 스텝에서 흔들림을 최소화하기 위해서 우리는 간단히 스텝 사이즈를 줄여 위에서 보여지는 2 스텝의 각 사이에 하나의 스텝을 추가하여 회전을 부드럽게 할 수 있습니다. 예를 들어 UV와 WV 사이에 (UW)V 스텝을 추가하고 그 의미는 U상과 W상이 동시에 V상에 전류를 공급함을 의미합니다.



만약 좀더 부드럽게 개선을 원한다면 우리는 존재하는 스텝 사이에 추가적으로 스텝을 더 추가할 수 있습니다. 예를 들어 UV에서 (UW)V 사이에 U상의 전류의 크기를 감소시키고 W상에 전류를 증가시키는 방법으로 몇 개의 스텝에 이를 반복하는 것입니다. 스텝의 수가 어떤 높은 값에 도달하면 제어는 스텝이 없고 부드러운 프로파일을 보여줍니다. 이는 또 사인파 프로파일로 변조(modulate)될 수 있습니다(DRV10983은 256 스텝의 모든 전기적 사이클을 갖고 사인파 전류 프로파일을 제공합니다).



사인파 'blind' startup은 적당한 크기로 3상 사인파 전류를 공급하는 것입니다. 이는 '0' (혹은 매우 낮은) 주파수에서 시작해서 모터의 실제 위치에 상관없이 적당한 가속으로 사인파 전류의 주파수를 증가시킵니다(open-loop 동작). Open-loop 동작은 모터를 어느 속도로 동작시키는데, 이 속도는 모터의 제어 로직이 closed loop로 모터를 정확하게 구동시킬 정도로 충분한 BEMF를 생성할 것입니다(closed-loop 제어는 모터 위치 기준 제어(motor position oriented control)를 의미합니다).



'Blind' startup는 부하 조건이 예측 가능한 애플리케이션에 특별히 모터의 속도를 올리는 매우 실용적인 방법입니다. 그러나 넓은 범위의 모터의 응용을 커버하기 위해서는 몇개의 파라미터들이 startup 성능을 최적화시키기 위해서 적절히 선택되는 것이 필요합니다.



Parameter 1: Open to closed loop threshold. (Op2ClsThr)


예제로 모터 A는 진공청소기 용이고 60,000rpm (4pole, 2000Hz)까지 회전합니다. 이 모터의 BEMF는 5mV/Hz. 모터 B는 천정팬 용이고 최대 속도는 150rpm (8pole, 10Hz)이고 모터 B의 BEMF는 1V/Hz입니다. 우리는 모터 A에 대해서 약 200Hz에서 Op2ClsThr을 설정할 필요가 있습니다. 왜냐하면 이 모터는 closed-loop control를 위해서 200Hz에서 1V BEMF을 생성하기 때문입니다. 우리는 모터 B를 200Hz에서 Op2ClsThr 설정을 원치 않습니다. 왜냐하면 그것은 그렇게 높이 결코 도달하지 않기 때문입니다. 모터 B에서는 1Hz 혹은 1.5Hz가 훌륭한 선택입니다. 만일 여러분이 매우 작은 BEMF 정보를 요구하는 closed-loop control 방법을 갖고 있다면 여러분은 낮은 속도에서 제어를 closed loop로 넘기는 것을 고려할 수 있습니다.


Parameter 2: Align time (AlignTime)


모터는 다음 startup 전에 어떤 위치에서도 정지할 수도 있습니다. 'blind' startup은 초기 위치가 알려지지 않았기 때문에 어떤 애매한 초기 위치에서 모터를 회전시키는데 종종 실패하기도 합니다. 이것이 왜 우리가 초기화가 필요한지를 말해줍니다. 모터 상에 사인파 전류를 흘리기 전에 우리는 어떤 시간 동안 고정 상태(예를 들어 U에서 V로)로 DC 전류를 구동하는 것에 의해서 모터를 초기화하고 고정된 알려진 위치로 모터가 자리잡도록 할 수 있습니다. 이 방법이 'align and go'로 알려집니다.



정렬의 결과로서 다음 스텝, 가속은 알려진 고정된 위치에서 시작합니다. 이 기술은 모터의 초기 위치의 불확실성을 제거하기 때문에 startup 신뢰도를 중요하게 개선합니다. Align time은 모터가 처음에 어디에 있더라도 기대된 위치에 올바로 자리잡는 것을 담보하기 위해서 충분히 긴 시간이 요구됩니다. 그러나 거기에는 작은 여지가 있는데 모터의 초기 위치가 정렬 위치와 아래 그림에서와 같이 반대인 경우(180도 전기각이 떨어져 있는)입니다. 이 조건에서 우리는 아무리 오랫동안 정렬을 할지라도 로터는 움직이지 않을 것입니다.



여기에 2가지 해법이 있습니다:


1) Dual-align: 서로 120도 떨어져 (혹은 0도 혹은 180도를 제외한 어떤 각도) 두번 정렬을 실행합니다. 만일 모터가 처음 정렬 이전에 불운한 위치에 있었다면, 두번째 정렬은 그것을 확실하게 두번째 정렬 위치로 당길 것입니다.



2) Dynamic align: 고정된 위치에 정렬하는 것 대신에 정렬을 하는 동안 위치를 천천히 움직입니다. 아래와 같이 이러한 동작은 가속과 함께 조합될 수 있으며 그 결과 우리는 부드럽고 더욱 신뢰성 있는 startup을 얻을 수 있습니다.



Parameter 3: Motor acceleration rate. (A1)


모터 구동 토크는 acceleration momentum 공급하고, 샤프트 마찰(shaft friction)과 어떤 부하를 극복하는 것이 요구됩니다.


Td = A1*J + Tf

Td = Kt*Ip*cos(Ө)


그러므로, A1 < Kt*Ip / J


A1: Acceleration rate

Tf: Motor load torque

J: Motor inertial

Td: Motor driving torque

Ө: Angle between combined 3-phase current and rotor position

Kt: Motor torque constant

Ip: Motor phase current peak



큰 관성 모터는 느린 acceleration rate를 요구합니다; 작은 Kt 모터는 느린 acceleration rate를 요구합니다; 높은 구동 전류는 빠른 acceleration rate를 지원할 수 있습니다. 만일 Kt*Ip > Td이면 Ө는 자동적으로 0에서부터 90 이하로 증가할 것입니다.


Parameter 4: Second order acceleration (A2)


2차 가속은 동적인 정렬과 가속 프로파일(포물선)을 생성합니다. 만일 모터가 초기 위치 감지(IPD) 혹은 startup 이전에 정렬을 했다면 2차 가속은 필요하지 않습니다.


Parameter 5: Startup current


startup 전류는 'blind' 동작 구간 중에 인가된 전류입니다. 만일 'blind' startup acceleration rate가 선택되었다면 startup 전류는 startup 구간에 영향을 주지 않을 것입니다. 그러나 작은 startup 전류는 startup 실패를 야기할 수 있는 좀 더의 기회를 갖을 것입니다. 다른 한편으로 만일 작은 startup 전류가 애플리케이션에서 요구된다면 우리는 신뢰성 있는 startup을 확보하기 위해서 acceleration rate를 낮추는 것이 요구됩니다. 'blind' startup에는 몇가지 단점이 있습니다.


1) startup은 closed loop 방법보다 느립니다.


100% 성공률을 얻기 위해서 acceleration rate은 큰 마진과 함께 식 A1 < Ip*Kt / J을 만족시켜야 합니다. 왜냐하면 제어기는 모터가 동상에 있는지 아닌지(즉 모터가 구동 속도를 따르는 것을 실패하는 것입니다) 알지 못하기 때문입니다. 만일 어떤 것이 모터 회전을 방해한다면, 제어기는 모터의 이들 벗어난 조건을 바로잡는 것이 불가능하고 시도하지도 않습니다. 예를 들어, 샤프트 마찰은 조립의 이유로 다른 모터들보다 혹은 모터가 완전히 정지하지 않은 그리고 제어기가 회전을 시도할 때 반대방향으로 움직일 때보다 조금 큽니다.


2) 예측 가능한 부하에 대해서 잘 동작합니다.


면도기, 머리 트리머 그리고 장난감에 대하여 부하는 어떻게 사용자가 그것을 사용하는 가에 따라 크게 변하게 됩니다.


3) 서로 다른 모터와 애플리케이션에 대해서 다른 파라미터를 요구합니다.


사용자는 부하 조건을 이해하고 모든 특별한 애플리케이션에 적합하도록 제어기를 튜닝할 필요가 있습니다. 무엇보다도 'blind' startup은 팬이나 펌프 그리고 예측 가능한 부하를 갖는 다른 형태의 모터에 실용적인 방법입니다.


The drawback of ‘blind’ spin up is that the motor may start with back and forth; the aesthetics aren’t desirable if the motor blades are exposed to customers (for example ceiling or pedestal fans. Also, for applications where reverse spinning is prohibited (for example HDD motor or VCM) you should not choose ‘blind’ spin up. Initial position detect (IPD) method can avoid the reversing or back and forth during startup. Check back for part III of this series, which will cover the principle of IPD, the typical implementation of IPD and the how to select the IPD parameters.

'blind' startup의 결점은 모터가 앞뒤로 움직이며 회전을 시작할 수 있다는 것입니다; 미학은 모터의 바람개비 날개가 사용자에게 노출되는 한 요구되지 않는다는 것입니다(예를 들어 천장 혹은 받침대 팬). 또한 역회전이 금지된 애플리케이션(예를 들어 HDD 모터 혹은 VCM)에서 'blind' startup을 선택하지 않아야 합니다. 초기 위치 감지(IPD) 방법은 역회전 혹은 startup 동안에 앞뒤로 움직임은 피할 수 있습니다.



'Flight Controller 이해 > 모터제어이론' 카테고리의 다른 글

Start up with BLDC(PMSM) - variable inductive sense  (0) 2018.01.19
전기회로 vs. 자기회로  (5) 2016.02.26
SPM vs. IPM  (1) 2016.02.26
PMSM의 모델식  (0) 2016.02.26
PMSM의 토크 제어 방법  (0) 2016.01.28
Posted by Nature & Life


NUNCHUK


The Nyko Kama wireless nunchuk can also be used to control the ESC. Note that not all nunchuks for the nintendo wii will work, because they slightly differently.

Nyko Kama wireless nunchuk은 또한 ESC를 제어하기 위해서 사용되어질 수 있습니다. nintendo wii에 대한 모든 nunchuk들이 조금씩 다르기 때문에 동작하지 않는다는 것을 기억하세요.



    • Control mode

      • Disabled or current control with or without reverse. If reverse is used, the Z button is used to toggle a direction change.

      • Disabled or current control with or without reverse. 만일 reverse가 사용되면 방향 전환을 위해서 Z 버튼이 사용됩니다.

    • Settings

      • Deadband: The span in the centre of the throttle that should be ignored.

      • Deadband: 스로틀의 중심에서 확장은 무시되어져야 합니다. 

      • RPM limits: Limit the electrical RPM of the motor. The start value is the point where the torque should start decreasing and the end value is the point where the output will be switched off. Setting them slightly apart will give a soft RPM limit. Setting them very high will disable the RPM limit.

      • RPM limits: 모터의 전기적인 RPM을 제한합니다. start 값은 토크가 감소하기 시작하는 지점이고 end 값은 출력이 스위치 off되는 지점입니다. 이들은 약간 분리해 설정하는 것은 부드러운 RPM 제한을 줄 것입니다. 이들은 매우 높게 설정하는 것은 RPM 제한을 불가능하게 할 것입니다.

      • Ramping time constants: How fast the throttle command should be followed, in seconds.

      • Ramping time constants: 스로틀 명령이 얼마나 빨리 초 단위로 뒤따르는지를 나타냅니다.

    • Multiple ESCs over CAN can be enabled to connect several VESCs over CAN bus. All VESCs must have different Controller ID and the slave VESCs must have Send status over CAN enabled (see the general tab under app configuration). The slave VESCs don’t need to have any application enabled since they will just be listening for CAN commands. Traction control can also be enabled, which reduces the torque on motors that spin faster than the slowest motor proportional to their speed difference. To connect VESCs over CAN-bus, connect the CANH and CANL signals between them. DO NOT connect 5v and GND because that is likely to cause ground loops which can reset and/or kill the VESCs.

    • VESC - Open Source ESC(7)을 참조!


A video where I test this:


Realtime Data Display

Use the "Realtime Data" tab to display realtime information from the ESC. Make sure that the "Activate sampling" box is checked.

ESC로부터 실시간 정보를 보여주기 위해서 "Realtime Data" 탭을 사용하세요. "Activate sampling" 박스가 체크되었는지 확인합니다.



Common Problems and Solutions

As I encounter different problems, I will put them here together with possible solutions for reference.

제가 다른 문제를 직면한다면 여기에 가능한 방법을 참조로서 올릴 것입니다.


Uploading the firmware does not work.


    • Make sure that you have followed all steps in the tutorial, including adding udev rules to access the programmer without being root.

    • 여러분이 가이드라인에 모든 단계를 따라왔는지 확인하세요. root가 아니면서 프로그래머에 접근하기 위한 udev 룰을 추가하는 것을 포함해서 말입니다.

    • Don’t use a too long cable for the SWD connector.

    • SWD 커넥터로써 너무 긴 케이블을 사용하지 마세요.

    • Make sure that you have a working programmer. I got one from ebay that didn’t work at all and one that died quickly. Otherwise they have been reliable though.

    • 여러분이 작동한 프로그래머을 갖고 있는지 확인하세요. 저는 ebay로부터 전혀 동작하지 않는 하나와 금방 손상된 하나를 얻은 적이 있습니다. 


A DRV8302 fault code appears as soon as the motor starts.


    • Make sure that R16 is not mounted (see the comment in the schematic).

    • R16이 설치되지 않았는지 확인하세요(회로도에 주석을 보세요)


Connecting to VESC via BLDC Tool does not work.


    • Run dmesg to see which ttyACMx port gets assigned to VESC when plugging in the mini-usb cable.

    • mini-usb 케이블을 꼽았을때 어떤 ttyACMx 포트가 VESC에 할당되었는지 보기를 위해서 dmesg를 실행하세요.

    • Make sure that the mini-usb cable is plugged in and that power is connected to VESC. Connecting BLDC Tool is not done via the SWD programmer, but via the mini-usb port.

    • mini-usb 케이블이 연결되고 파워가 VESC에 연결되었는지 확인하세요. BLDC Tool을 연결하는 것은 SWD programmer를 경유하는 것이 아니고 mini-usb 포트를 사용합니다.

    • If you are using a different usb-connector than the one from the BOM, make sure that the order of the pins is correct. The connector in the BOM is upside-down, so a connector that isn’t will have all the pins mirrored.

    • 만일 여러분이 BOM에서와 다른 usb 커넥터를 사용한다면 핀의 순서가 올바른지 확인하세요. BOM에서 커넥터는 위아래가 뒤집힌 것이고 그렇지 않은 커넥터는 모든 핀이 mirror 될 것입니다.


My motor is not running properly.


    • Make sure that you have configured VESC for your motor as described above. VESC is not plug-and-play and needs an individual configuration for each motor. Without the configuration, the motor will run poorly or not at all. Read the instructions carefully.

    • 여러분이 위에서 설명된 것처럼 여러분의 모터에 대해서 설정된 VESC를 갖고 있는지 확인하세요. VESC는 plug-and-play가 아니고 각각의 모터에 대해서 각자의 설정을 필요로 합니다. 설정 없이 모터는 제대로 회전하지 않거나 전혀 회전하지 않을 수 없습니다. 가이드라인을 주의깊게 읽어보세요.


Is there a way to “boost” the startup of my motor when using current control?


    • Yes, the Startup boost option under Motor Configuration > Misc tab in BLDC Tool can be adjusted as described above.

    • 네, BLDC Tool에서 Motor Configuration > Misc 탭 아래에 Startup boost 옵션은 위에서 설명한 것처럼 조정될 수 있습니다.


Update: I have ordered assembled VESCs, some of them are for sale

Update about this update: There are no assembled ESCs left. However, If you are interested in assembled VESCs you can still send me an email as described below so that I can put you on my extra list. If someone changes their mind or if there are other problems, I can send you VESCs that get left.

이 업데이트에 대한 업데이트: 조립된 ESC가 없습니다. 그러나 여러분이 조립된 VESC에 관심있다면 여러분은 여전히 아래의 설명했듯이 이메일을 보낼 수 있습니다. 그 결과 저는 제 여분의 리스트에 여러분을 포함하고 만일 누군가가 마음이 변하거나 다른 문제가 있다면 저는 남은 것을 여러분에게 보낼 수 있습니다.


I have ordered 100 assembled VESCs and they will arrive this or next week. I don’t need all of them, so I will sell some of them for 115€ + shipping. Worldwide shipping with tracking is 20€ per order (which can contain more than one VESC). Shipping within Sweden is less expensive and I will update this post as soon as I know the price. You can contact me by email if you are interested (benjamin at vedder.se). Tell me how many VESCs you’d like and your address, and I will reply with an email that confirms that I have put you in my list. Later, when I have figured out how to accept payments, I will send another email with information about how to do that. As soon as I receive your payment, I will ship the VESC(s) to you and send an email with tracking information

저는 100개의 조립된 VESC를 주문했고 이번주나 다음주에 도착할 것입니다. 저는 이들 모두를 필요로 하지 않습니다. 그래서 저는 일부를 115€ + shipping으로 판매할 것입니다. 추적없이 Worldwide shipping은 주문 당(이것은 한개 이상의 VESC를 포장할 수 있습니다) 20€입니다. 스웨덴 내에서 배송은 덜 비싸고 저는 이 글을 가격을 아는데로 업데이트 할 것입니다. 여러분은 여러분에 흥미있다면 이메일로 저와 연락할 수 있습니다(benjamin at vedder.se). 제게 원하는 개수와 여러분의 주소를 알려주세요. 그리고 저는 제 리스트에 여러분을 기입하고 확인하기 위해서 답장 메일을 보낼 것입니다. 후에 저게 어떻게 돈을 받을지 정한 후에 저는 그것을 어떻게 하는지에 대한 또다른 메일을 보낼 것입니다. 제가 여러분의 지불을 받자마자 저는 여러분에게 VESC를 배송할 것이며 추적 정보와 함께 이메일을 보낼 것입니다.


I will update this information in the coming days, so make sure to check if there are updates.

저는 이 정보는 앞으로 업데이트 할 것입니다, 그래서 업데이트가 있는지 없는지 확인할 것입니다.



Posted by Nature & Life


Application Configuration

First, click "Read configuration" to get the current configuration from the ESC. After that, select which application to use and configure that application.

우선 ESC로부터 현재의 설정을 가져오기 위해서 "Read configuration"을 클릭합니다. 그 후에 사용하기 위한 애플리케이션을 선택하고 그 애플리케이션을 설정합니다.



    • Controller ID is the ID of this VESC. If multiple VESCs are connected over CAN-bus, they must have different IDs.

    • Controller ID는 VESC의 ID입니다. 만약 여러개의 VESC가 CAN 버스로 연결되어 있다면 이들은 서로 다른 ID를 가져야만 합니다.

    • Send status over CAN has to be enabled to make other VESCs aware of this VESC and some of its current state. It should be enabled for all slave VESCs when connecting multiple VESCs over CAN-bus.

    • Send status over CAN는 다른 VESC가 이 VESC와 현재 상태의 일부를 알아차리도록 가능하게 합니다. 이는 CAN 버스로 다수의 VESC를 연결할 때 모든 슬래이브 VESC가 가능해져야만 합니다.

    • Changing application requires a reboot. There is a button for that. After a reboot, you have to click connect again.

    • 애플리케이션을 변경하는 것은 재부팅을 요구합니다. 이것을 위한 버튼이 존재합니다. 재부팅 후에 다시 연결해야만 합니다.

    • Timeout is the amount of milliseconds after which the motor should be shut off in case the control signal is missing.

    • Timeout은 모터가 커진 후에 ms의 양입니다. 경우에 따라서 제어 신호는 잃어버릴 수 있습니다.

    • "Brake current to use…" can be set to make the motor brake with a certain current when a timeout occurs instead of just releasing it.

    • "Brake current to use…"은 단지 모터의 제어권을 놓기 전에 timeout이 발생했을 때 어떤 전류로 모터에 브레이크를 걸기 위해서 설정될 수 있습니다.


PPM

The signal that a normal RC receiver outputs is a PPM signal, so this can be used when connecting an RC receiver to the servo port.

통상 RC 수신기 출력은 PPM 신호입니다. 그래서 이는 RC 수신기를 서보 포트에 연결했을 때 사용됩니다.



    • Control mode

      • Disabled: Nothing at all, motor is off.

      • Current: Torque control. This is what I prefer since it feels most natural. I haven’t seen hobby ESCs that have current control.

      • Current: 토크 제어. 저는 가장 자연스럽기 때문에 선호합니다. 저는 전류 제어를 갖는 취미용 ESC를 보지 못했습니다.

      • Current no reverse: Save as above, but no reverse function. Note that centring the now will give half throttle.

      • Current no reverse: 위와 같이 저장하세요 그러나 reverse 기능이 아닙니다. 현재의 센터링이 중간 스로틀을 줍니다.

      • Current no reverse with brake: No reverse, but centre is zero torque. Reversing will brake, but not change motor direction.

      • Current no reverse with brake: reverse가 아니며 중앙은 토크입니다. Reversing은 브레이크를 걸 것이지만 모터 회전방향에 변화는 없습니다.

      • Duty cycle: Duty cycle or voltage control. What most hobby ESCs use.

      • Duty cycle: 듀티 싸이클 혹은 전압 제어. 대부분의 취미용 ESC가 사용하는 것입니다.

      • PID speed control: The throttle command is intepreted as a speed set command and closed-loop control is used to maintain that speed. “PID max ERPM” sets what max throttle should be interpreted as.

      • PID speed control: 스로틀 명령은 속도 설정 명령으로 해석되고 폐루프 제어는 그 속도를 유지하기 위해서 사용됩니다. "PID max ERPM"는 최대 스로틀로 해석되는 값입니다.

    • Settings

      • Deadband: how much span in the centre of the throttle should be ignored.

      • Deadband: 스로틀의 중심에서 넓은 확장은 무시되어져야 합니다.

      • Minimum and maximum pulsewidth: The timing interpretation of the PPM signal can be adjusted in case your receiver doesn’t follow the specification or it you have some other reason to change it. Setting “Control mode” to “Disabled” and ticking display decoded PPM value is useful when adjusting these.

      • Minimum and maximum pulsewidth: PPM 신호의 timing 해석은 조정이 필요할 수 있습니다. 왜냐하면 경우에 따라서 여러분의 수신기가 스펙을 따르지 않거나 다른 이유로 변경이 될 수 있기 때문입니다. "Control mode"를 "Disabled"로 설정하고 그리고 "decoded PPM value"를 보여주기 위해 체크하는 것이 이들을 조정할 때 유용합니다.

      • Use Median Filter enables a filter that is very useful when there are glitches on the PPM signal. If you have a quadcopter application, you should disable the filter and make sure that there are no glitches since a filter introduces some delay.

      • "Use Median Filter"를 체크하는 것은 필터를 활성화하는 것으로 PPM 신호에 글리치가 있을 때 매우 유용합니다. 만일 여러분이 쿼드콥터 애플리케이션을 갖고 있다면 여러분은 이 필터를 비활성화 시켜야 하고 필터는 약간의 시간 지연을 야기하기 때문에 글리치가 없도록 확실하게 하여야 합니다. 

    • Soft RPM limit.

      • Speed limit that can be used in current control mode. Setting the start and end limits a bit apart will result in a soft torque decay when approaching the speed limit.

      • current control mode에서 사용될 수 있는 속도 한계입니다. start와 end 제한을 약간 떨어져 설정하는 것은 속도 한계에 도달했을 때 부드럽게 토크가 감소하는 결과를 갖습니다.

    • Multiple ESCs over CAN can be enabled to connect several VESCs over CAN bus. All VESCs must have different Controller ID and the slave VESCs must have Send status over CAN enabled (see the general tab under app configuration). The slave VESCs don’t need to have any application enabled since they will just be listening for CAN commands. Traction control can also be enabled, which reduces the torque on motors that spin faster than the slowest motor proportional to their speed difference. To connect VESCs over CAN-bus, connect the CANH and CANL signals between them. DO NOT connect 5v and GND because that is likely to cause ground loops which can reset and/or kill the VESCs.

    • CAN으로 다수의 ESC는 CAN 버스에 몇개의 VESC를 연결하는 것으로 활성화 할 수 있습니다. 모든 VESC는 다른 Controller ID를 가져야만 하며 슬레이브 VESC는 Send status over CAN가 활성화(see the general tab under app configuration) 되어야만 합니다. 슬레이브 VESC는 그들이 단지 CAN 명령을 듣고 있을 것이기 때문에 어떤 애플리케이션이 활성화 시킬 필요가 없습니다. Traction control은 또한 활성화 될 수 있습니다. 이는 그들의 속도 차에 비례하여 가장 느린 모터보다 빠르게 회전하는 모터에 토크를 감소시킵니다. CAN 버스로 VESC를 접속하기 위해서 그들 사이에 CANH, CANL 신호를 연결합니다. 5v와 GND를 연결하지 마세요. 이는 VESC를 초기화 하거나 손상시킬 수 있는 그라운드 루프(ground loop)를 발생시킬 수 있기 때문입니다.



Posted by Nature & Life


Phase advance (other terms: timing adjustment, field weakening)

To compensate for the current lagging behind the voltage at high speeds because of inductance or to get a bit higher top speed at the expense of some efficiency and torque, phase advance can be used. It is implemented in a speed-dependent way so that the motor gets more phase advance the faster it spins. It is implemented this way because having phase advance at low speeds does not give any improvements at all as far as I know, so the best way is to increase the effect as the motor increases its speed. BR ERPM is the electrical RPM of the motor at which the set phase advance is used, and Integrator limit scale at BR ERPM (will rename this option soon…) is the amount of phase advance to use. Setting it to 1.0 gives no phase advance and setting it to 0.0 gives 30 degrees (maximum) phase advance. The set phase advance will be mapped linearly between 0 ERPM and BR ERPM. If you don’t know what this is, you can leave the default options since it is not that important.

인덕턴스로 인해서 고속에서 전압 뒤로 전류의 지연을 보상하기 위해서 혹은 다소 효율과 토크의 희생으로 최고 속도 이상으로 동작시키기 위해서 phase advance가 사용됩니다. 이는 속도에 의존적인 방식으로 구현됩니다. 그 결과 모터를 phase advance를 더 주어 더 빠르게 회전할 시킬 수 있습니다. 낮은 속도에서 phase advance를 시키는 것은 제가 아는 한 전혀 어떤 개선을 주지 못하기 때문에 이런 방식으로 구현됩니다. 그래서 가장 좋은 방법은 모터가 속도가 증가할수록 이 효과를 증대시키는 것입니다. BR ERPM은 설정된 phase advance가 사용되는 지점에서 모터의 전기적 RPM이고, BR ERPM(이 옵션의 이름이 곧 변경될 것입니다...)에서 Integrator limit scale은 사용하는 phase advance의 양입니다. 이것을 1.0으로 설정하는 것은 어떠한 phase advance를 주지 않습니다 그리고 이를 0.0으로 설정하는 것은 30 degree (최대) phase advance를 주는 것입니다. 설정된 phase advance는 선형적으로 0 ERPM과 BR ERPM 사이에 매핑될 것입니다. 만일 여러분이 이것이 무엇인지 모른다면 여러분은 이것이 그렇게 중요하지 않기 때문에 디폴트 옵션으로 남겨둘 수 있습니다.


MOTOR

Current, temperature, RPM and voltage-limits can be configured depending on your application.

전류, 온도, RPM 그리고 voltage-limits은 여러분의 애플리케이션에 따라 설정될 수 있습니다.


Note: These limits are not foolproof. If you set them too high, you can damage the ESC and/or the motor.

Note: 이들 제한들은 fool proof가 아닙니다. 여러분이 이들은 너무 높게 설정하면 여러분은 ESC 그리고/혹은 모터를 손상시킬 수 있습니다.


    • Current

      • Separate limits for acceleration and braking current.

      • Separate limits for motor and battery currents.

      • "Absolute max" is checked in every PWM switching cycle and used in case the soft back-off strategy for the other limits doesn’t work. I usually set it way higher than the other limits because soft back-off is preferred rather than switching off the motor with a fault code, but it should never be higher than 150A.

      • "Absolute max"는 매 PWM 스위칭에서 체크하며 경우에 따라서 다른 제한들에 대해서 soft back-off 전략이 동작하지 않을 때 사용됩니다. 저는 보통 다른 제한들보다 높은 방식으로 설정합니다. 왜냐하면 soft back-off은 디폴트 코드로 모터의 스위칭을 끄는 것보다 오히려 선호하기 때문입니다. 그러나 이는 절대 150A 보다 높지 않아야만 합니다. 

      • The "Slow absolute max" box will make sure that a filtered version of the maximum current limit is used. This is useful if there is much noise and that fault code kicks in all the time. I usually have it ticked.

      • "Slow absolute max" 박스는 최대 전류 제한의 필터된 버젼이 사용되는지 확실하게 합니다. 이것은 만약 너무 많은 잡음이 있거나 그 디폴트 코드가 항상 kick in 될때 유용합니다. 저는 보통 이것을 체크합니다.

    • Temperature

      • At the "Start" temperature, the current will become more and more limited linearly until the “End” temperature, where the output is switched off completely. Setting them about 20 degrees apart will make the ESC slowly decrease the maximum output current as it gets too warm instead of abruptly switching everything off.

      • "Start" 온도에서 전류는 "End" 온도까지 선형적으로 더욱더 제한될 것입니다. 여기서 출력은 완전히 스위치가 off됩니다. 이를 약 20도 정도 차이를 두어 설정하는 것이 ESC가 너무 상승할 때 온도가 갑자기 모든 것을 스위치 off 시키는 것 대신에 최대 출력 전류를 서서히 감소시키게 만들 것입니다.

      • MOSFET temps (on the ESC) are implemented and working, but motor temps are not implemented yet. They will require an external temperature sensor in the motor. The software implementation is rather simple since I can just copy most of the MOSFET temperature limit code.

      • MOSFET 온도(ESC 상에)는 구현되었고 동작합니다. 그러나 모터 온도는 아직 구현되지 않았습니다. 이들은 모터에 외부 온도 센서를 필요로 할 것입니다. 소프트웨어 구현은 오히려 간단한데 왜냐하면 저는 단지 MOSFET 온도 제한 코드의 대부분을 복사하기 때문입니다.

    • RPM

      • Max and Min ERPM are hard RPM limits. It is preferable to use the soft application RPM limits instead if possible.

      • Max와 Min ERPM는 엄격한 RPM 제한입니다. 만일 가능하다면 부드러운 애플리케이션 RPM 제한을 사용하는 것을 선호합니다.

      • "Max ERPM at full brake" (should change the name…) is the highest opposing RPM at which a direction change is allowed. Setting this too high will cause cogging when moving in one direction and giving high throttle in the other direction. On my longboard I have it at 300 and my RC car has it a bit higher.

      • "Max ERPM at full brake"(이름을 변경해야 하는...)는 방향 전환이 허용되어진 곳에서 가장 큰 반대되는 RPM입니다. 이를 너무 높게 설정하는 것은 한 방향으로 움직일때 그리고 다른 방향으로 높은 스로틀을 줄 때 코깅을 야기시킬 것입니다. 제 longboard에서는 저는 300이고 제 RC 카에서는 조금 높습니다. 여기서 코깅(Cogging)이란 모터의 회전자와 고정자가 덜거덕 거리면서 움직이는 것을 말합니다. 즉, 토크의 변동을 의미합니다. 이를 줄이기 위해서 철심의 슬롯 수를 늘리면 됩니다. 또 슬롯 수가 작은 경우에는 슬롯에 비틀림을 주어 자속분포를 균등하게 만드는 등의 방법이 있지만 이 경우에는 출력토크가 저하됩니다. 이를 완전히 개선한 것이 코어리스 모터이지만 기계적으로 약하여 불안정하므로 대형으로 만들 수 없기 때문에 고정밀도기계, 에너지 절약 장치 등에 활용하게 됩니다.

      • "Max ERPM at full brake in CC mode" is the highest RPM at which applying full brake by shorting all the motor windings is allowed. Setting this value too high can cause much mechanical stress in some circumstances. I have it at 1500 for all my applications.

      • "Max ERPM at full brake in CC mode"은 모터의 모든 코일을 단락시키는 full brake를 적용하는 것이 허용된 시점에서 최대 RPM입니다. 이 값을 너무 높게 설정하는 것은 어떠한 환경에서 많은 기계적 스트레스를 야기시킬 수 있습니다. 저는 이를 모든 제 애플리케이션에서 약 1500 정도를 설정합니다.

    • Voltage

      • The minimum and maximum input voltage.

      • NOTE: I changed the voltage dividers in hardware 2015-01-22. If you have built the PCB before that, the maximum voltage can’t be more than 52V. The difference is whether the PCB has 33k or 39k resistors. 33k means that maximum 52V can be measured. The latest PCBs (with 39k resistors) can measure 60V, but you should have some margin on your supply voltage to be safe. You can of course replace all 33k resistors with 39k and measure up to 60V.

      • NOTE: 저는 2015-01-22 하드웨어에서 전압 분배회로를 변경했습니다. 만일 여러분이 그 전에 PCB를 제작하였다면 최대 전압은 52V 이상이 될 수 없습니다. 차이는 PCB가 33k를 가졌는지 39k 저항을 가졌는지 입니다. 33k는 최대 52V가 측정될 수 있슴을 의미합니다. 가장 최근 PCB(39k 저항을 갖는)는 60V를 측정할 수 있습니다. 그러나 여러분은 안전을 위해서 여러분의 전원 공급 전압에 약간을 여유를 가져야만 합니다. 여러분은 물론 33k 저항을 39k 저항으로 교체할 수 있고 60V까지 측정할 수 있습니다.


Once the ESC is configured for your motor, you can use the up and down arrow keys to run the motor forwards or reverse in current control mode, or the right and left arrow keys to run the motor forwards and reverse in duty cycle mode. The buttons in the right-hand side of the GUI can also be used.

일단 ESC가 여러분의 모터를 설정하고 나면, 여러분은 current control mode에서 모터를 정방향 혹은 역방향으로 동작시키기 위해서 up, down 화살표 키를 사용할 수 있고, duty cycle mode에서 모터를 정방향 그리고 역방향으로 동작시키기 위해서 right, left 화살표 키를 사용할 수 있습니다. GUI의 우측편에 버튼들을 또한 사용할 수 있습니다.


MISC

Here are the rest of the motor configuration parameters. You probably want to experiment with Startup boost if you are using current control. The rest of the parameters can be left as their default values unless you have some specific reason to change them.

여기는 모터 설정 파라미터의 나머지입니다. 여러분은 아마도 여러분이 전류 제어를 사용한다면 Startup boost와 함께 실험을 원할 수도 있습니다. 나머지 파라미터들은 여러분이 변경할 특별한 이유가 없는 한 디폴트 값으로 남겨둘 수 있습니다.


    • PWM mode

      • Synchronous is recommended and the best choice for a majority of all motors. If you have some weird motor, Bipolar could work better, but it probably won’t. Nonsynchronous is only for experimentation and can kill the ESC if you are unlucky.

      • 동기화가 추천되며 모든 모터들의 대다수를 위한 가장 좋은 선택입니다. 만일 여러분이 weird 모터를 갖고 있다면 Bipolar가 잘 동작할 수 있습니다. 그러나 이것은 아마도 아닐 것입니다. 비동기화는 단지 실험용이고 여러분이 불행하다면 ESC를 손상시킬 수 있습니다.

    • Current control

      • Startup boost is the minimum duty cycle to use when using current control. If the motor is to weak when you are just starting, you can increase this parameter a bit until it feels right. The range is 0.0 to 1.0, where 1.0 is full throttle (which you shouldn’t use.). A sane range is up to 0.15 or so.

      • Startup boost는 전류 제어를 사용할 때 사용을 위한 최소 듀티 싸이클입니다. 여러분이 단지 start할때 만약 모터가 약하다면 여러분은 이 파라미터를 약간 좋다고 느낄 때까지 증가시킬 수 있습니다. 범위는 0.0 ~ 1.0입니다. 여기서 1.0은 full 스로틀입니다(여러분은 사용하지 말아야 합니다). 정상적인 범위는 0.15 정도입니다.

      • Min current is the minimum allowed current. There should be no reason to change this, so leave it at the default value.

      • Min current는 최소 허용된 전류입니다. 이를 변경하기 위한 어떤 이유도 존재하지 않습니다. 그러므로 디폴트 값으로 남겨 두세요.

      • Control gain is the gain used by the current controller. Increasing it makes the current response faster, but also increases the risk of getting an unstable system where the ESC can get damaged. Only change this if you know what you are doing.

      • Control gain은 전류 제어기에서 사용된 이득입니다. 이를 올리는 것은 전류 응답을 빠르게 합니다. 그러나 또한 불완정한 시스템을 갖는 위험도가 늘어나고 ESC가 손상될 수도 있습니다. 만일 여러분이 무엇을 하는지 알 때만 오직 변경하세요. 

    • Speed control

      • The PID parameters for the speed controller. Only change them if you know what you are doing.

      • 속도 제어기를 위한 PID 파라미터입니다. 여러분이 무엇을 하는지 알 때에 오직 변경하세요.

    • Timeouts

      • Fault stop time is the amount of milliseconds that the ESC should be completely switched of when a fault code arises. After that time, it will switch on and try to listen for commands again.

      • Fault stop time는 결함있는 코드가 발생했을 때 ESC가 완전하게 스위칭 off 해야만 하는 ms의 양입니다. 그 후에 이것은 스위칭 on 할 것이고 명령어를 다시 듣기 시도할 것입니다.



Posted by Nature & Life


Communicating with the VESC using UART


Posted on October 9, 2015

Many people have asked me how to communicate with the VESC using UART, but I did not have a good answer since I haven’t written any tutorial about that and the only thing I could refer to was the BLDC Tool code. Now I have created a project for the STM32F4 discovery board that implements UART communication with the VESC where the full interface is implemented. In this post I will try to explain how the code works and how to port it to other platforms.

많은 사람들은 제게 UART를 이용해서 VESC와 어떻게 통신하는지 물어왔습니다. 그러나 저는 그것에 대해서 어떤 가이드를 작성하지 않았기 때문에 좋은 답장을 갖고 있진 않습니다. 제가 참조할 수 있는 유일한 것은 BLDC Tool의 코드입니다. 저는 완전한 인터페이스가 구현된 VESC와 UART 통신을 구현한 STM32F4 discovery 보드에 대한 프로젝트를 만들었습니다. 이 글에서 저는 어떻게 코드가 동작하고 다른 플랫폼으로 어떻게 포팅하는지를 설명할 것입니다.


Getting started

Start by downloading the code from github: 

https://github.com/vedderb/bldc_uart_comm_stm32f4_discovery



If you have a stm32f4 discovery board, you can upload the code to it and test it by following the tutorial in my VESC Post for installing the toolchain. After that, just connect both USB ports of the discovery board (one for the built in programmer and one for the serial terminal) and type make upload from the project directory. Don’t forget to connect rx (PB11), tx (PB10) and gnd from the discovery board to tx, rx and gnd on the VESC. The discovery board will show up as a USB-serial port and you can use a serial terminal such as screen or gtkterm to access a simple command line interface on it. Only a few commands are implemented for the command line interface (type help to list them), but a good exercise is to write more commands in the main file using the provided interface. Doing that with the bldc_interface code should be quite straight forward.

여러분이 stm32f4 discovery 보드를 갖고 계시다면, 여러분은 코드를 업로드 할 수 있고 toolchain을 설치하기 위해서 제 VESC 글에 가이드에 따라 테스트 할 수 있습니다. 그 후에 discovery 보드의 양 USB 포트를 연결하세요(프로그래머에 설치된 하나와 시리얼 터미널에 하나) 그리고 프로젝트 디렉토리로부터 make upload를 치시기 바랍니다. discovery 보드의 rx (PB11), tx (PB10) 그리고 gnd를 VESC의 tx, rx 그리고 gnd를 연결하는 것을 잊지 마십시오. discovery 보드는 USB-serial 포트로 나타나고 여러분은 간단한 command line 인터페이스를 접근하기 위해서 screen 혹은 gtkterm과 같은 시리얼 터미널을 이용할 수 있습니다. command line 인터페이스를 위해서 오직 몇 개의 명령에 대해서 구현되어졌습니다(리스트하기 위해서 help를 치세요), 그러나 좋은 연습은 제공된 인터페이스를 이용해서 메인 파일에 좀더의 명령어를 작성할 수 있습니다. bldc_interface 코드와 그것을 하는 것은 매우 직관적(straight forward)입니다.


Understanding the implementation

The VESC communicates over UART using packets with the following format:

VESC는 다음의 포맷을 갖는 패킷을 사용하여 UART로 통신합니다:


    • One Start byte (value 2 for short packets and 3 for long packets)

    • One or two bytes specifying the packet length

    • The payload of the packet

    • Two bytes with a CRC checksum on the payload

    • One stop byte (value 3)


The higher level of the VESC communication code is the same for the USB, UART and CAN ports, so everything that can be done from BLDC Tool can be done from the other ports as well. Therefore I have abstracted out the higher layer of the communication into separate files so that it can be reused for CAN-bus and USB without modifying the rest of the code later.

VESC 통신 코드의 상위 레벨은 USB, UART 그리고 CAN 포트에 대해서도 동일합니다. 그래서 BLDC Tool로부터 할 수 있었던 것은 모두 다른 포트들에서도 할 수 있습니다. 그러므로 저는 통신의 상위 레이어를 분리된 파일들로 구체화 하였습니다. 그 결과 이것은 CAN 버스와 USB에 대해서 나중에 코드의 나머지 수정 없이 다시 사용할 수 있습니다.


The important files in the project, which you can use for your implementation, are the following. They are plain C files and don’t have any hardware dependencies.

여러분이 여러분의 구현을 위해서 사용할 수 있는 프로젝트에서 중요한 파일들은 다음과 같습니다. 일반 C 파일이며 어떤 하드웨어 의존성을 갖지 않습니다.


bldc_interface.c and bldc_interface.h


These files can assemble the payload for all the commands that the VESC supports. They can also interpret packets from the VESC and extract the data from them. Notice that only the payload is handled in these files, not the start, stop, length and checksum bytes since these are different for the CAN interface.

이들 파일은 VESC가 지원하는 모든 명령들의 페이로드(payload)를 조립할 수 있습니다. 이들 파일은 또한 VESC로부터 패킷을 번역하고 그들로부터 데이터를 추출할 수 있습니다. 이들은 CAN 인터페이스에서 다르기 때문에 start, stop, length 그리고 checksum bytes가 아닌 오직 페이로드만이 이들 파일에서 다룰 수 있다는 것을 기억하세요. 


datatypes.h


The data structures used by the VESC.

VESC에서 사용된 데이터 구조입니다.


buffer.c and buffer.h


Helper functions for for going between C types and byte arrays. These are used by the bldc_interface files.

C 타입 그리고 byte 배열사이에 Helper 기능들. 이들은 bldc_interface 파일에서 사용됩니다.

crc.c and crc.h


For calculating the CRC checksum

CRC checksum을 계산하기 위함


packet.c and packet.h


For assembling the packets for the VESC with start, stop, length and checksum bytes. These files also have a state machine where one byte received from the VESC can be added at a time to assemble a packet and check the checksum correctness.

start, stop, length 그리고 checksum bytes와 함께 VESC를 위한 패킷의 조립을 위함. 이들 파일은 또한 VESC로부터 수신된 한 바이트가 패킷을 조립하기 위해서 한번에 추가되고 checksum이 올바른지 체크할 수 있도록 하는 state machine을 갖습니다.


bldc_interface_uart.c and bldc_interface_uart.h


Connects packet and bldc_interface to provide a clean UART interface. This is where the user has to make the connection to the UART interface for the platform of choice.

깨끗한 UART 인터페이스 제공하기 위해서 패킷과 bldc_interface을 연결합니다. 이는 사용자가 선택한 플랫폼의 UART 인터페이스로 연결해야 하는 곳입니다.


All of these files rely heavily on function pointers. This might sound complicated at first, but it is actually quite convenient and easy to use. The connection between these files and the UART port is done in the file comm_uart.c, which is the file that you have to implement if you want to port this to a different platform. Also, if you decide to use some other port than UART such as CAN or USB, you only have to re-implement this file and the higher level implementation will work as before.

이들 파일 모두는 함수 포인터에 강하게 의존합니다. 이는 처음에 복잡하게 들려질 수 있습니다, 그러나 이는 실제로 매우 편리하고 사용이 용이합니다. 이들 파일과 UART 포트의 연결은 comm_uart.c 파일에서 이루어집니다. 이 파일은 여러분이 이를 다른 플랫폼으로 포트하기를 원한다면 구현해야만 하는 파일입니다. 또한 여러분이 UART보다 CAN 혹은 USB와 같은 다른 포트를 사용하기로 했다면 여러분은 단지 이 파일을 다시 구현해야 합니다. 그리고 상위 레벨 구현은 전과 같이 동작할 것입니다.


Making the platform-specific UART connection

This should be rather straight forward. The bldc_interface_uart files have three functions that have to be used:

이것은 오히려 직관적일 수 있습니다. bldc_interface_uart 파일은 3가지 함수를 갖습니다:


bldc_interface_uart_init


This is the init function that takes a function pointer to a function that you provide for sending data on the UART. You can use it something like this:

이것은 UART 상에 데이터를 보내기 위해 여러분 제공한 함수로 함수 포인터를 옮겨 놓는 함수의 초기화 함수입니다. 여러분은 이를 다음과 같이 사용할 수 있습니다:


/**

 * A function that will send the bytes in *data with length len on the UART

 */

static void send_packet(unsigned char *data, unsigned int len) {

// Your implementation

}

 

// Your init function

void comm_uart_init(void) {

// Initialize your UART...

 

// Initialize the bldc interface and provide your send function

bldc_interface_uart_init(send_packet);

}


bldc_interface_uart_process_byte


Call this function every time a byte is received on the UART with the received byte. It will run the state machine in the packet assembler and the callbacks in bldc interface will be called when the packets are ready.

UART 상에 한 바이트가 도착할 때마다 이 함수를 호출합니다. 이는 packet assembler에서 state machine을 동작시키고 bldc 인터페이스에서 callback은 패킷이 준비되었을 때 호출될 것입니다.


bldc_interface_uart_run_timer


Call this function every millisecond to reset the packet state machine after a timeout in case data is lost.

데이터를 잃어버린 경우에 대해서 timeout 후에 packet state machine을 리셋하기 위해서 매 ms 마다 이 함수를 호출합니다.


Notice that bldc_interface_uart_process_byte and bldc_interface_uart_run_timer can be omitted it you only plan to send data to the VESC and not read anything.

bldc_interface_uart_process_byte와 bldc_interface_uart_run_timer는 여러분이 VESC에 데이터를 보내고 어떠한 것도 읽지 않을 계획이라면 생략될 수 있습니다.

 

In this example project this is implemented in comm_uart.c. This implementation is a bit more complicated than necessary because it uses threads to run the data processing to not block the UART while running the callbacks and to not run the callbacks from an interrupt scope, but a much simpler implementation can also be done if you don’t have an RTOS. You could call bldc_interface_uart_process_byte directly from an interrupt handler every time you receive a byte.

이 예제 프로젝트에서 이것은 comm_uart.c에서 구현되어졌습니다. 이들 구현은 필요보다 다소 복잡합니다. 왜냐하면 이는 callback이 작동하는 동안 UART를 막지 많고 데이터 프로세싱을 위한 그리고 interrupt scope로부터 callback이 작동하는 것을 막기 위해서 스레드를 사용하기 때문입니다. 그러나 여러분이 RTOS를 갖고 있지 않다면 또한 훨씬 간단하게 구현될 수 있습니다. 여러분은 여러분이 한 바이트를 수신한 때마다 interrupt handler로부터 곧바로 bldc_interface_uart_process_byte를 호출할 수 있습니다.


Using bldc_interface

After you are done with the hardware specific UART implementation, you can use bldc_interface in your application. To set the current, duty cycle etc. just call the corresponding function from the setters e.g.

여러분이 하드웨어에 요구되는 UART 구현을 완료한 후에 여러분은 여러분의 애플리케이션에서 bldc_interface를 사용할 수 있습니다. 예를 들어, 전류와 듀티 싸이클 등을 설정하기 위해서 설정기(setters)로부터 관련함수를 호출합니다.


// Run the motor in current control mode with 10A commanded current

bldc_interface_set_current(10.0);


You can do everything that BLDC Tool can do, including changing the configuration (you should read the old configuration before updating it though). Notice that you have to call these functions at regular intervals to not trigger the timeout in the VESC that will release the motor if no new commands have been received for longer than the configured time for safety reasons. This can be done either by calling the corresponding setters at regular intervals or by calling the bldc_interface_send_alive function.

여러분은 BLDC Tool이 할 수 있는 모든 것을 할 수 있습니다, 설정을 변경(하지만 업데이트 전에 이전 설정을 읽어야만 합니다)하는 것을 포함해서 말입니다. 여러분은 VESC에서 timeout이 작동하지 않기 위해서 정기적인 간격으로 이들 함수를 호출해야 함을 기억하세요! VESC는 안전의 이유로 설정된 시간보다 긴 시간 동안 어떠한 새로운 명령을 수신할 수 없다면, 모터를 통제권을 내려놓습니다. 이는 정기적인 간격으로 관련 설정기를 호출하거나 bldc_interface_send_alive 함수를 호출하는 것에 의해서 해결될 수 있습니다.


Reading data

Reading data is done with getter functions and callback function pointers. For example, to get realtime data from the VESC, first set a callback to your function for handling the data using bldc_interface_set_rx_value_func and then request the data with bldc_interface_get_values. It can look something like this:

데이터를 읽는 것은 getter 함수와 callback 함수 포인터들과 함께 이루어집니다. 예를 들어, VESC로부터 실시간 데이터를 얻기 위해서 우선 bldc_interface_set_rx_value_func 함수를 사용해서 데이터를 핸들링 하기 위해서 여러분의 함수로 callback을 설정하세요 그리고 나서 bldc_interface_get_values 함수로 데이터를 요청합니다. 이는 다음과 같이 보여집니다:


// Your callback function for the received data. In this case you simply

// print it using printf.

void bldc_val_received(mc_values *val) {

printf("Input voltage: %.2f V\r\n", val->v_in);

printf("Temp:          %.2f degC\r\n", val->temp_pcb);

printf("Current motor: %.2f A\r\n", val->current_motor);

printf("Current in:    %.2f A\r\n", val->current_in);

printf("RPM:           %.1f RPM\r\n", val->rpm);

printf("Duty cycle:    %.1f %%\r\n", val->duty_now * 100.0);

printf("Ah Drawn:      %.4f Ah\r\n", val->amp_hours);

printf("Ah Regen:      %.4f Ah\r\n", val->amp_hours_charged);

printf("Wh Drawn:      %.4f Wh\r\n", val->watt_hours);

printf("Wh Regen:      %.4f Wh\r\n", val->watt_hours_charged);

printf("Tacho:         %i counts\r\n", val->tachometer);

printf("Tacho ABS:     %i counts\r\n", val->tachometer_abs);

printf("Fault Code:    %s\r\n", bldc_interface_fault_to_string(val->fault_code));

}


// Somewhere in your init code you can set your callback function(s).

bldc_interface_set_rx_value_func(bldc_val_received);


// Every time you want to read the realtime data you call the corresponding getter.

// This will send the get command to the VESC and return. When the data is received

// the callback will be called from the UART interface.

bldc_interface_get_values();


Have a look at main.c to see some examples of this.

예제를 보기 위해서 main.c를 보세요


That’s it! I hope this is enough to get started with UART communication to the VESC.

VESC로의 UART 통신을 시작하기에 충분하기를 희망합니다.



Posted by Nature & Life


센서없는 BLDC 모터의 startup 토크


Posted on August 16, 2014

One of the major challenges when working on my custom open source ESC was to get good startup torque and low-speed performance with sensorless motors. This challenge has been addressed in several places around the net:

저 개인적 오픈 소스 ESC를 만들 때 주요한 도전 중의 하나는 센서 없는 모터에서 좋은 startup 토크와 낮은 속도에서의 좋은 성능을 얻는 것이었습니다. 이 도전은 인터넷의 여러 군데에서 시도되어 왔습니다:


  • Team Novak은 왜 센서를 갖는 시스템이 센서 없는 시스템보다 우수한지를 설명한 글: 

http://teamnovak.com/tech_info/view_article/24


  • 역시 같은 주제를 다룬 전기 스쿠터(electric scooter)에 대한 글:

http://www.instructables.com/id/The-New-and-Improved-Brushless-Electric-Scooter-Po/step4/Controlling-the-Outrunner-Sensorless-or-Sensored/


  • 홀(hall) 센서를 갖는 모터로 개조한 metroboard: 

http://metro-board.com/brushless-outrunner-motor-testing/


  • 마블 전기 스케이트보드 또한 홀 센서를 사용한다:

http://howtomakeanelectricskateboard.wordpress.com/2014/06/22/marbel-kickstarter/


  • 표준 센서없는 hobby ESC를 갖는 electric longboard의 비디오입니다. 분명한 startup과 낮은 속도에서 이슈가 있습니다: 

http://www.youtube.com/watch?v=SNt70MdUh0Q


Techniques I used

센서 없이 부드럽고 빠른 startup을 얻기 위해서 저는 몇가지 트릭을 사용했습니다, 즉:


  • There are no hardware low-pass filters that introduce phase delay. Such filters can be avoided because the ADC samples are synchronized to the PWM timer and adjusted dynamically every time the duty cycle or switching frequency is changed.

  • 위상 지연(phase delay)을 야기하는 어떠한 하드웨어적인 저역 통과 필터(low-pass filters)들을 사용하지 않았습니다. 그러한 필터들은 ADC 샘플들이 PWM 타이머와 동기화되고, 듀티 싸이클 혹은 스위칭 주파수가 변할 때마다 동적으로 맞추기 때문에 피할 수 있습니다.


  • After a zero crossing, the area under the voltage is integrated until a threshold for commutation based on the motor parameters. This integration is robust agaist acceleration and provides good SNR since an integrator is a low-pass filter. 

  • Zero crossing 후에 전압의 면적은 모터 파라미터들에 근거한 commutation의 threshold까지 적분됩니다. 이 적분은 가속에 대해서 robust하고 적분기가 저역 통과 필터이기 때문에 좋은 SNR 특성을 제공합니다.


  • There is a parameter that defines the voltage coupling between the windings when measuring the back-emf. This make a huge difference when running at low speeds with low duty cycle. This compensation has a RPM dependence though, which is something I tried to avoid where possible because the RPM estimation has a delay and thus causes problems during acceleration. 

  • BEMF를 측정할 때 고정자의 코일 사이에 커플링 전압(voltage coupling)을 정의하는 파라미터가 존재하고 이것은 낮은 듀티 싸이클과 함께 낮은 속도로 회전할 때 큰 차가 존재합니다. 그러므로 이들의 보상은 RPM 의존성을 갖습니다. RPM 추정은 시간 지연을 야기하고 그러므로 가속 동안에 문제를 일의킬 수 있기 때문에 가능한한 여기서 피하고자 시도한 것입니다.


  • To get better voltage samples, the switching frequency is adaptive and proportional to the duty cycle. This is because the back-EMF only can be sampled during the ON-time of the PWM cycle and low duty cycles have short ON time. Since the motor is running slowly on low duty cycles, sampling and switching does not have to be as fast to keep up with the motor which makes this less of a problem. Lower switching frequency also decreases switching losses, which is a positive side-effect. 

  • 우수한 전압 샘플을 얻기 위해서 스위칭 주파수는 적응형(adaptive)이고 듀티 싸이클에 비례합니다. 이는 BEMF가 오직 PWM 싸이클의 ON 타임 동안에 그리고 짧은 ON 타임을 갖는 낮은 듀티 싸이클 동안에 샘플링되기 때문입니다. 모터는 낮은 듀티 싸이클에서 천천히 회전하기 때문에 샘플링과 스위칭은 모터를 따라 잡기 위해서 충분히 빠르지 않아야만 하고 이는 문제가 덜 되도록 합니다. 낮은 주파수 일수록 또한 switching loss를 감소시키는데 이는 부수적으로 긍정적인 효과를 갖는 다는 것입니다.


  • When the motor is un-driven, the back-emf on all phases is analysed to track the position, direction and speed of the motor. So when the motor is already spinning, the algorithm will begin in the exact state of the motor (position, duty-cycle, direction). 

  • 모터가 구동되지 않을 때 모든 상에 BEMF는 위치, 회전방향, 모터의 속도를 추적하기 위해서 분석됩니다. 그래서 모터가 이미 회전 중일 때 알고리즘은 모터의 정확한 같은 상태(위치, 듀티 싸이클, 회전방향)에서 시작할 것입니다.


  • I have also used some hack-ish conditions based on trial and error to improve the startup. 

  • 저는 startup을 개선하기 위해서 시행착오에 근거한 일종의 hack-ish 조건들을 또한 사용하였습니다.


  • Closed loop operation is used from the first commutation, since the measured values are clean enough when using these techniques. 

  • 폐루프 동작은 처음 commutation부터 사용되었는데 이는 이 기술들을 사용할 때 측정된 값이 충분히 깨끗하기 때문입니다.


다음 비디오는 이것이 어떻게 scorpion outrunner와 electric longboard에서 동작하는지를 보여줍니다:



Some examples with plots

** 모든 플롯은 모터 제어기에서 캡춰한 전압 샘플이고, 이는 PWM 타이머에 동기화되었습니다. 이것은 스위칭이 신호를 왜곡하기 때문에 오실로스코프 상에서 다르게 보일 수 있습니다. **


이것은 상전압이 전형적인 startup 시쿼스에 대해서 어떻게 보이는지를 보여줍니다. 여기서 듀티 싸이클을 5%로 설정되었습니다:



Even though the duty cycle is only 5%, the waveform is clean. This is because the switching frequency is low at this speed and the on-time is long enough to get good samples. The first commutation is a bit off at first since the motor is not perfectly aligned, but the second commutation already looks perfect. 

듀티 싸이클이 5%일지라도 파형은 깨끗합니다. 이는 스위칭 주파수가 이 속도에서는 낮고 ON 타임이 좋은 샘플을 얻기 위해서 충분히 길기 때문입니다. 처음 commutation은 모터가 완전하게 정렬되지 않았기 때문에 약간 벗어나지만 두번째 commutation은 이미 완벽하게 보입니다.


Here is another example with 35% duty cycle:

35% 듀티 싸이클의 또 다른 예입니다:



And this is the measured current for the same startup:

그리고 다음은 같은 startup에 대해서 측정된 전류입니다:



Here the phase voltage has some commutation spikes in the beginning because the current is quite high during acceleration, but even so the commutations are even and clean. 

여기에 상전압은 초기에 commtation spike를 갖습니다. 왜냐하면 전류는 가속동안에 매우 높기 때문입니다. 그러나 그렇다 하더라도 commutation은 고르고 깨끗합니다.


Here is an example where the duty cycle is ramped towards 100% rapidly:

다음은 듀티 싸이클이 100%까지 급하게 상승할 때의 예입니다:



Again, because of the current, there are commutation spikes on the voltage. The voltage from my lab power supply is also dropping because of the load. Even so, the commutations are even and clean. 

다시 전류로 인해서 전압 상에 commutation spike가 존재합니다. 제 전원공급기로부터 전압은 부하로 인하여 또한 떨어졌습니다. 그렇다 하더라도 commutation은 고르고 깨끗합니다.


Here is one unusual case, for which I had to restart the motor 20 or 30 times to get it captured:

다음은 캡쳐하기 위해서 모터를 20 혹은 30회 다시 시작한 경우의 비정상적인 경우입니다:



The first commutation happens to be exactly at a position where no torque is produced, which is as sub-optimal as it can get. On the current waveform, it can be seen that the current limit of 60A is applied. After 40 millisecond, the algorithm decides that nothing has happened for a too long time and adds an auto-commutation. After this, the motor is tracked right away and the commutations are nice and even. This works even though the motor was stalled with 60A for a while. 

처음 commutation은 어떠한 토크도 만들지 않는 위치에 정확히 발생하고 이것은 얻을 수 있는 차선책입니다. 전류 파형 상에서 60A의 전류 제한이 보여집니다. 40ms 후에 알고리즘은 어떠한 것도 너무 긴 시간에 일어나지 않았고 auto-commutation을 추가하기로 결정합니다. 이후에 모터는 즉시 추적되고 commutation은 훌륭하고 고르게 나타났습니다. 이것은 모터가 잠시 동안 60A로 실속한 경우 조차에서도 동작하였습니다.


Here is one example where I start the motor, switch off power after a few commutations and then switch on power again:

다음은 모터를 startup 하고 수 commutation 후에 전원을 크고 그리고 다시 전원을 켠 예입니다:


 

It can be seen that the un-driven back-emf is tracked perfectly while the power is gone and no commutation is missed or distorted during the transitions. 

전원이 커진 동안 구동되지 않은 BEMF가 완전하게 추적되고 어떠한 commutation도 놓치거나 천이 동안에 왜곡되지 않았음을 볼 수 있습니다.


Results

The electric longboard I have been working on starts perfectly smooth without sensors (see the video above).

제가 작업한 electric longboard는 startup 상에서 센서 없이 완벽하게 부드럽습니다(see the video above). 


I have also tested this on a 700w hub motor on an electric bicycle with extremely good results. Full throttle from a complete stop is smooth and no problem at all. I don’t miss hall sensors here one bit. 

저는 또한 전기 자전거인 700w hub 모터에서도 시험하였고 매우 우수한 결과를 얻었습니다. 완전한 정지로부터 full 스로틀까지 부드럽고 전혀 문제가 없었습니다. 저는 여기서 조금도 홀 센서를 그리워하지 않습니다.



Posted by Nature & Life


CAN(Controller Area Network) 프로토콜은 Bosch사에서 1986년 자동차 전장 용으로 처음 개발되었으며 1991년에 스펙 2.0이 발표되었고 현재 국제 표준 프로토콜로 성장하였습니다. 이는 호스트 컴퓨터 없이 3개 이상의 MCU나 controller, 장치들이 서로 다중 통신이 가능하며, 메시지는 우선순위 따라 ID(Identifier)를 할당하고 이 ID를 이용해 메시지를 구별합니다. 다양한 에러 감지 메커니즘이 상호 보완적으로 에러를 감지하기 때문에 높은 안정성을 보장하며, 메시지 전송 시 에러가 감지되면 자동적으로 해당 메시지를 즉시 재전송하는 기능이 있기 때문에 다른 프로토콜에 비해서 에러 회복 시간이 짧다는 것입니다.


차량에 적용하는 CAN 통신의 예제


버스가 유휴 상태인 경우 모든 CAN 노드는 메시지를 보낼 수 있고, 전송된 모든 메시지는 모든 노드에서 수신됩니다. 수신 노드는 ID 필터링 기준에 따라 메시지의 무시 여부를 판단합니다. 정교한 오류 감지 및 결함 격리 메커니즘과 문제가 발생한 메시지의 재전송으로 데이터 무결성과 일관성이 보장합니다. 또한 두 개 이상의 CAN 노드가 동시에 메시지 전송을 요청하는 경우 우선순위가 가장 높은 메시지가 즉시 버스 액세스 권한을 획득하도록 프로토콜이 보장합니다. 현재는 CAN의 안정성과 신뢰성 등 장점이 입증되어 항공기, 의료기 등에 사용되고 IoT application에서도 사용되는 추세입니다.


가장 쉽고 편리하고 익숙한 UART 통신은 별도의 transceiver가 필요없고 모든 MCU가 반드시 내장하게 됩니다. 그러나 보통 115200bps로 대략 10kbps로 느리며 한 바이트 통신이라는 단점이 있습니다. 예를 들어, 드론 제어를 할 경우에 다수의 센서 등과 같이 여러 바이트가 하나의 패킷이 되는 경우에는 패킷을 분리하는 작업이 용이하지 않다는 것입니다. 뿐만 아니라 UART는 하나의 장치와 두개의 선으로 독립적이야 하나 관성센서보드, 제어보드, 초음파센서보드, GPS, 무선통신만으로 5개를 초과하여 10가닥 이상이 필요하다는 것입니다.


CAN을 지원하는 MCU의 경우에는 한번에 8-byte 데이터를 전송하는 HW 패킷을 제공하므로 UART(보통 RS232/RS485) 통신에서는 패킷 통신을 위해 위에서 말한 것처럼 사용자가 일일이 패킷 형식을 만들어 주고 수신 받을 때도 그런 해석이 필요하지만 CAN은 8byte 데이터를 담는 HW 패킷 통신을 기본으로 함으로, 사용자는 데이터 버퍼에 데이터를 쓰고 전송만 하면 그 외 모든 처리는 하드웨어가 알아서 하므로 분산제어 분야 적용에도 용이하다는 것입니다.


CAN 통신의 특징:

1) 2선 twist pair를 이용한 전기적 differential 통신을 하므로 저가이며 전기적인 잡음에 매우 강해 신뢰성이 우수합니다.

2) 이론적으로 2,032개의 장치들을 연결할 수 있으나 CAN transceiver에 따라 최대 노드수(32, 64, 128...)는 달라 집니다.

3) 통신 버스를 공유하고 있는 CAN controller들은 모두가 마스터(master)가 될 수 있는 Multi-Master 통신을 합니다.

4) 40m 내에서 최대 1Mbps로 우수한 통신 속도를 갖습니다.

5) 8byte 데이터 전송을 하는 하드웨어 패킷을 제공합니다.

6) 다수의 MCU, DSP 등에 기본으로 내장되어 있습니다.

7) 통신 프로토콜/에러 처리를 하드웨어적으로 처리합니다.

8) PLUG & PLAY를 제공합니다.


CAN transceiver는 프레임이라는 패킷으로 CAN 네트워크에서 데이터를 전송하며, CAN 2.0B 버전 이후에 29bit 식별자를 갖는 extended data format의 간단한 설명입니다.



    • SOF(Start Of Frame) - 메시지 시작을 표시하며, 무부하 기간 이후 버스의 노드를 동기화하기 위해 사용

    • Identifier(ID, 식별자) - 메시지의 우선순위를 가리며 2진 값이 더욱 낮을수록 우선순위는 더욱 높아짐

    • RTR(Remote Transmission Request) - 원격 전송 요청 비트, 이 비트가 '0'이면 데이타 프레임이고, '1'이면 메세지가 원격 전송 요청을 의미

    • SRR(Substitute Remote Request) - 표준 프레임의 RTR 위치에 점유

    • IDE(IDentifier Extension) - 이 비트가 '0'이면 표준 CAN 식별자를 전송하고, '1'이면 확장 CAN 식별자를 전송을 의미

    • R0, R1 - 예약비트

    • DLC(Data Length Code) - 데이터 프레임의 데이터 바이트 수(0~8)

    • Data Field - 8byte(64bit) 전송 데이터, MSB부터 전송.

    • CRC(Cyclic Redundancy Check) - 16bit(15bit + 구획문자) 16bit checksum으로 오류 검출 Field.

    • ACK(ACKnowledge Field) - 2bit(1bit + 구획문자)로 오류가 없는 메시지가 전송되었다는 것을 나타냄.

    • EOF(End Of Frame Field) - 메세지(프레임) 종료 Field

    • IFS(Inter Frame Space) - 컨트롤러가 요구하는 시간의 양을 포함하며, 메시지 버퍼 영역에서 적절한 위치로 정확하게 수신된 프레임을 이동시킴


대표적인 CAN Transceiver로는 PCA82C250/C251가 있습니다.



'Flight Controller 이해 > 인터페이스' 카테고리의 다른 글

드론에서 사용되는 무선 통신  (1) 2017.03.09
TWI(I2C) 통신이란?  (0) 2014.03.24
Posted by Nature & Life


다음의 GitHub에서 bldc-tool의 소스 코드를 다운로드 합니다.

https://github.com/vedderb/bldc-tool


다음의 Qt 홈페이지에서 Qt 프로그램을 받기 위해서는 다음의 링크에서 'Get your open source package' 버튼을 클릭하여 installer 프로그램을 우선 다운로드 받아 실행시켜야 합니다.

Qt 다운로드


위 installer는 Qt 설치를 위해 필요한 콤포넌트를 설정하고 온라인으로 해당 패키지를 다운로드 하기 위한 프로그램으로 자신의 OS를 감지하여 받게 됩니다. 진행하다 보면 다운로드 하기 위한 콤포넌트를 설정하는 화면에서 아래와 같이 설정하고 진행하면 됩니다.



위 설정에서 버젼은 다른 버젼을 사용해도 무방할 것으로 생각되지만 필자는 용량의 이유로 위와 같은 컴포넌트만을 받기로 하였습니다. 필자는 Windows 10(32-bit) 환경입니다. 여기서 MinGW라는 것이 있는데 Qt는 cross platform으로 OS에 무관하며 컴파일러(예를 들어 g++, gdb, make) 등을 Linux 정신에 맞게 GNU를 사용합니다. 이를 Windows 환경에서도 사용할 수 있도록 만든 것이 MinGW이고 'Minimalist GNU for Windows'의 약자입니다. 참고로 64bit라 하여도 위 설정에서처럼 32bit를 사용해야 하며 반드시 설치하여야 합니다.


설치 후 Qt Creator를 실행시키고 메인 화면에서 'Open Project'를 클릭하여 다운로드 한 bldc-tool 폴더 내에 'BLDC_Tool.pro'를 선택하여 로드합니다. 다음은 'Tools' 메뉴에 'Options' 메뉴를 클릭합니다. 좌측 메뉴에서 'Build & Run'을 클릭하고 우측에서 'Qt versions', 'Compilers', 'Debuggers'를 아래와 같이 순차적으로 수정합니다.



위 화면에서와 같이 Qt와 MinGW가 정상적으로 설치되었다면 자동 감지(Auto-detected)되지만 그렇지 않은 경우 'Add' 메뉴로 일일이 각각 설정해 주어야 합니다. 그리고 위 화면에서 'Kits' 탭으로 이동하면 다음과 같은 화면을 볼 수 있습니다.



모든 것이 정상적이면 위와 같이 설정되고 그렇지 않으면 각 항에서 'Manage' 버튼으로 직접 수정해 주어야 합니다. 마지막으로 로드된 프로젝트 메인 화면 좌측 'Projects'를 클릭하고 빌드시 생성되는 파일들의 위치 정도를 설정해 주면 됩니다.



메인 화면의 'Build' 메뉴에서 빌드('Build All')하면 debug 폴터에 BLDC-Tool.exe 실행파일이 생성되고 'Build' 메뉴의 'Run'으로 실행시키면 됩니다. debug 폴더에서 실행 파일을 직접 클릭하여 실행시킬 수도 있는데 이 경우에는 *.dll 파일이 없다는 오류가 발생하는데 이는 정적(static)으로 빌드하였기 때문으로 배포시에 동적(dynamic) 빌드하면 해결됩니다.



Posted by Nature & Life


VESC 하드웨어(v4.8)의 회로도 입니다.

https://github.com/vedderb/bldc-hardware






Posted by Nature & Life