6단계 정류를 사용한 BLDC 모터의 센서리스 속도 제어
이 예제에서는 120도 전도 모드를 사용해 6단계 정류 기법을 구현하고 3상 브러시리스 DC(BLDC) 모터의 속도를 제어합니다. 또한 Sensorless Six-Step Commutation 블록으로 생성된 듀티 사이클과 함께 기계적 속도를 사용하여 3상 고정자 전압을 제어하며, 결과적으로 회전자 속도도 제어합니다.


6단계 정류 알고리즘은 위 그림에 표시된 대로 3개의 모터 상을 각각 활성화합니다. 다시 말해, 모터의 각 상에 전원을 공급합니다. 이 알고리즘은 하나의 고정자 상이 활성화되어 있는 동안(즉, 120도) 역기전력이 일정하게 유지되도록 3상 고정자 권선에서 사다리꼴 역기전력을 생성합니다.
각 모터 상에 제때 전원을 공급하는 올바른 정류 패턴(또는 듀티 사이클)을 생성하려면 6단계 정류 알고리즘에 위치 피드백이 필요하며, 이는 상 권선의 역기전력에서 계산할 수 있습니다.
이 예제에서는 BLDC 모터의 유휴(또는 비여기) 상에서 측정된 모터 단자 전압을 사용하여 모터 상의 ON 및 OFF에 대한 스위칭 지점을 결정합니다.
360도 사이클에서 각 60도 구간은 전원이 공급된 상 2개와 유휴 상 1개로 구성됩니다. 이 구간에 있는 동안 유휴 상 역기전력은 다음 그림과 같이 하강하거나 상승합니다.

Sensorless Six-Step Commutation 블록은 각각의 60도 섹터 중에 유휴 모터 상(phase)에 있는 역기전력의 영점교차 지점을 사용하여 유휴 상의 활성화 순간을 결정합니다. 이 블록은 제때 유휴 상을 켜고 다른 상 중 하나를 끄기 위해 영점교차 지점에 30도 오프셋을 추가합니다.

모델
이 예제에는 시뮬레이션과 코드 생성을 모두 지원하는 타깃 모델 BLDCSensorlessSixStepControl이 포함되어 있습니다.
필요한 MathWorks 제품
타깃 모델을 시뮬레이션하려면 다음이 필요합니다.
Motor Control Blockset
Simscape Electrical
코드를 생성하고 모델을 배포하려면 다음이 필요합니다.
Motor Control Blockset
Embedded Coder
C2000 Microcontroller Blockset
Fixed-Point Designer(최적화된 코드 생성에만 필요함)
필수 하드웨어
이 예제에서는 다음 하드웨어 구성을 지원합니다.
LAUNCHXL-F28379D 제어기 + BOOSTXL-DRV8305 인버터
이러한 하드웨어 구성과 관련된 연결은 LAUNCHXL-F28069M and LAUNCHXL-F28379D Configurations 항목을 참조하십시오.
알고리즘
6단계 정류를 사용하여 모터를 구동하기 위해, 이 예제에서는 센서리스 6단계 정류로 전환하기 전에 충분한 역기전력이 생성되도록 먼저 회전자를 정렬한 다음 개루프 제어를 사용하여 회전자를 구동합니다.
이 예제에서는 모터를 다음 세 단계로 순차적으로 작동시킵니다.
1단계 – 모터 정렬
2단계 – 개루프 구동
3단계 – 제어된 정류
참고: 이 예제에서는 센서리스 6단계 알고리즘을 보정하여 모든 일반 BLDC 모터를 구동할 수 있는 워크플로를 따릅니다.
모터 파라미터 업데이트하기
1. 모터 파라미터를 가져오십시오. Simulink® 모델에는 디폴트 모터 파라미터가 사용되며, 이를 모터 데이터시트나 다른 소스의 값으로 바꿀 수 있습니다.
하지만 모터 제어 하드웨어가 있는 경우에는 Motor Control Blockset의 파라미터 추정 툴을 사용해서 해당 모터의 파라미터를 추정할 수 있습니다. 자세한 지침은 권장 하드웨어를 사용하여 PMSM 파라미터 추정하기 항목을 참조하십시오.
파라미터 추정 툴은 (MATLAB® 작업 공간에 있는) motorParam 변수를 추정된 모터 파라미터로 업데이트합니다.
2. 데이터시트나 기타 소스에서 모터 파라미터를 가져오는 경우에는 Simulink® 모델과 연결된 모델 초기화 스크립트에서 모터 파라미터와 인버터 파라미터를 업데이트하십시오. 자세한 지침은 제어 이득 추정 및 유틸리티 함수 사용하기 항목을 참조하십시오.
% Run this section to open model init script to update motor parameters open("BLDCSensorlessSixStepControlData.m");
참고: 이 예제를 사용하기 위해 필요한 기본 모터 파라미터는 모터 극쌍 개수와 모터의 정격 속도(베이스 속도)입니다.
1단계 – 모터 정렬
모터 정렬 단계에서 예제 알고리즘은 모터의 두 상(a상과 b상)에 전원을 공급합니다. 결과로 생성되는 자기장으로 인해 회전자가 a상 축에서 30도 위치(전기적 위치)에 정렬됩니다.

