STM32-ESC : BEMF 문제
BLDC 모터 용 ESC를 만들고 있습니다. STM32 (PWM 생성 용), IR2101 MOSFET 드라이버 3 개 (https://www.infineon.com/dgdl/ir2101.pdf?fileId=5546d462533600a4015355c7a755166c) 및 6 mosfets를 사용하여 모터의 다른 위상을 제어합니다.
내 회로도 :
하이 측에 PWM을, 로우 측에 GPO를 사용하여 위상을 생성합니다.
내 PWM의 높은 쪽 (A, B 및 C 상)
PHASE A (0V 이하!)
신호는 정확 해 보이지만 모터를 연결하면 BEMF가 좋은 BEMF에 비해 역방향임을 알 수 있습니다.
단계 ABC
BEMF ABC
PWM의 주파수를 바꾸고, 듀티 사이클이나 각 단계 사이의 지연을 바꾸려고하지만 아무것도 바뀌지 않습니다 (때로는 더 나빠집니다 ...). 왜 그런지 아십니까?
내 STM은 8MHz에서 실행됩니다. PWM 주파수 : 900Hz, 듀티 사이클 5 %. 이 테스트 동안 내 모터는 12V / 0.8A를 소비합니다.
편집하다
왜 내 BEMF가 좋은 것에 비해 반전되었는지 모르겠습니다.
아래에서 내 위상 C (노란색), 모터의 가상 접지 (하늘색), 수학 연산 위상 C-가상 접지 (진한 파란색) 및 내 LM339 (분홍색)의 출력을 볼 수 있습니다.
스택 교환 에서이 문제에 대한 여러 주제를 보았지만 매번 대답이 명확하지 않습니다. ( 여기에 링크 설명 입력 ).
내 PWM과 BEMF가 'in phase'가 아닌 것 같아요 .. 설명이 필요합니다.
답변
StackExchange에 오신 것을 환영합니다! 첫 번째 게시물을 잘했습니다.
맞습니다. 강제 전압이 모터와 위상이 맞지 않습니다.
PWM 사이클 동안 잘못된 위치에서 샘플링하는 것처럼 보입니다. PWM주기가 높을 때 ADC 샘플이 PWM주기의 중앙에서 발생하는지 확인하십시오. 적절한 샘플을 얻기 위해 필요한 최소 듀티 사이클이있을 수 있지만 900Hz는 매우 낮은 주파수이므로 그렇지 않을 수 있습니다.
스코프 스크린 샷에서 추측하기는 어렵지만 위상이 PWM의 낮은 쪽에서 음의 방향으로 가고 PWM의 위쪽에서 양의 방향으로 나타나는 것처럼 보입니다. 하도록 지시하고 있지만주기의 잘못된 위치에 있습니다.
ADC 인터럽트가 시작되면 켜지고 ADC 인터럽트가 끝날 때 꺼지는 핀을 설정하여 인터럽트 타이밍을 (대략) 확인하고 싶습니다. 나는 보통 그것으로부터 좋은 정보를 수집 할 수있다.
ADC 샘플 시간을 확인 / 수정했는데 문제가 지속되면 상승하는 전체 크기 Y 축의 한 단계 스크린 샷을 게시합니다.
그것에 충실하십시오! 문제는 고개를 숙이고 작업을함으로써 해결됩니다. 그러나 멀리 떨어져서 잠을 자야한다는 것을 기억하십시오. 아침에는 문제가 매우 다르게 보입니다!
추가하기 위해 편집 됨
귀하의 의견을 바탕으로 기본적인 오해가있을 수 있다는 느낌이 들었습니다 (제가 틀렸을 수 있습니다).
중성 전압 계산
먼저 중성 전압을 측정 할 필요가 없습니다. 이것은 낭비되는 ADC 모듈입니다. 중성 전압을 계산할 수 있습니다 neutral = (phaseA + phaseB + phaseC) / 3;.. 속도를 위해 고정 소수점 표기법으로 변환하는 것이 좋지만 수학은 정확합니다. 이제 필요한 ADC가 하나 적습니다!
당신의 중립은 거의 정확 해 보입니다. 방금 설명한 수학을 정신적으로 수행하면 중성 전압이 실제로 위상 전압의 평균 (또는 거의)임을 알 수 있습니다.
작업을 수행하도록 레지스터 구성
다음으로 TIM1 및 ADC12 레지스터를 중앙 정렬로 구성하고 카운터 모드의 피크에서 트리거하면 올바르게 샘플링하는 데 계산이 필요하지 않습니다.
통근 할 때
귀하의 의견에 귀하는
만약 부동 위상-가상 접지 = 0. 그것이 사실이라면 이론적으로 다음 위상을 최고로 정류하기 전에 기다리는 시간을 알고 있습니다.
이것은 절반의 경우에만 해당되며 명확하게 말하고 싶습니다. BEMF 단계는 한 단계에서 상승하는 것과 다른 단계에서 떨어지는 사이를 번갈아 가며 나타납니다.
if(phaseIsRising){
if(phaseVoltage > neutral)
commutate();
}else{
if(phaseVoltage < neutral)
commutate();
}
위의 코드를 올바르게 구현하면 모터를 작동 할 수 있지만 30도 전진합니다. 저를 믿으세요. 스크린 샷보다 훨씬 좋아 보일 것입니다.
추가 작업
여기까지 가면 정류 이벤트를 30도 이동하는 방법을 결정하는 데 맡기겠습니다.