안녕하세요, 제어쟁이입니다.
대기업에서 전동화(모터·인버터) 시스템을 개발하고 있는 현업 엔지니어입니다.
양산 프로젝트에서 회로·PCB·펌웨어·제어 알고리즘까지 직접 다뤄온 경험을 바탕으로, 유튜브/네이버 블로그 "인사이드 임베디드" 를 운영하면서 임베디드 개발자분들을 위한 교육 콘텐츠를 만들고 있습니다.
책이나 강의실에서는 잘 다루지 않는, 현장에서 진짜로 쓰이는 부분을 풀어내려고 합니다 :)
글로벌 자동차 OEM 협업
3상 인버터 하드웨어 개발 (회로 / PCB)
BLDC · PMSM · WFSM(권선형 계자 동기전동기) 제어 알고리즘 개발
전동화 시스템 개발 / 검증 프로세스 전반
실차 · 벤치 기반 평가 경험
카페 : https://cafe.naver.com/insideembedded?iframe_url=/MyCafeIntro.nhn%3Fclubid=31273003
블로그 : https://blog.naver.com/sw_engineer-
강의
로드맵
전체 1수강평
- PMSM 벡터제어 완전정복 - 이론, Matlab, STM32 실습까지!
- 전동킥보드로 배우는 임베디드 실전 프로젝트
- PMSM 벡터제어 완전정복 - 이론, Matlab, STM32 실습까지!
- PMSM 벡터제어 완전정복 - 이론, Matlab, STM32 실습까지!
게시글
질문&답변
스위치 입력 - 실습 LED가 환하게 들어오지 않습니다.
안녕하세요, 제어쟁이입니다.회로도와 코드를 같이 확인해보니, 현재 작성하신 코드 자체는 큰 문제 없어 보입니다. FLT_LED는 PC6에 연결되어 있고, LED 회로 구조상 PC6이 LOW가 되었을 때 LED가 켜지는 Active-Low 방식입니다. 또한 SWITCH 신호는 PD4에 연결되어 있고, 회로상 R11 1kΩ으로 3.3V에 풀업되어 있다가 스위치를 누르면 GND로 떨어지는 구조입니다. 따라서 코드에서 PD4가 HIGH이면 스위치를 누르지 않은 상태로 보고 PC6을 HIGH로 만들어 LED를 끄고, PD4가 LOW이면 스위치를 누른 상태로 보고 PC6을 LOW로 만들어 LED를 켜는 흐름은 회로와 맞습니다.다만 한 가지 확인해보셔야 할 부분이 있습니다. 보드에 스위치가 두 개가 있는데, 하나는 리셋 스위치이고 하나는 실습용 스위치입니다. 혹시 실습용 스위치가 아니라 리셋 스위치를 누르고 계신 것은 아닌지 먼저 확인해보시면 좋을 것 같습니다. 리셋 스위치를 누르면 MCU가 리셋되기 때문에 LED가 순간적으로 깜빡이거나 예상과 다르게 동작하는 것처럼 보일 수 있습니다.그리고 전원 공급 방식도 확인이 필요합니다. ST-LINK의 3.3V만 연결한 상태에서 테스트하면 보드 전체 전원이 안정적으로 공급되지 않을 수 있습니다. 이 보드는 원래 24V 전원을 인가한 뒤 보드 내부 전원회로를 통해 3.3V가 만들어지는 구조이기 때문에, 가능하면 24V 전원을 정상적으로 인가한 상태에서 다시 테스트해보시는 것을 권장드립니다. ST-LINK는 다운로드와 디버깅용으로 연결하고, 보드 전원은 보드가 의도한 입력 전원으로 공급하는 방식이 더 안전합니다.정리하면, 현재 코드의 핀맵이나 if문 논리 자체는 회로도 기준으로 맞습니다. 우선 실습용 스위치를 누르고 있는지, 그리고 ST-LINK 전원만 사용한 상태가 아니라 24V 입력 전원을 인가해서 보드 내부에서 3.3V가 정상적으로 생성된 상태인지 확인해보시면 좋겠습니다. 제가 지금 외부 출장 중이라 같은 보드 환경에서 바로 대신 테스트해드리기는 어려운 상황이라, 위 두 가지를 먼저 확인해보시고 결과를 알려주시면 추가로 같이 원인을 좁혀보겠습니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 16
질문&답변
I/F 제어 d축정렬 질문
안녕하세요, 제어쟁이입니다.전류 피드백은 어떻게 나오고 있을까요?지령으로 준 시뮬링크 블록 보여주시면 감사하겠습니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 15
질문&답변
SPMSM 문의
안녕하세요, 제어쟁이입니다.이 부분은 운전 단계와 d–q축의 기준이 달라서 생긴 혼동입니다.먼저 일반적인 회전자 자속 기준 FOC에서는 d축을 영구자석 자속 방향, q축을 그와 전기각 90°인 방향으로 정의합니다. SPMSM의 토크식은(사진)이며, SPMSM은 L_d = Lq이므로(사진)가 됩니다. 따라서 정상적인 토크 제어 구간에서는 보통 d축 전류는 0A, q축에 전류를 인가하여 제어합니다.강의에서 d축 전류를 조절한다고 한 것은 초기 d축 정렬이나 I/F 시동 구간을 설명한 것으로 보입니다.초기 d축 정렬에서는 아직 회전자 위치를 정확히 알 수 없기 때문에, 제어기가 임의로 정한 d축 방향에 일정한 전류를 인가합니다. 그러면 고정된 방향의 고정자 자계가 만들어지고, 회전자 영구자석은 그 자계 방향으로 정렬되려는 토크를 받습니다. 처음에는 제어기가 정한 d축과 실제 회전자 d축 사이에 각도 차이가 있으므로 회전 토크가 발생하고, 회전자가 해당 방향으로 이동합니다. 정렬이 완료되어 두 축이 일치하면 각도 차이가 0이 되므로 토크도 0이 되고, 회전자는 그 위치에 고정됩니다.즉, 정렬 시 회전하는 이유는 실제 회전자 d축에 전류가 정확히 일치해서가 아니라, 처음에는 인가한 전류 벡터와 회전자 자속 사이에 각도 차이가 있기 때문입니다. 실제 회전자 d축과 전류가 완전히 일치한 상태에서는 SPMSM의 지속적인 회전 토크가 발생하지 않습니다.I/F 제어도 비슷한 원리입니다. I/F 제어에서는 지령 주파수를 적분해 가상의 회전각을 만들고, 그 가상 좌표계의 d축에 일정한 전류를 인가하는 방식을 사용할 수 있습니다. 이 가상의 d축을 서서히 회전시키면 고정자 자계도 회전하고, 회전자 영구자석이 그 회전자계를 따라가면서 회전합니다.이때 회전자는 가상의 전류축을 완전히 같은 각도로 따라가는 것이 아니라 일정한 부하각을 두고 따라갑니다. 따라서 인가 전류를 실제 회전자 좌표계에서 보면 q축 성분이 생기며 토크가 발생합니다. 정리하면 다음과 같습니다.정상적인 회전자 자속 기준 SPMSM FOC: d축전류 : 0A, q축 전류로 토크 제어초기 d축 정렬: 일정한 d축 전류를 인가하여 회전자를 특정 위치로 정렬I/F 시동: 일정한 전류 벡터를 회전시켜 회전자가 동기적으로 따라오도록 구동추가 질문 사항 있으시면 댓글 부탁드립니다. 감사합니다.
- 좋아요수
- 0
- 댓글수
- 3
- 조회수
- 17
질문&답변
벅컨버터 COMP핀 주파수 보상회로 계산 시 R_ESR값
안녕하세요, 제어쟁이입니다.좋은 질문 감사합니다.먼저 단위부터 정리하면, 강의자료에 사용된 값은 0.5mΩ가 아니라 5mΩ입니다.그리고 여기서 말하는 R_ESR은 입력단에 있는 1200uF 벌크 커패시터의 ESR이 아니라, 인덕터 뒤쪽에 있는 출력 커패시터의 등가 ESR입니다.즉, TPS54360의 COMP 핀 보상회로를 계산할 때 들어가는 R_ESR은 출력 커패시터가 가지는 ESR 때문에 생기는 zero 위치를 반영하기 위한 값입니다.이번 회로에서는 출력단에 22uF 세라믹 커패시터 2개와 100nF 바이패스 커패시터를 사용했습니다. 100nF는 고주파 노이즈 대응용이고, 보상 계산에서 주로 보는 출력 커패시터는 22uF 두 개 병렬 구성입니다.질문에서 말씀하신 0.5V / 0.58A로 계산한 값은 아닙니다.여기서 0.5V는 부하 전류가 변할 때 허용하는 과도응답 전압 변동량입니다.반면 0.58A는 인덕터에 흐르는 스위칭 리플 전류입니다.두 값은 서로 다른 조건에서 나온 값이기 때문에 단순히 나누어서 ESR을 구하면 안 됩니다.데이터시트에 나오는 “출력 리플 전압을 인덕터 리플 전류로 나누는 방식”은 실제 커패시터의 ESR을 구하는 식이라기보다는, 출력 리플 조건을 만족하기 위해 ESR이 어느 정도 이하이면 되는지를 확인하는 상한 검토식입니다.예를 들어 출력 리플 요구조건을 0.12V로 보고, 인덕터 리플 전류를 0.58A로 보면 대략 0.207Ω, 즉 207mΩ 정도가 나옵니다.이 말은 실제 ESR이 207mΩ이라는 뜻이 아니라, 출력 리플 관점에서 ESR이 이 값보다 충분히 작으면 된다는 의미입니다.실제 사용한 세라믹 커패시터는 전해 커패시터와 다르게 ESR이 매우 낮습니다. 일반적으로 이런 MLCC는 고주파 영역에서 mΩ 단위의 낮은 ESR을 가지므로, 출력 리플 조건에서는 충분히 여유가 있습니다.그래서 강의에서는 보상회로의 1차 계산을 위해 저 ESR 세라믹 커패시터의 대표값으로 5mΩ를 사용했습니다.여기서 중요한 것은 “이 커패시터의 ESR이 정확히 5mΩ이다”라는 의미가 아니라, “저 ESR 세라믹 출력 커패시터를 사용했을 때 보상 계산에 반영하기 위한 대표 모델값”으로 이해하시면 됩니다.TPS54360 같은 전류모드 벅 컨버터에서 출력 커패시터 ESR은 ESR zero라는 주파수 위치를 만듭니다. 쉽게 말하면, 출력 커패시터의 용량과 ESR 조합에 의해 제어 특성이 바뀌는 지점이 생긴다고 보면 됩니다.강의 계산에서는 출력 커패시터를 약 37uF 수준으로 보고, ESR을 5mΩ로 두었습니다. 이 경우 ESR zero는 약 861kHz 부근에 생깁니다.반면 실제 보상회로에서 목표로 잡은 크로스오버 주파수는 약 14kHz 수준입니다.즉, ESR zero가 우리가 제어하려는 대역폭보다 훨씬 높은 곳에 있습니다. 그래서 실제 ESR이 5mΩ보다 조금 작거나 커지더라도, 이 설계에서 COMP 보상값이 크게 바뀌지는 않습니다.예를 들어 실제 병렬 세라믹 커패시터의 등가 ESR이 5mΩ보다 더 낮다고 보면, ESR zero는 더 높은 주파수로 이동합니다. 하지만 이미 목표 크로스오버 주파수보다 충분히 높은 영역이기 때문에, 전체 보상 설계 결과에는 큰 영향을 주지 않습니다.정리하면 다음과 같습니다.이 R_ESR은 입력 벌크 커패시터가 아니라 출력 커패시터 뱅크의 ESR입니다.5mΩ는 0.5V / 0.58A로 계산한 값이 아닙니다.0.5V는 과도응답 전압 변동 조건이고, 0.58A는 인덕터 리플 전류이므로 서로 나누면 안 됩니다.실제 사용한 22uF 세라믹 커패시터 2개 병렬 구성은 ESR이 매우 낮기 때문에 출력 리플 조건에서는 충분히 여유가 있습니다.보상회로 계산에서는 저 ESR MLCC의 대표 모델값으로 5mΩ를 사용했고, ESR zero가 목표 제어 대역보다 훨씬 높은 곳에 있기 때문에 설계 결과가 이 값에 크게 민감하지 않습니다.따라서 강의에서 사용한 R_ESR = 5mΩ는 실제 부품 ESR을 전압/전류로 역산한 값이 아니라, TPS54360 보상회로 계산에서 저 ESR 세라믹 출력 커패시터의 특성을 반영하기 위해 사용한 대표값이라고 이해하시면 됩니다.감사합니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 28
질문&답변
자화 인덕턴스 변동분 문의
안녕하세요, 제어쟁이입니다.좋은 질문입니다. 이 부분은 충분히 헷갈릴 수 있습니다.결론부터 말씀드리면, 여기서 나오는 cos 형태는 영구자석의 실제 외형이 원형이라서 나오는 식은 아닙니다.즉, 자석이 둥글다거나 자석 끝단이 정확히 90도라서 cos 식으로 표현되는 것은 아닙니다.자료에서 설명한 a상 자기 인덕턴스 식은 다음 의미입니다.평균적인 자화 인덕턴스회전자 위치에 따라 변하는 인덕턴스 변동분여기서 중요한 것은 회전자 위치에 따라 고정자 권선에서 바라보는 자기저항이 달라진다는 점입니다.IPMSM은 회전자 내부에 영구자석이 매입되어 있고, d축과 q축의 자기저항이 서로 다릅니다. 그래서 a상 권선 입장에서 보면 회전자가 어디에 위치하느냐에 따라 인덕턴스가 커졌다 작아졌다 합니다.이때 인덕턴스는 회전자를 180도 전기각만큼 돌리면 다시 같은 자기회로 상태가 반복됩니다. 그래서 일반적인 cosθ가 아니라, 주기가 180도인 cos2θ 형태로 표현됩니다.반대로 영구자석에 의한 쇄교자속은 조금 다르게 봐야 합니다.영구자석 자속이 a상 권선축 방향으로 얼마나 투영되는지를 보는 것이기 때문에 이 경우에는 cosθ 형태로 표현됩니다.정리하면 다음과 같습니다.영구자석 자속은 권선축에 대한 투영 성분이므로 cosθ 형태로 표현됩니다.자화 인덕턴스 변동분은 d축과 q축의 자기저항 차이 때문에 180도마다 반복되므로 cos2θ 형태로 표현됩니다.따라서 질문 주신 것처럼 “내장된 영구자석이 둥근 형태이고 한쪽 끝에서 끝까지 90도라서 가능한 것인가?”라고 이해하기보다는, 실제 자석 형상을 그대로 수식화한 것이 아니라, 회전자 위치에 따라 반복되는 자기적 특성을 기본파 성분으로 근사한 것이라고 보시면 됩니다.실제 IPMSM은 자석 형상, 자속 장벽, 슬롯 구조, 포화 등에 의해 완벽한 cos 파형이 나오지는 않습니다. 그래서 정밀 해석에서는 FEM 해석이나 인덕턴스 맵을 사용합니다.다만 제어 이론과 기본 모델링에서는 가장 지배적인 기본 성분만 사용해서 cos 형태로 근사하고, 이 근사를 통해 IPMSM의 d축/q축 인덕턴스 차이와 릴럭턴스 토크까지 설명할 수 있습니다.감사합니다.
- 좋아요수
- 0
- 댓글수
- 1
- 조회수
- 24
질문&답변
PMSM 블락파라미터 미지원
안녕하세요, 제어쟁이입니다.현재 2026a버전 부터는 Permanent Magnet Synchronous Machine이 포함된 Specialized Power Systems를 지원하지 않고 있습니다.. 현업에서 정말 많이 사용되는 라이브러리인데 갑자기 지원을 멈춘다고 하네요. 그래서 강의 수강 전 참고 사항에 2024b 버전을 권장 드렸습니다.(사진)현재 2025b 버전까지는 아래처럼 matlab에서 sps_lib를 사용하면 Permanent Magnet Synchronous Machine을 사용할 수 있습니다. 혹시 matlalb 버전을 낮은 버전으로 다운로드 해주실 수 있을까요? Matlab 홈페이지에서 프로그램 다운 받으실 때 버전 낮춰서 다운로드 가능합니다.(사진)
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 29
질문&답변
Center Align PWM 설정 코드 질문
안녕하세요, 제어쟁이입니다.먼저 while(!(TIM1->CR1 & 0x0010)); 부분은 엄밀히 말하면 underflow event flag를 보는 코드는 아닙니다.0x0010은 TIM1_CR1의 DIR bit라서, TIM1 카운터가 down-counting 상태가 되었는지를 확인하는 코드입니다.이 코드에서는 TIM1을 먼저 center-aligned PWM으로 동작시킨 뒤, 카운터가 down-counting 상태가 된 것을 확인하고 나서 TIM1->RCR = 1을 설정합니다.이렇게 카운터 동작이 시작된 후 RCR을 설정하면 update event가 ARR 쪽이 아니라 CNT=0, 즉 underflow 쪽에 맞춰 발생하도록 의도한 것입니다.따라서 전류 센싱은 CNT가 ARR에 도달하는 시점에서 수행된다고 보면 안 됩니다.이 코드의 의도는 ARR 도달 시점이 아니라 CNT가 0으로 내려온 underflow update event에서 TIM1 update interrupt가 발생하고, 그 interrupt 안에서 전류 ADC를 읽는 구조입니다.RCR=1은 center-aligned PWM에서 overflow/underflow update 후보 중 한 번을 건너뛰어서 update interrupt 주기를 50 us로 만드는 설정입니다.정리하면 다음과 같습니다.while문: underflow event를 직접 기다리는 것이 아니라 down-count 상태 진입을 확인RCR=1: update interrupt를 50 us마다 한 번으로 제한RCR 설정 위치: 카운터 시작 후 설정해서 update event를 underflow 쪽으로 정렬전류 센싱 시점: CNT=ARR이 아니라 CNT=0 underflow update event 시점(사진)
- 좋아요수
- 0
- 댓글수
- 1
- 조회수
- 28
질문&답변
주파수 응답 특성 그래프 튜닝 방식
안녕하세요, 제어쟁이입니다. 답변이 너무 늦어서 죄송합니다 ㅠㅠ 알림을 놓쳤네요.답변드리겠습니다.TPS54360은 전류모드 제어 방식의 벅 컨버터라서, 출력전압을 FB 핀으로 피드백 받고 내부 기준전압 0.8V와 비교합니다. 출력전압이 떨어지면 FB 전압도 낮아지고, 오차증폭기 출력인 COMP 전압이 올라갑니다. 이 COMP 전압이 내부 전류제어 루프에서 “인덕터 피크 전류를 어디까지 허용할지”를 정하기 때문에, 결과적으로 스위치 ON 시간이 길어지고 Duty가 증가하면서 출력전압이 다시 회복됩니다.여기서 안정도를 잡기 위해 COMP 핀에 Type 2A 보상회로를 붙입니다. 단순히 아무 커패시터나 저항을 바꾸는 게 아니라, 먼저 출력 커패시터와 부하 조건으로 파워스테이지의 pole/zero를 계산하고, 그에 맞춰 보상 저항과 커패시터 값을 정합니다.강의자료 기준으로는 12V 출력, Iout 2A, Cout 약 37uF, ESR 5mΩ, fsw 약 550kHz 조건에서 파워스테이지 pole은 약 717Hz, ESR zero는 약 861kHz 정도로 계산됩니다. 이후 crossover frequency를 약 14kHz 정도로 잡고, Type 2A 보상회로의 R56은 약 11.7kΩ → 12kΩ, 보상 zero용 커패시터는 약 19nF → 22nF, 고주파 pole용 커패시터는 약 50pF → 47pF 정도로 선정한 것입니다.즉, 보상 zero를 파워스테이지 pole 근처에 배치해서 위상 지연을 보상하고, 고주파 pole로 스위칭 노이즈 영역의 이득을 낮추는 방식입니다. 그래서 TI 툴의 주파수 응답 그래프에서 보상 전에는 위상여유가 부족하지만, Type 2A 보상 후에는 0dB crossover 지점에서 약 30도 정도의 위상여유가 확보되어 안정하다고 판단한 것입니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 37
질문&답변
전동 킥보드에 사용되는 f767 고출력 모델 문의
안녕하세요, 제어쟁이입니다.J1 배럴잭 규격은 내경 2.1mm입니다.다만 이 부분은 꼭 주의하셔야 합니다.현재 보드의 J1 입력 사양은 24V / 3A 기준이라서, 말씀하신 36V 배터리를 J1 배럴잭에 직접 연결하시면 안 됩니다.36V 배터리를 XT60 → DC잭 케이블로 연결하면 전압 사양을 초과하기 때문에 보드 전원부 손상이나 예기치 않은 고장이 발생할 수 있습니다.고출력 버전에서 36V 배터리를 사용하려면, J1이 아니라 36V 입력을 받을 수 있도록 설계된 전원 입력부/전력부(A-키트 기준 Xt60 케이블) 쪽으로 연결해야 합니다.
- 좋아요수
- 0
- 댓글수
- 3
- 조회수
- 38
질문&답변
USART 통신 문의
안녕하세요, 제어쟁이입니다.코드 기준으로 설명드리면, 현재 코드에서는 Hall Sensor 신호의 Edge를 이용해서 속도를 계산하고 있습니다.네, 거의 맞게 이해하셨습니다.다만 정확히 말하면 “Interrupt 함수가 호출되는 순간” 자체가 펄스라기보다는, 홀센서 신호가 변하는 순간, 즉 Edge가 발생한 순간을 MCU가 EXTI 인터럽트로 감지한다고 보시면 됩니다.그 인터럽트 안에서 Update_Hall_Sequence()로 현재 홀센서 상태를 읽고, SpeedCal()을 호출해서 속도를 계산합니다.맞습니다.이전 홀센서 인터럽트 발생 시점과 다음 홀센서 인터럽트 발생 시점 사이에 TIM2 카운터가 얼마나 증가했는지를 보고 시간 간격을 계산합니다.즉 delta_time은 두 Hall Edge 사이의 시간 간격이고, 이 값을 이용해서 RPM을 계산합니다.calculated_rpm과 motor_speed_rpm은 완전히 동일한 값은 아닙니다.calculated_rpm은 SpeedCal()에서 바로 계산된 순간 RPM 값이고,motor_speed_rpm은 그 값을 LPF, 즉 저역통과필터를 거쳐 부드럽게 만든 필터링된 RPM 값입니다.그래서 화면에 출력되는 RpmFdb는 최종적으로 motor_speed_rpm 값이라고 보시면 됩니다.정리하면,Hall Sensor Edge → EXTI Interrupt → SpeedCal() → calculated_rpm 계산 → LPF 적용 → motor_speed_rpm 출력이 흐름입니다.감사합니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 35