다음 코드를 실행하여 타깃 모델을 열고 모터 정렬 단계를 실행하도록 타깃 모델을 구성합니다.
open("BLDCSensorlessSixStepControl.slx"); Mode = 1; % Set Alignment mode
명령 Mode = 1을 실행하면 Sensorless Six-Step Commutation 블록을 사용하는 "BLDCSensorlessSixStepControl/Commutation Control/Commutation Control and Speed Measurement/ModeSelector/Mode1_Alignment" 서브시스템 Variant가 활성화됩니다. 이 블록은 동작 모드가 Alignment 로 선택되어 있고 다음과 같은 파라미터 값이 구성되어 있습니다.
정렬 듀티 사이클(범위: [0,1]) – alignmentDutyCycleTemp
정렬 시간(s) – alignmentTimeTemp

1. 다음 코드를 실행하여 정렬 파라미터를 구성합니다.
참고: 다음 코드를 실행하기 전에 사용 중인 모터에 따라 변수 alignmentDutyCycleTemp 및 alignmentTimeTemp의 값을 업데이트하십시오.
initialMotorPosition =0; % Enter a value between 0 - 360 degrees (Electrical) alignmentDutyCycleTemp =
0.3; % Range 0-1 alignmentTimeTemp =
0.5; % Alignment time in seconds
이 예제에서는 alignmentDutyCycleTemp 변수를 사용하여 DC 전압(alignmentDutyCycleTemp에 비례)을 계산하고 이를 alignmentTimeTemp 변수로 지정한 시간 동안 a상과 b상에 가합니다. alignmentDutyCycleTemp를 높이면, 인가되는 고정자 전압이 증가하고 이에 따라 모터에서 사용되는 DC 전류도 증가합니다. alignmentTimeTemp 를 높이면 모터에 DC 전압이 가해지는 지속 시간이 증가합니다. alignmentTimeTemp 값은 시뮬레이션을 사용하여 결정하거나, 하드웨어에 코드를 배포한 후 동일한 하드웨어에서 측정을 통해 결정할 수 있습니다.
alignmentTimeTemp 는 회전자가 알 수 없는 초기 위치에서 움직이기 시작해 a상을 기준으로 -30도라는 알려진 위치까지 이동하는 데 걸리는 시간입니다. alignmentTimeTemp는 모터 파라미터와 alignmentDutyCycleTemp 변수의 값에 따라 다릅니다.
2. 타깃 모델을 시뮬레이션하여, 정렬을 수행하고 설정된 alignmentDutyCycleTemp 값에 대한 alignmentTimeTemp 값을 결정합니다.
3. 또는 하드웨어 탭에 있는 빌드, 배포, 시작 버튼을 클릭하여 타깃 모델을 제어기 보드에 배포합니다. 호스트 모델을 열어 모터를 제어하고 모터에 필요한 alignmentTimeTemp 값을 측정합니다.
참고: 하드웨어에서 정렬 시간을 측정하려면 모터에서 사용 가능한 물리 센서(예: 쿼드라쳐 인코더 센서)와 LAUNCHXL-F28379D 제어기 보드를 함께 사용하도록 예제 모델과 호스트 모델을 수정해야 합니다.

