Study/Motor Control

[code analysis] 3상 인버터 보드 M1_inverter.c

얼죽아여뜨샤 2023. 2. 13. 15:14

 

1. 변수 설정

<12> float 형 설정 후 뒤에 'F' 를 붙여서 float인 것을 표시

<15> extern : 외부 변수 사용 -> SelEncoder 라는 외부 변수 사용

: SelEncoder은 인버터 보드1의 J5 커넷터에 에코더 케이블이 연결되어 있을 경우 Expressions 창에서 "SelEncoder" 값을 "0"으로 설정.

<18> Uint16 같은 type은 표와 같이 사용

<30> cc : Curent Control

<33> sc : Speed Control

<44> ul : unlimmit

<54> fb : feedback

<55> ff : feedfoward

 

<66~78> M2_inverter에 없는 부분

<76> Uint16 align_mode = 1;   // 초기값 1

<77> Uint16 Forback_mode = 1;   //초기값 0

 

 

2. M1_Inverter

 

3. M1_vf

vf : virtual frequency

<180>  theta_M1_vf = theta_M1_vf + 2 pi f t 

freq_M1_vf 의 초기값은 15 

Time(t) = 100us

=> 100us 주기로 가상각 생성

<181~184> 

theta_M1_vf 가 2pi보다 크면 가상각에 2pi를 빼주고 0 보다 작으면 가상 각에 2pi를 더해줌

<186,187> 각도를 sin(cos)에 넣어 각도 계산

<190> 가상의 회전 d축 전압을 기준 전압에 넣기

VM1de_ref_vf 의 초기값은 0V

VM1qe_ref_vf 의 초기값은 3V

<193~195> 동기좌표계를 정지 좌표계 d/q축으로 전압 지령

<198~200> 정지 좌표계 전압 지령을 이용해 a/b/c 상 전압 지령

(좌)동기좌표계로 정지좌표계로 변환 (우) 정지좌표계로 3상 전압 변환식

[결론] 가상각 세팅 후 a/b/c상 전압 지령

 

4. M1_align

<207> SelEncoder은 인버터 보드1의 J5 커넷터에 에코더 케이블이 연결되어 있을 경우 Expressions 창에서 "SelEncoder" 값을 "0"으로 설정.

=> M1에 Encoder이 부착되어 있다는 설정.

<209> EQep2Regs.QEPSTS.bit.FIMF == 0    // Encoder의 index(보통 Z상)에 marker가 안 들어왔기 때문에 0이라는 출력값이 사용된 것. (들어왔을 때가  1)

=> 우리가 사용한 엔코더는 로터리 엔코더이면서 인크리멘탈 형 엔코더이기에 A,B상 외의 Z상이 존재해 기준점을 잡기 위해 한번만 사용하는 상이 있다.

<211> 아직 기준점을 잡지 못했기 때문에 M1_vf() 를 사용해 기준점을 잡아 a/b/c상의 전압 지령까지 마친다.

 

Q. 그럼 M1_vf()함수를 돌리면 기준점을 잡을 수 있는 것?

 

<214> index marker가 들어왔으면 

<217> d축 정지 좌표계에 align 전압인가 

VM1ds_ref_align 의 초기값 2.5V

=> 바로 정지좌표계에 값을 인가해주는 것을 보니 동기좌표계에서 정지로 바꿀 필요 없음 -> 엔코더 없이 이미 기준점이 잡혀 있는 상태라면 바로 정지좌표계로???

<221~223> 정지좌표계 전압 지령을 이용해 a/b/c 3상 좌표계로 변환

 

<225> theta_M1 은 Inverter에서 사용하는 Angle

Init_theta_M1의 초기값은 0 

theta_M1을 Init_theta_M1에 더해준다.

<226~229> 초기 theta를 잡아주는 것이라서 0~2pi안의 값으로 판별을 위해 더(빼)해주는 값?

=> M1_vf의 <181~184>에도 가상각을 잡아줄 때와 같은 코드

<234~259> SelEncoder이 0이 아닐 때 해당하는 코드로 위의 코드와 형태 동일

SelEncoder이 1일 때는 M2_inverter에 Encoder연결 상태

 

[결론] 기준점을 잡지 못하면 M1_vf를 이용해 가상각 세팅 후 a/b/c상의 전압 지령하고, 기준점을 잡으면  a/b/c상 전압 지령 후 초기 각 세팅

회전자 위치각, 속도 측정 센서 : 엔코더(position sensor)

 

 

5. M1_current

d/q축 PI current 제어기

 

 

6. M1_speed

PI&nbsp; speed 제어기

 

7. M1_ForBack

M2에는 존재하지 않는 함수

 

ForBack

가정 1. Back emf

가정 2. Anti Wind-up시 overdamping 막기 위한 LIMIT 곡선 표현

