Drone

드론의 PWM신호 생성 방법

빵맨. 2020. 3. 7. 17:47
728x90

BLDC모터를 제어해줄 ESC

 

ESC에 보내줄 PWM신호 생성 방법

1) delay 함수를 사용해서 정해진 시간마다 핀의 출력을 LOW랑 HIGH로 계속해서 바꿔준다.

2) millis()나 micros() 함수를 사용해서 delay()의 결함을 보완한다. 
#아두이노에만 해당되는지 잘 모르겠음

3) 타이머 인터럽트를 활용해서 정확한 타이밍에 맞춰 HIGH와 LOW를 왔다갔다 하게 만든다. 
#아두이노의 경우 타이머 인터럽트인데 다른 하드웨어도 비슷할지 모르겠음


- 1) : 코드가 쉬움. 하지만 이 방법을 사용하지 않는 이유는 delay로 구현하면 나머지 센서에서
  값 받아들이는 코드나 다른 코드들이 모두 stop되고 무작정 그 시간동안 기다려야 하기 때문에 
  원할한 제어의 흐름이 생기기가 어려움.

- 2) : delay 함수의 단점을 보완하려고 micros나 millis함수를 많이 사용.
  이 함수들은 프로그램이 시작된 후로 얼마나 많은 시간이 지났는지 알려줌 (시계역할?)
  millis()를 원하는 시간대로 나눈 나머지를 취해서 0이 될때 마다 원하는 동작을 하는 형태로 코드를 짜기도 한다고 한다.
  하지만 이것저것 계산하는 코드나 여러가지 넣다보면 한 loop를 도는데 시간이 걸림 -> 타이밍을 놓쳐서 신호를 못받아서 코드가 밀릴수 있음.

- 1), 2)는 폴링방식?? 따라서 우리는 아마 (3) 인터럽트 방식을 무조건적으로 사용해야 될 것 같음

- 아두이노 스케치를 분석해본 결과 Servo.h나 cpp파일에 write함수 ==> writeMicroseconds함수의 정의 부분을 보면 인터럽트가 사용된 것을 알 수 있음.
  (아두이노의 Servo.cpp 파일을 보면 중간중간 인터럽트 해제(초기화?)함수나 handle_interrupts가 정의 되어 있음)

728x90