2단계 – 개루프 구동
알고리즘에서 회전자를 정렬한 후 (사전 정의된 가속도를 사용하는 6단계 모드에서) 모터의 후속 상에 순차적으로 전원을 공급하여 회전자를 당기고 무부하 또는 저부하 상태로 구동하여 모터 속도를 점진적으로 높입니다. 이 예제에서는 개루프 단계를 사용하여, 정확히 측정하기에 충분할 만큼의 역기전력이 생성될 때까지 모터 속도를 높입니다.
다음 코드를 실행하여, 구해 놓은 정렬 파라미터를 정의하고 모터 정렬과 개루프 실행을 위한 타깃 모델을 구성합니다.
open("BLDCSensorlessSixStepControl.slx"); Mode = 2; % Set Alignment + Open Loop mode initialMotorPosition = 0; alignmentDutyCycle = alignmentDutyCycleTemp; % Obtained from previous step alignmentTime = alignmentTimeTemp; % Obtained from previous step
명령 mode = 2 를 실행하면 Sensorless Six-Step Commutation 블록을 사용하는 BLDCSensorlessSixStepControl/Commutation Control/Commutation Control and Speed Measurement/ModeSelector/Mode2_AlignAndOpenLoop 서브시스템 Variant가 활성화됩니다. 이 블록은 동작 모드가 Alignment -> Open-loop run 으로 선택되어 있고 파라미터에 대해 다음 값이 구성되어 있습니다.
개루프 듀티 사이클(범위: [0,1]) – openLoopDutyCycleTemp
목표 개루프 속도(RPM)– targetOpenLoopSpeedTemp
목표 개루프 속도에 도달하기까지의 램프업 시간(s) – rampUpTimeTemp
제어된 정류로의 전환을 시작하기 위한 개루프 속도(RPM) - openLoopSpeedForCCTemp

