안녕하세요. 강의에서 배운 내용을 실제 프로젝트에 적용하려고 하시니 이제 이런 고민이 생기시는 것 같습니다. 제어기를 구현하는 방법과, 내 시스템에 필요한 성능을 정하는 것은 서로 다른 문제라서 충분히 어려울 수 있습니다. 이때는 처음부터 “Overshoot는 몇 %, 대역폭은 몇 Hz로 해야 하지?”라고 접근하기보다, “내가 만드는 시스템이 어떤 일을 해야 하는가?”에서 출발하는 탑다운 방식으로 접근하시는 것을 권해드립니다. 먼저 동작 조건과 목표를 정하고, 여기서 필요한 토크·속도와 제어 성능을 도출하는 순서입니다. 실제 모터 선정 절차에서도 이동 거리, 이동 시간, 정지 정확도 등의 장비 요구사항을 먼저 정하도록 안내합니다. 예를 들어 로봇팔이라면 “몇 kg의 물체를, 얼마나 멀리 뻗은 상태에서, 얼마 만에 이동시키고, 어느 정도 정확하게 내려놓을 것인가?”를 먼저 정해보세요. 이 중 물체의 무게와 팔의 길이는 필요한 토크를 계산하는 출발점이고, 이동 시간과 허용 오차는 제어 성능을 정하는 출발점이 됩니다. 간단한 예로, 관절축에서 수평으로 30 cm 떨어진 곳에 있는 1 kg의 물체를 버티는 데만 약 2.94 N·m의 토크가 필요합니다. 토크 = 1 kg × 9.81 m/s² × 0.3 m ≈ 2.94 N·m 그런데 이것은 물체의 무게만 고려한 값입니다. 실제로는 팔과 그리퍼 자체의 무게, 가감속에 필요한 토크, 마찰 등을 추가로 고려해야 합니다. 다관절 로봇팔은 자세에 따라 각 관절에 걸리는 부하도 달라지므로, 부하가 크게 걸리는 자세를 확인해야 하고요. 감속기를 사용한다면 관절에서 필요한 토크를 감속비와 효율을 고려해 모터축 기준으로 환산해야 합니다. 자율주행 차량도 마찬가지입니다. 차량의 총질량, 목표 속도, 가속 시간, 올라가야 하는 경사, 바퀴 크기 등을 먼저 정한 뒤 필요한 구동력과 모터 토크·회전속도를 계산하는 방식으로 접근하시면 됩니다. 다만 학생 프로젝트에서 처음부터 모든 기구 특성과 부하를 정밀하게 모델링하기는 부담스러울 수 있습니다. 그래서 저는 가능한 범위까지 먼저 계산하고, 초기 하드웨어 후보를 고를 때는 계산한 필요 토크에 2~2.5배 정도의 여유를 두는 접근을 권하고 싶습니다. 처음부터 최소 사양에 딱 맞추기보다는, 부하 추정 오차나 설계 변경에 대응할 여지를 확보하자는 의미입니다. 물론 2~2.5배는 모든 시스템에 적용되는 정답이나 안전을 보장하는 수치는 아닙니다. 계산을 생략하고 무조건 큰 모터를 고르라는 뜻도 아니고요. 특히 계속 버텨야 하는 토크는 연속 정격으로, 가감속 때 잠깐 필요한 토크는 피크 토크와 허용 지속시간으로 구분해서 확인해야 합니다. 반복 동작에서는 RMS 토크에 따른 발열도 중요하며, 요구 회전속도에서 해당 토크를 낼 수 있는지까지 확인해야 합니다. 그리고 질문하신 Overshoot와 Settling time은 실제 작업에서 허용할 수 있는 움직임과 시간으로 바꿔 생각해보시면 조금 더 명확해집니다. 가령 설명을 위한 가상의 목표로, “로봇팔의 이동 지령이 끝난 뒤 0.2초 안에 목표 각도 ±1° 범위에 들어와 유지되어야 한다”, “목표 각도를 넘어가는 움직임은 최대 1°까지만 허용한다”처럼 정할 수 있습니다. 그러면 앞의 조건은 정착시간과 허용 오차, 뒤의 조건은 오버슈트 요구사항으로 연결됩니다. 여기서 0.2초와 1°는 권장값이 아니라 예시이고, 실제 값은 다음 작업까지 기다릴 수 있는 시간과 물체를 놓는 데 필요한 정확도에 따라 정하시면 됩니다. 즉, 요구사항은 사용 목적에 맞게 설계자가 먼저 결정해야 하는 값도 있습니다. “물체를 놓고 다음 동작으로 넘어가기까지 얼마나 기다릴 수 있나?”, “이 정도 위치 오차면 작업이 가능한가?”를 먼저 판단하고, 그 목표를 하드웨어와 제어기로 달성할 수 있는지 검토하는 것입니다. 대역폭은 이렇게 정한 응답 목표를 만족하도록 모델과 시뮬레이션을 바탕으로 선정하시면 됩니다. 강의에서 다룬 것처럼 전류·속도의 캐스케이드 제어 구조를 사용한다면, 안쪽 루프가 바깥쪽 루프보다 충분히 빠르게 응답하도록 구성하고 전류 루프부터 순서대로 튜닝하는 것이 기본입니다. 시스템 요구사항은 바깥에서 안쪽으로 내려가며 정하되, 실제 제어기 튜닝은 안쪽부터 진행한다고 생각하시면 됩니다. 처음 프로젝트에서는 우선 “이 하중을 이 시간 안에 움직이고, 이 오차 안에 멈춘다”는 식으로 검증 가능한 목표 몇 가지부터 적어보시는 것을 권합니다. 그 목표를 기준으로 계산하고 하드웨어를 선정한 뒤, 실제 부하를 연결해 응답과 발열을 측정하면서 모델과 튜닝을 보완해보세요. 감사합니다.
안녕하세요! 강의를 잘 수강해 주셔서 감사합니다. 회로도와 코드를 살펴보면서 “이 정도 사양이 꼭 필요한가?”까지 고민해 보신 것은 좋은 접근이라고 생각합니다. 먼저, 이번 강의의 MCU는 현재 구현된 기능에 딱 맞는 최소 사양으로 선정한 것은 아닙니다. 말씀하신 2MB Flash나 100핀을 모두 사용해야 해서 해당 모델을 선택한 것은 아니고요. 선정 배경은 크게 두 가지입니다. 첫 번째는 당시의 부품 수급 상황입니다. 강의를 제작할 때는 반도체 수급 문제가 있었기 때문에, 필요한 기능을 지원하는지뿐 아니라 실제로 재고가 있어 구매할 수 있는지도 중요한 선정 기준이었습니다. 두 번째는 교육용 보드라는 목적입니다. 단순히 인버터를 구동하고 끝내는 것이 아니라, 수강생분들이 강의 이후에도 센서나 통신 기능을 추가하고, 다른 제어 알고리즘을 적용하는 등 여러 실습을 자율적으로 해볼 수 있도록 하고 싶었습니다. 그래서 현재 강의에서 사용하는 기능보다 연산 성능과 메모리, 주변장치에 어느 정도 여유를 두고 STM32F767을 선정했습니다. 일부 핀이나 메모리가 남는 것도 이런 배경에서 이해해 주시면 됩니다. 반면 실제 제품을 개발할 때는 먼저 “이 제품에 어떤 기능이 필요하고, 어느 정도 성능이 나와야 하는가?”를 정리한 뒤 MCU를 선정하는 것이 좋습니다. 모터 구동 제품이라면 필요한 PWM과 ADC 기능, 센서 입력, 통신 종류와 개수 등을 확인하고, 제어 연산을 정해진 시간 안에 처리할 수 있는지, 프로그램과 데이터를 담을 Flash와 RAM은 충분한지 등을 검토해야 합니다. 그다음 제품 단가, 소비전력, 사용 환경, 부품 수급과 향후 기능 추가 가능성까지 함께 고려하는 것이죠. 여기서 중요한 것은 무조건 고성능 MCU를 쓰거나, 반대로 무조건 가장 저렴한 MCU를 고르는 것이 아니라, 필요한 요구사항을 충족하면서 적절한 여유를 확보하는 것입니다. 정리하면, 이번 강의에서는 최소 원가로 현재 기능만 구현하는 것보다, 당시의 수급 상황과 수강 후의 실습 확장성에 더 비중을 두고 선정했다고 보시면 됩니다. 지금처럼 사용하지 않는 자원까지 살펴보며 선정 이유를 고민해 보시는 과정이 실제 설계에서도 큰 도움이 될 것입니다. 좋은 질문 감사합니다!
안녕하세요.제어쟁이입니다 여기서 2048이 나오는 이유는 전류 측정 회로에서 전류가 0 A일 때의 출력 전압을 1.65 V로 잡아두었기 때문입니다. ADC의 특성과 코드의 보정 과정을 나눠서 보시면 이해하기 쉽습니다. 1. 왜 1.65 V가 2048인가요? STM32F767의 ADC를 12비트로 사용하면 측정 결과는 0~4095, 총 4096단계로 표현됩니다. 기준 전압이 3.3 V라면 그 절반인 1.65 V는 약 2048에 해당하는 것이죠. 그런데 왜 전류가 0 A일 때 0 V가 아니라 1.65 V가 나오도록 만들었을까요? ADC는 이 조건에서 0~3.3 V 범위의 전압을 측정하므로, 음의 전압을 그대로 입력해서 측정할 수 없기 때문입니다. 그래서 회로에서 신호에 1.65 V를 더해두고, 그 전압을 기준으로 위아래로 변하는 신호를 측정하는 것입니다. 예를 들어 원래 측정하려던 신호가 +0.2 V라면 ADC에는 1.85 V가, −0.2 V라면 1.45 V가 들어가도록 만드는 것이죠. 이후 소프트웨어에서 1.65 V를 다시 빼주면 원래 신호를 구할 수 있습니다. 2. 그러면 코드에서는 왜 평균값에서 2048을 빼나요? 첨부 코드에서는 초기화할 때 각 상의 ADC 값을 10번 읽어 합산한 뒤, 다음과 같이 계산합니다. Ias_Offset = (Ias_Offset / 10) - 2048; 여기서 저장하려는 것은 1.65 V 전체가 아니라, 실제 영점 측정값이 기준값인 2048에서 얼마나 벗어났는지입니다. 예를 들어 전류가 흐르지 않는 상태에서 ADC 평균값이 2068로 측정됐다고 해보겠습니다. 그러면 보정값은 다음과 같습니다. 보정값 = 2068 - 2048 = 20 즉, 전류가 0 A인데도 기준보다 20만큼 높게 측정되고 있다는 뜻입니다. 따라서 이후 측정값에서 이 20을 빼주면 영점 기준을 2048에 맞출 수 있습니다. 실제 전류 계산 부분에서도 먼저 result - Ias_Offset으로 이 차이를 보정하고, 전압으로 환산한 다음 OFFSET_Volt를 빼는 순서로 처리하고 있습니다. 여기서 회로에 더해둔 1.65 V를 제거하는 것입니다. 정리하면, 처음의 평균값 - 2048은 영점 오차를 구하는 과정이고, 이후의 1.65 V 빼기는 회로에서 의도적으로 더해둔 전압을 제거하는 과정입니다. 같은 오프셋을 두 번 빼는 것이 아니라, 두 가지를 나눠서 처리한다고 이해하시면 됩니다.
안녕하세요. 제어쟁이입니다. Drop here for new chart는 별도로 설정에서 활성화할 필요는 없습니다. 첨부해주신 화면을 보면 UART 데이터는 정상적으로 들어오고 있는 것 같은데, 현재는 Teleplot에서 그래프용 데이터가 아니라 일반 문자열로 인식되고 있는 것으로 보입니다. Teleplot에서 Serial 데이터를 그래프로 표시하려면 데이터 형식을 >변수명:값 형태로 보내주셔야 합니다. 예를 들어 >speed:1000 과 같은 형태로 UART를 통해 전송하면 speed라는 변수가 Teleplot에서 인식되고 그래프로 표시할 수 있습니다. 강의에서 사용한 코드와 동일하게 작성하셨다면, 먼저 실제 UART로 출력되는 문자열이 위 형식으로 나오고 있는지 확인해보시면 좋을 것 같습니다. Teleplot 버전에 따라 화면 구성이나 그래프가 생성되는 방식은 강의 화면과 조금 다를 수도 있습니다. 그리고 강의 뒷부분에 제가 별도로 만들어서 업로드해둔 UART 모니터링 프로그램도 있습니다. Teleplot이 계속 잘 안 되면 그것도 한번 사용해보세요!
안녕하세요.제어쟁이입니다. 질문하신 부분은 PLL을 설정하고 켜는 단계와, 그 PLL을 실제 시스템 클럭으로 선택하는 단계가 분리되어 있다는 점으로 이해하시면 됩니다. STM32F767은 리셋 직후 기본적으로 내부 HSI 16MHz를 사용합니다. PLL을 216MHz가 나오도록 설정하고 켜더라도, 시스템 클럭 소스를 PLL로 변경하기 전까지는 기존 클럭을 사용합니다. 따라서 이 준비 과정에서 CPU가 바로 216MHz로 동작하는 것은 아닙니다. 초기화 흐름은 다음과 같습니다. 기존 HSI 또는 HSE를 시스템 클럭으로 사용하는 상태에서 PLL을 설정하고 활성화합니다. 오버드라이브를 활성화하고 전환 완료를 기다립니다. 필요한 Flash 대기 사이클과 버스 분주비를 설정하고, PLL이 안정화된 것을 확인한 뒤 시스템 클럭을 PLL로 전환합니다. 오버드라이브는 내부 전압 레귤레이터를 고속 동작에 필요한 모드로 전환하는 기능입니다. 오버드라이브를 켠다고 PLL의 배수나 분주비가 변경되지는 않습니다. 따라서 말씀하신 것처럼 일단 180MHz로 동작하다가 오버드라이브를 켜면 자동으로 216MHz가 되는 구조는 아닙니다. 180MHz는 내부 레귤레이터 ON·Voltage Scale 1·오버드라이브 OFF 조건에서 허용되는 최대 HCLK입니다. 자동으로 주파수를 180MHz로 제한해 주는 값이 아니므로, 오버드라이브 준비 없이 CPU/HCLK를 216MHz로 전환하면 데이터시트의 보장 범위를 벗어납니다. 추가 질문 있으시면 언제든지 질문 남겨주세요. 감사합니다.
안녕하세요, 제어쟁이입니다. 먼저 빨간 박스의 1.5kΩ + 1nF는 홀센서 신호의 풀업 및 노이즈 필터 역할이고, 오른쪽 100nF는 IC 전원 노이즈를 줄이는 바이패스 커패시터입니다. 1. 풀업 저항 홀센서가 오픈컬렉터/오픈드레인 출력이라면 High 신호를 만들기 위해 풀업 저항이 필요합니다. 저항이 너무 작으면 센서가 Low로 당길 때 전류가 많이 흐르고, 너무 크면 신호가 High로 올라가는 속도가 느려지고 노이즈에 취약해질 수 있습니다. 예를 들어 5V에 1.5kΩ이면 Low 상태에서 약 3.3mA가 흐르므로, 이정도 전류는 홀센서에서 충분히 Sink할 수 있는 전류 크기입니다. 2. 1nF 커패시터 신호선에 들어오는 순간적인 노이즈를 줄이기 위한 용도입니다. 이때 풀업 저항과 커패시터가 RC 필터를 만들기 때문에 커패시터를 너무 크게 하면 정상적인 홀신호까지 느려질 수 있습니다. 현재 값은 RC = 1.5kΩ × 1nF = 1.5µs 정도이므로, 노이즈를 줄이면서도 홀신호 속도에 영향을 크게 주지 않도록 선정한 값이라고 보시면 됩니다. 정리하면, 풀업 저항은 센서가 감당할 수 있는 전류와 신호 상승속도를 보고, 신호 커패시터는 노이즈와 허용 가능한 지연시간을 확인합니다. 그리고 실제 실무에서는 처음부터 부품값을 완벽하게 확정하진 않습니다. 데이터시트와 계산을 바탕으로 초기값을 정한 뒤 하드웨어 제작 후 실제 파형을 측정하면서 값을 튜닝하는 경우가 많습니다. 특히 모터 주변처럼 노이즈가 많은 환경에서는 오실로스코프로 홀신호의 노이즈, 상승/하강 시간 등을 확인하면서 풀업 저항이나 필터 커패시터 값을 조정해 최종값을 결정합니다.
안녕하세요. 답변이 많이 늦어져 죄송합니다. 알림을 확인하지 못하고 지나갔습니다. 강의자료에 표시된 P6KE47CA는 입력 전원에서 순간적으로 발생할 수 있는 과도전압을 억제하기 위해 초기 설계 단계에서 넣어두었던 TVS 다이오드입니다. 다만 최종 키트 PCB에서는 교육용 실습 환경에서 사용되는 전원 조건과 회로 구성을 다시 검토하면서, 필수 부품은 아니라고 판단하여 제외했습니다. 따라서 강의자료는 초기 설계안이 일부 남아 있고, 실제 키트 PCB가 최종 버전이라고 보시면 됩니다. 혼란을 드려 죄송합니다.