=> 모두 틀림

모터가 순방향으로 점점 빨라지다가 2000이 되면 다시 역방향으로 돌고를 반복하는 함수였음

 

Q. rpm 변수 사용 -> speed관련 코드?

 

<323>  Flag_Out_Loop

<325> slope가 1이면

<327> rpm_m_ref에 slope_A가 더해져 rpm_m_ref에 계속 누적

slope 의 초기값은 1

slope_A 의 초기값은 2.5

rpm_m_ref 의 초기값은 0

rpm_ref 의 초기값은 1000

M1_ForBack_loocnt 의 초기값은 0

Forback_cnt_limit 의 초기값은 2000

<329> rpm_m_ref 가 rpm_ref 보다 커지면 

<331> rpm_m_ref 에 rpm_ref 값이 대입

<332> M1_ForBack_loocnt ++ 카운트 더해짐

<334> M1_ForBack_loocnt 가 Forback_cnt_limit 보다 커지면 -> slope,M1_ForBack_loocnt 는 0으로

=> limit의 상한 값 = 2000 (Forback_cnt_limit)

<342~358> slope가 0이면 (위와 형태 동일)

=> limit의 하한 값

 

rpm_m_ref의 값을 가지고

<360~373> 까지 M1_speed 코드와 동일 코드

 

[결론] Forback으로 limiter 설계 후 M1_speed code 실행

 

 

7-(1) Anti-windup 제어기

- 물리적인 입력과 출력

: 물리적 제한에 의해 상한값(Upper limit)과 하한값(Lower Limit) 존재

 

- 제어기 출력에 제한이 있는 경우

: 누적된 오차(적분 값)으로 인해 적분기 포화 현상 발생 (적분기의 Wind-up)

: 적분기 포화에 의해 오차의 부하가 반전되더라도 폐루프 제어가 실직적으로 동작하지 못하는 현상 발생

-> 이러한 현상 방지를 위해 적분기의 내부 값을 제어기 출력의 제한 여부에 따라 적절한 제한 필요

 

- Anti-Windup 기법

: 조건에 따라 적분하는 방법

: 적분기의 출력을 제한하는 방법

: 역계산에 의한 방법 => Forback?

 

- Anti-Windup 제어기 이득

 

8. M1_align_mode

M2에는 존재하지 않는 함수

 

 

<379> static 다른 파일에서 호출하지 못하는 함수

align_loop_cnt 를 1로 초기화

<381> align_mode 가 1 일 때

align_mode 의 초기값은 1

<383,384> Flag Align, Inverter를 1로 ON

<385> M1_align() 함수 호출

[M1_align()] 기준점을 잡지 못하면 M1_vf를 이용해 가상각 세팅 후 a/b/c상의 전압 지령하고, 기준점을 잡으면  a/b/c상 전압 지령 후 초기 각 세팅

=> M1_align()에서 전압, 각 세팅

<387> align_loop_cnt++ 가 align_Loop_MAX 보다 커지면 

<389~394> count 다시 1로 초기화, reset, align_mode 0으로 세팅, Forback_mode 1 로 set 

<396~399> align_loop_cnt++ 가 align_Loop_MAX 보다 크지 않으면 align mode 1로 계속 유지, Forback_mode 0으로 set

 

[결론] M1_align() 호출 후 각, 3상 전압 세팅하고 Forback_mode 1로 set

 

9. M1_Forback_mode

M2에는 존재하지 않는 함수

 

<407> 위의 M1_align_mode에서 Forback_mode를 1로 실행

<409~413> ForBack_mode가 1이 되면 Flag 3개가 ON되며 M1_Forback(), M1_current() 함수들을 실행

[M1_Forback] Forback으로 limiter 설계 후 M1_speed code 실행

[M1_current] PI 전류 제어기 구성

 

<415~420> Forback_mode가 0으로 되면 Flag current, Forback 이 OFF 된다.

 

[결론] M1_Forback_mode는 M1_align_mode와 유기적으로 움직이며 

M1_align_mode에서 M1_align동작 = 각, 3상 전압 세팅 -> M1_Forback_mode 동작 -> M1_ForBack() = limiter 실행 및 몇 Flag ON -> speed regulator 실행 

 

Q. ForBack 없이 Current regulator 실행 안하나? 

 

10. M1_reset()

 

 

 

 

M1_inverter.pdf
3.86MB

'Study > Motor Control' 카테고리의 다른 글

역기전력(Back-Elevtro Motive Force)  (0) 2023.02.16
SPMSM vs IPMSM 비교  (0) 2023.02.14
Motor generator set(M-G set)  (0) 2023.02.13
BLDC 모터와 PMSM 모터의 차이  (0) 2023.02.13
DC/BLDC/AC/PMSM motor  (0) 2023.02.12