targetOpenLoopSpeedTemp 및 rampUpTimeTemp 파라미터는 목표 개루프 속도를 달성하기 위해 예제에 사용되는 가속도를 정의합니다.
참고: 가속도(targetOpenLoopSpeedTemp/rampUpTimeTemp) 값이 너무 높거나 openLoopDutyCycleTemp가 너무 낮으면 모터를 개루프 제어를 사용하여 구동하지 못하거나 모터가 짧게 구동된 후 정지할 수 있습니다. 따라서, 이 3가지 파라미터를 모터에 맞춰 적절히 설정해야 합니다.
제어된 정류로의 전환을 시작하기 위한 개루프 속도(RPM)(openLoopSpeedForCCTemp) - 이 속도에 도달한 후에 알고리즘은 모터 상 전압 수집 프로세스를 시작합니다. 측정된 유휴 모터 상 전압에서 역기전력 영점교차가 감지되고 모터 속도가 계산됩니다. 역기전력 영점교차는 (전기각으로) 60도마다 발생하며, 알고리즘은 연속된 두 영점교차 사이의 시간 샘플 수를 세는 카운터를 실행하고 이 카운터 값을 사용하여 모터 속도를 결정합니다. openLoopSpeedForCCTemp 변수는 예제 알고리즘이 모터 속도를 계산하기 위해 영점교차를 감지하기 시작해야 하는 최소 속도를 정의합니다. 이 값은 targetOpenLoopSpeedTemp의 값보다 작은 값으로 설정해야 합니다.
1. 다음 코드를 실행하여 개루프 제어 파라미터를 구성합니다.
참고: 다음 코드를 실행하기 전에, 사용 중인 모터에 따라 변수 openLoopDutyCycleTemp, targetOpenLoopSpeedTemp, rampUpTimeTemp, openLoopSpeedForCCTemp의 값을 업데이트하십시오.
openLoopDutyCycleTemp =0.4; targetOpenLoopSpeedTemp =
800; rampUpTimeTemp =
0.7; openLoopSpeedForCCTemp =
500;
2. 타깃 모델을 시뮬레이션하여, 시뮬레이션에서 개루프 제어를 사용해 모터를 구동합니다. 이전 파라미터를 수정하고 타깃 모델을 다시 실행하여 모터 속도의 변동을 모니터링합니다. (아래 그림 참조)
3. 또는 하드웨어 탭에 있는 빌드, 배포, 시작 버튼을 클릭하여 타깃 모델을 배포하고, 하드웨어에서 모터를 구동하여 설정된 파라미터를 확인합니다. 호스트 모델을 열어 모터를 제어하고 모터 속도를 모니터링합니다. 모터가 실제로 회전 중인지 관찰하고 모터 속도가 targetOpenLoopSpeedTemp의 설정 속도에 이를 때까지 선형적으로 증가하는지 확인합니다.
팁: 하드웨어 배포의 경우, 속도 센서(예: 쿼드라쳐 인코더 센서 또는 홀 센서)가 있으면 이를 사용하여 계산된 속도 값을 속도 센서 출력값과 비교할 수 있습니다.
시뮬레이션을 실행한 후 애플리케이션 요구 사항을 충족하는 올바른 값으로 openLoopSpeedForCCTemp 를 수정할 수 있습니다. 이 변수(openLoopSpeedForCCTemp)를 모터 정격 속도의 10%로 설정하는 것이 좋습니다.
참고: 제어된 정류로 전환하기 전에, 이 속도에서 정확하게 감지될 수 있을 만큼 충분한 역기전력이 생성되도록 openLoopSpeedForCCTemp 변수를 적절히 구성하십시오.
목표 개루프 속도(RPM)(targetOpenLoopSpeedTemp) 파라미터를 모터 정격 속도의 20%로 설정하는 것이 좋습니다.

예제와 다른 모터를 사용 중인 경우, 이 단계가 끝나면 (파라미터가 올바르게 설정되었다는 전제 하에) 해당 모터는 정렬되어 속도 측정이 활성화된 상태로 목표 개루프 속도(RPM)에 도달할 때까지 개루프에서 구동될 수 있어야 합니다.
3단계 – 제어된 정류
개루프 6단계 제어를 사용하여 모터를 구동하고 속도 수집을 완료하면 폐루프 제어 정류를 사용하여 모터를 구동할 수 있습니다. 이 예제에서는 모터 역기전력 영점교차를 감지하여 BLDC 모터의 각 상에 적용되는 6단계 정류 패턴(듀티 사이클 형태)을 정확하게 생성하는 Sensorless Six-Step Commutation 블록을 사용합니다. 이 블록은 측정된 모터 속도도 출력값으로 제공하며, 이 값은 모터 속도를 제어하는 데 사용됩니다.
다음 코드를 실행하여, 제어된 정류 파라미터를 정의하고 모터 정렬, 개루프 실행, 제어된 정류에 맞게 타깃 모델을 구성합니다.
open("BLDCSensorlessSixStepControl.slx"); Mode = 3; % Set Alignment + Open Loop + Controlled commutation mode initialMotorPosition = 0; % Below variables are obtained from previous steps alignmentDutyCycle = alignmentDutyCycleTemp; alignmentTime = alignmentTimeTemp; openLoopDutyCycle = openLoopDutyCycleTemp; targetOpenLoopSpeed = targetOpenLoopSpeedTemp; rampUpTime = rampUpTimeTemp; openLoopSpeedForCC = openLoopSpeedForCCTemp;
명령 mode = 3을 실행하면 Sensorless Six-Step Commutation 블록을 사용하는 BLDCSensorlessSixStepControl/Commutation Control/Commutation Control and Speed Measurement/ModeSelector/Mode3_AlignOpenLoopAndCommutation 서브시스템 Variant가 활성화됩니다. 이 블록은 동작 모드가 Alignment -> Open-loop run -> Controlled commutation 으로 선택되어 있고 다음과 같은 파라미터 구성을 가집니다.
제어된 정류로의 전환을 완료하는 데 필요한 속도 샘플 수 – numSpeedSamplesForCC
필터 지연(Tf) 및 자기 소거 시간(Td)에 대한 보상 – 대화 상자를 통해 지정
전압 센싱 필터로 인한 시간 지연, Tf(s) – filterTimeDelay
자기 소거 시간, Td(s) – demagTime

