일단 쿼드콥터 카페[quadcopter 자작 카페]에서 하늬카스(kreder)님이
쓰로틀 조종없이 ESC 세팅하는 방법이 있나요? 이 질문을 하셔서 도움이 될까 싶어서 제가 송신기 없이도 셋팅을 했던 프로그램을 짤막하게 올립니다. 일단은 제가 한 ESC 모델은 Hobbywing FlyFun 12A Brushless ESC 아래 사진과 같습니다. 이 ESC 셋팅을 할 때는 최소와 최대 2가지 상태만 가지고 셋팅을 다 됩니다. 메뉴얼에 소리 톤을 잘 보고 셋팅을 하시면 됩니다. 이 셋팅을 하기 위한 MCU는 ATmega128이고, 프로그램은 CodevisionAVR으로 제작하였습니다. 입력스위치는 3개 정도 두었습니다. 그리고 PWM출력이 가능 한 핀, 프로그램 보시면 어느 핀이PWM 출력 핀인지 알게 되실 것 같습니다 ㅎㅎ (최종적으로 보니 입력스위치는 두개밖에 쓰지 않았네요 ㅎㅎ) |
첨부파일에 코드비젼 프로젝트 파일 압축해서 올렸습니다 ^-^ 필요하시면 받으시구요!
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
?Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : ESC Setting program
Version : 1.00
Date : 2012-06-22
Author : Lim dong jin
Company : M&M
Comments:
* OC1B에 출력단자 - PB6
* PA7 --> High PWM : 1.92ms
* PC5 --> Low PWM : 1.08ms
나머지 스위치?!?! 연결 안되어있음 ㅋㅋ
Chip type : ATmega128
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 1024
*****************************************************/
#include <mega128.h>
#include <delay.h>
#define SW_scan_speed 200 // ms 단위
#define UP_SW PINA.7 // UP SW
#define Curl_SW PINB.7 // CURL SW
#define DOWN_SW PINC.5 // DOWN SW
#define Throttle_DOWN 2174 // 스로틀 다운
#define Throttle_UP 3840 // 스로틀 업
#define Curl 2300 // 약한 회전
void init(void);
int timer_cnt_1ms,flag;
void main(void)
{
init();
delay_ms(10);
while(1)
{
if(flag == 1) // 특정 시간 동안에 값을 출력
{
flag=0;
}
}
}
////////////////////////////////////////////////////////////////////////////////////
// Sub Function
void init(void)
{
// SW 입력으로 받음
DDRA=0x00;
DDRC=0x00;
// PWM OC1A, OC1B, OC3A, OC3B 출력으로 설정
DDRB=0x7f; // PB5-OC1A:출력, PB6-OC1B:출력
PORTB=0xff;
// 인터럽트 설정
SREG=0x80; // 전체 인터럽트 허용
// 타이머 설정 및 PWM 설정
// timer0 main_timer 1ms timer
// N=32, OCR0=249
//T_oc = 2*N*(1+OCR0)/16 [us] = 1[ms]
TIMSK = 0x02; // OCIE0-1
TCCR0 = 0x0b;
TCNT0 = 0x00;
OCR0 = 249;
// PWM Setting : Timer/Count 3, OC3A->Fornt Rotor , OC3B->Back Rotor
// Mode-12, CTC, TOP = ICR1, 비교매치 OC1A, OC1B
// N = 8, 1+TOP = 44160, 주파수 45.28Hz
TCCR1A = 0xA2; // COM(A,B)10-10 : 비교매치->Clear, TOP->Set , WGM1,0 -> 10
TCCR1B = 0x1A; // WGM3,2 -> 11 So mode-14, mode, Top value is ICR0
TCCR1C = 0x00; // FOC function is disalbe
TCNT1 = 0x0000;
ICR1 = 0xAC7F; // TOP = 44159 + 1 = 44160, 1clock = 0.5[usec]
OCR1B = Throttle_UP;
}
////////////////////////////////////////////////////////////////////////////////////
// Interrupt part
// timer0 main_timer 1ms timer
// N=32, OCR0=249
// Timer = 2*N*(1+OCR0)/16 [us] = 1[ms]
interrupt[TIM0_COMP] void Timer_main(void)
{
timer_cnt_1ms++; // 1ms 타이머 ++
if(timer_cnt_1ms >= SW_scan_speed)
{
timer_cnt_1ms=0; // timer_cnt_1ms 초기화
flag=1;
}
if(UP_SW == 0) OCR1B = Throttle_UP;
if(DOWN_SW == 0) OCR1B = Throttle_DOWN;
if(Curl_SW == 0) OCR1B = Curl;
}
소스는 다음과 같습니다. 설명은... 보니깐 SW 두개밖에 없네요 쓰로틀 다운, 쓰로틀 하이 ㅋㅋ;;
나머지는 회전시켜보려고 만든 curl 쓰로틀 스위치가 있는데 하드웨어적으로 제가 연결을 안해서 안썼던것 같습니다.
여기서 가장 중요한 점은
* OC1B에 출력단자 - PB6
* PA7 --> High PWM : 1.92ms
* PC5 --> Low PWM : 1.08ms
이 부분입니다. 입출력 핀과, 각 하이 쓰로틀과 로우 쓰로틀의 주기를 적은 것입니다. 만약 다른 변속기에서 주기(or 주파수)가 다르다면 그 주기(or 주파수)에 맞춰 프로그램을 수정하셔야 합니다.
오래만에 프로그램을 보니 잘 모르겠지만 ㅋㅋㅋ
제가 했던 하이 쓰로틀이 1.92ms이고, 로우 쓰로틀이 1.08ms 입니다. 그래서 실제 쓰로틀에 주는 상수 값은 위에 define으로 정의했는데요
#define Throttle_DOWN 2174 // 스로틀 다운
#define Throttle_UP 3840 // 스로틀 업
이것입니다. 소스 프로그램에서 레지스터 설정에 보시면 결국 이 스로틀 신호 1 = 0.5[us]를 가집니다.
그래서 1[us] = 쓰로틀 신호 2가 됩니다. 이제 원래 설정 시간인 1.92[ms] = 1920[us] 이고
따라서 1920*2 = 3840 이라는 쓰로틀 업 신호의 상수가 됩니다.
이런식으로 자신의 원하는 주기가 ms단위로 주어진다면 그 숫자에 2000을 곱하면 쓰로틀 신호의 값입니다.
예) 하나더 ㅋㅋ
1.08ms * 2000 = 2160
즉 2160이 로우 쓰로틀 신호입니다...
어랏...? 근데 저는 제 프로그램에서는 왜 2174를 했을까요?!? ㅋㅋㅋ 음...? 안되시면 오실로스코프로 PWM
출력핀 찍어서 주파수를 측정하는 것도 좋은 방법입니다!!
아무튼 궁금하신 사항 있으면 댓글달아주세요!
'__Old' 카테고리의 다른 글
What is the part number of connector? (0) | 2013.12.09 |
---|---|
에이즈상식 함께알기! 캠페인 (0) | 2013.08.01 |
CGV KIT 모바일 위젯 기념 이벤트!! (0) | 2013.07.23 |
대전 영화관 좌석 예매시 참고하세요! (0) | 2013.05.25 |