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 상 전압 지령
[결론] 가상각 세팅 후 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
6. M1_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()
'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 |