개루프 구동 단계에서 모터 속도가 제어된 정류로의 전환을 시작하기 위한 개루프 속도(RPM) 파라미터보다 크면 전압 수집 프로세스가 시작되는데, 이 프로세스가 진행되는 동안 이 예제에서는 모터 역기전력의 감지된 영점교차를 바탕으로 모터 속도를 계산하기 시작합니다. 이 예제에서는 최소 개수의 연속된 속도 샘플이 제어된 정류로의 전환을 시작하기 위한 개루프 속도(RPM)보다 큰 경우에만 폐루프 제어 정류 단계로 제대로 전환됩니다. 이 최소 샘플 개수는 제어된 정류로의 전환을 완료하는 데 필요한 속도 샘플 수 파라미터로 정의됩니다.
이 프로세스를 통해 모터는 폐루프 제어로 전환되기에 앞서 (영점교차 지점을 정확히 감지하기에) 충분한 역기전력이 생성되는 최소 속도에 도달하며, 그 이상의 속도를 계속 유지하게 됩니다.
1. 다음 코드를 실행하여 폐루프 제어 파라미터를 구성합니다.
참고: 다음 코드를 실행하기 전에, 사용 중인 모터에 따라 변수 numSpeedSamplesForCC, filterTimeDelay, demagTime 의 값을 업데이트하십시오.
numSpeedSamplesForCC =10; filterTimeDelay =
0.00046183; demagTime =
0.000175;
개루프 구동 후에 제어된 정류로 전환하는 예제의 경우, numSpeedSamplesForCC 변수를 사용하여 openLoopSpeedForCC를 초과해 연속해서 측정되어야 하는 속도 샘플 개수를 지정합니다.
전압 측정 회로 필터 지연
일반적으로 모터 상 전압 측정에는 스위칭 잡음 감쇠를 위한 하드웨어 또는 소프트웨어 필터가 포함됩니다. 이러한 필터는 측정되는 모터 상 전압 신호에 시간 지연(군지연이라고도 함)을 발생시키기 때문에 영점교차 감지가 지연되며, 결국 잘못된 정류 패턴의 생성으로 모터가 멈출 가능성이 있습니다.
BOOSTXL-DRV8305 인버터는 전압 측정 회로에서 1차 RC 필터(필터 시정수 461.83µs)를 사용합니다. filterTimeDelay 변수는 예제 알고리즘에 이 시간 지연을 지정합니다. 알고리즘에서 이 변수를 사용하여 전압 측정 회로에 사용된 필터로 인한 시간 지연을 보정하고, 이를 통해 영점교차 지점을 정확하게 감지해 정확한 순간에 모터 상에 전원을 공급할 수 있습니다. 따라서 이 변수를 업데이트하면 예제 알고리즘이 위상 지연 없이 정확한 정류 시퀀스를 생성할 수 있습니다.
이 예제에서는 전압 측정 회로 필터의 차단 주파수보다 상당히 낮은 모터 속도를 사용하므로, 군지연이 필터 시정수와 대략 같다고 가정합니다. 따라서 LAUNCHXL-F28379D 제어기 카드 + 인버터 조합의 경우, 이 예제에서는 필터 지연 값 461.83µs를 사용합니다.
일부 응용 사례에서는 군지연 값이 필터의 차단 주파수에 종속되어 모터 속도에 따라 달라질 수 있습니다. 이러한 경우, Sensorless Six-Step Commutation 블록의 필터 지연(Tf) 및 자기 소거 시간(Td)에 대한 보상 파라미터를 Input port로 설정할 수 있으며, 그러면 예제 알고리즘이 입력 포트를 통해 실시간으로 군지연 값을 감지할 수 있습니다.
자기 소거 시간
예제 알고리즘이 모터 상을 정류하는 경우(예: A상에서 B상으로 전환), A상의 잔차 하강 전류가 측정 대상인 모터 역기전력에 일시적 강하를 유발하는데 이는 A상 권선의 자기 소거 때문입니다. 이 전압 강하는 다음 그림과 같이 영점교차, 즉 Vdc/2의 선 아래로 내려갈 수 있습니다.

