네, 뒤집어졌는데 뭔가 이상하다는 느낌이 들지 않나요? 너무 느린? 걱정하지 마세요. 계속 진행하겠습니다. 이 장의 끝부분에 설명된 원리에 따르면 8비트 모드에서는 스테퍼 모터가 한 번 회전하는 데 64개의 리듬이 필요합니다. 우리 프로그램에서 각 리듬은 2ms 동안 지속되므로 1회전은 128ms, 즉 1초가 되어야 합니다. . 7회전이 넘는데 왜 1회전을 완료하는데 7초 이상 걸리는 것처럼 보일까요?
이제 '영구자석 가속 스테퍼 모터'에서 '가속도'의 개념을 이해할 차례입니다. 그림 9-7은 이 28BYJ-48 스테퍼 모터의 분해도입니다. 사진에서 볼 수 있듯이 가운데 흰색 피니언은 스테퍼 모터의 로터 입력입니다. 64개의 리듬이 이 피니언을 회전시킵니다. 원을 그리며 커다란 하늘색 기어를 구동합니다. 이것이 첫 번째 가속 수준입니다. 오른쪽 상단의 빨간색 기어의 구조를 살펴보겠습니다. 모터 로터와 최종 입력 샤프트를 제외하면 3개의 변속기 기어는 여러 개의 톱니와 작은 톱니의 레이어로 구성된 구조를 가질 수 있습니다. , 각 기어는 다음 기어의 작은 톱니 레이어를 사용하여 다음 기어의 다중 톱니 레이어를 구동합니다. 이러한 방식으로 두 기어마다 가속도 레벨이 형성되며 총 4가지 가속도 레벨이 있습니다. 그렇다면 총 가속 비율은 얼마입니까? 즉, 입력축이 한 번 회전하기 전에 로터는 몇 바퀴를 돌려야 합니까?
그림 9-7 스테퍼 모터 외부 기어 표현
모터 매개변수 테이블의 가속도 비율 매개변수를 다시 살펴보세요 - 1:64, 회전자가 64번 회전하고 입력 샤프트가 최종적으로 한 번 회전합니다. , 64*64=4096개의 리듬 입력 샤프트가 한 번 회전하는데 2ms*4096=8192ms가 걸리고, 한 번 회전하는 데 8초 이상이 걸립니다. 지금의 실험 결과와 일치합니까? 4096개의 리듬이 하나의 원으로 회전하므로 리듬 회전 각도는 360/4096입니다. 표의 스텝 각도 매개변수 5.625/64를 보면 이 두 값을 알 수 있습니다. 모두 동일합니다.
원칙에 대한 기본적인 이해는 여기에서 완료되어야 하지만, 모두가 "진리를 검증하는 유일한 기준"이라는 사고방식을 키울 수 있기를 바랍니다! 스테퍼 모터의 가장 큰 특징은 무엇입니까? 마이그레이션량을 정확하게 파악하라! 그럼 그것이 정확한지 테스트해 볼까요? 얼마나 정확합니까? 어떻게 연습하나요? 90도 회전해서 금지사항인지 측정해 볼까요? 괜찮습니다. 하지만 1도만 벗어나거나 심지어 1도 미만이라도 어긋나면 정확하게 측정할 수 있나요? 정교한 도구 없이는 어렵습니다. 최종적으로 멈춘 위치가 여전히 원래 위치가 아닌지 확인하기 위해 완전한 원을 몇 개 더 회전시켜 보겠습니다. 이에 따라 우리는 모터 회전 수를 쉽게 제어할 수 있도록 프로그램을 수정했습니다.
#include <reg52.h> void TurnMotor(unsigned long angle); void main(){ TurnMotor(360*25); //360 度*25,即 25 圈 while (1); } /* 软件延时函数,延时约 2ms */ void delay(){ unsigned int i = 200; while (i--); } /* 步进电机迁移转变函数,angle-需转过的角度 */ void TurnMotor(unsigned long angle){ unsigned char tmp; //暂时变量 unsigned char index = 0; //节奏输入索引 unsigned long beats = 0; //所需节奏总数 //步进电机节奏对应的 IO 掌握代码 unsigned char code BeatCode[8] = { 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 }; //盘算需求的节奏总数,4096 拍对应一圈 beats = (angle*4096) / 360; //判别 beats 不为 0 时履行轮回,然后自减 1 while (beats--){ tmp = P1; //用 tmp 把 P1 口以后值暂存 tmp = tmp & 0xF0; //用&操作清零低 4 位 tmp = tmp | BeatCode[index]; //用|操作把节奏代码写到低 4 位 P1 = tmp; //把低 4 位的节奏代码和高 4 位的原值送回 P1 index++; //节奏输入索引递增 index = index & 0x07; //用&操作完成到 8 归零 delay(); //延时 2ms,即 2ms 履行一拍 } P1 = P1 | 0x0F; //封闭电机一切的相 }
위 프로그램에서는 먼저 모터가 지정된 각도로 회전하도록 제어하는 함수를 작성했습니다. 이 각도 값은 함수의 메소드 매개변수에 의해 제공되며, 주 함수에서 이를 변경하여 쉽게 제어할 수 있습니다. 호출 시 실제 매개변수는 모터가 어떤 각도로든 회전합니다. 우리는 25개의 원인 360*25를 사용했습니다. 물론 다른 값으로 변경하여 결과를 확인할 수도 있습니다. 우리 프로그램은 25*8=200초 동안 실행됩니다. 먼저 입력 샤프트의 초기 위치를 기록한 다음 전원을 켜고 완료될 때까지 기다리십시오. 오류가 있습니까? 무슨 일인가요? 전송량을 정확하게 제어할 수 없는 이유는 무엇인가요?
이 결과는 실제로 가속도 비율에 따른 것입니다. 제조사에서 제공하는 가속도 비율은 어느 제조업체에서 생산하든 공칭 가속도인 28BYJ-48입니다. 비율은 대부분 1:64입니다. 하지만 실제로는 어떻습니까? 분해 계산을 통해 실제적이고 정확한 가속도 비율은 이 값인 1:64가 아니라 1:63.684라는 것을 알았습니다! 이 데이터를 얻는 방법도 매우 복잡합니다. 각 기어의 톱니 수를 세고 각 레벨의 가속도 비율을 곱하면 측정된 가속도 비율이 (32/9)*(22/11)입니다. *(26/9)*(31/10)≒63.684이므로 실제 오차는 0.0049로 약 0.5%입니다. 100번 돌리면 차이가 반 바퀴가 됩니다. 1/8만 꺼진 각도인 45도인가요? 오류가 45도인지 살펴보겠습니다. 그러면 실제 가속도 비율인 1:63.684에 따르면 한 바퀴를 도는 데 필요한 리듬 수는 64*63.684≒4076이라는 결론을 내릴 수 있습니다. 그런 다음 아래 프로그램의 모터 구동 기능에서 4096을 4076으로 변경하고 다시 시도하십시오. 사소한 오류도 볼 수 없나요? 그러나 실제로는 아래의 계산 결과가 대부분 근사치이므로 오류가 여전히 존재합니다. 실제 오류는 약 0.000056, 즉 10,000회전 후에는 0.56회전이므로 무시할 수 있습니다.
그렇다면 제조사의 매개변수에는 왜 오류가 있는 걸까요? 제조사에서는 모르나요? 이 문제를 설명하려면 실제 사용으로 돌아가야 합니다. 스테퍼 모터의 가장 일반적인 목적은 일반적으로 360도 내에서 특정 각도로 회전하도록 타겟을 제어하는 것입니다. 사용 에어컨의 팬 블레이드를 제어하기 위해 팬 블레이드의 이동 범위는 180도를 초과하지 않으므로 이 사용 사례에서 제조업체는 충분히 정확하고 합리적인 1:64의 대략적인 정수 가속 비율을 제공합니다. . 그러나 우리 프로그램과 마찬가지로 반드시 에어컨 팬 블레이드를 구동하는 데 사용할 필요는 없으며 다른 작업을 수행하기 위해 여러 번 회전시킬 수 있습니다. 모든 사람이 이해하고 숙달할 수 있는 것, 즉 우리는 시스템을 스스로 "설계"하고 그 안에서 발견된 문제를 해결할 수 있어야 하며 소위 "기성 계획"에 얽매이지 않아야 합니다. .
위 내용은 28BYJ-48 스테퍼 모터의 전송 정확도와 심층 분석을 달성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!