측정된 모터 역기전력은 결국 영점교차선 위로 상승한 다음 실제 영점 교차 지점(위 그림의 Tz)에 닿습니다. 따라서 측정된 역기전력은 60도 구간에 있는 동안 3개의 영점교차 지점을 갖게 되는데, 처음 두 지점은 정류 단계의 자기 소거에 따른 것입니다.
이러한 동작으로 인해 예제의 센서리스 알고리즘은 측정된 역기전력이 영점교차선을 위쪽으로 교차할 때까지 기다려야 실제 영점교차 지점을 감지하기 시작할 수 있습니다. 이 대기 기간(고정자 상 자기 소거 시점과 역기전력이 영점교차선을 위쪽으로 교차하는 시점 사이의 시간)을 자기 소거 시간이라고 합니다. 예제 알고리즘에서 두 번째 영점교차를 올바르게 감지하고 사용하도록 하려면 demagTime 변수를 사용하여 자기 소거 시간(Td)을 지정해야 합니다. 블랭킹 시간이라고도 하는 자기 소거 시간(Td) 동안, 알고리즘은 스퓨리어스 영점교차 감지를 방지하기 위해 전압 신호를 수집하지 않습니다.
정확한 정류 및 속도 측정을 보장하기 위해 demagTime 변수를 사용하여 Td보다 크거나 같지만 실제 영점교차 시간(Tz)보다는 작은 최대 시간 값을 지정하십시오. 일부 응용 사례에서는 자기 소거 시간 값이 모터 부하 조건의 변동에 따라 실시간으로 변할 수 있습니다. 이러한 경우, Sensorless Six-Step Commutation 블록의 필터 지연(Tf) 및 자기 소거 시간(Td)에 대한 보상 파라미터를 Input port로 설정할 수 있으며, 그러면 예제 알고리즘에서 입력 포트를 통해 실시간으로 자기 소거 시간 값을 받을 수 있습니다.
2. 타깃 모델을 시뮬레이션하여, 시뮬레이션에서 센서리스 6단계 정류를 사용해 속도 제어로 모터를 구동합니다. 필요한 경우 이전 파라미터를 수정하고 모터 속도의 변동을 모니터링합니다.
3. 하드웨어 탭에 있는 빌드, 배포, 시작 버튼을 클릭하여 타깃 모델을 배포하고 하드웨어에서 폐루프 실행을 보정합니다. 호스트 모델을 열어 모터 속도를 제어합니다.
참고: Sensorless Six-Step Commutation 블록이 제어된 정류 단계에 진입하는 즉시, Comstatus 출력 포트가 high로 전환됩니다. 이는 속도 제어기를 활성화하고 모터를 폐루프 속도 제어에서 구동하는 데 사용됩니다.










