본문 바로가기
__Old

송신기 없이 변속기(ESC) 설정(셋팅)하기

by LimDJ 2013. 6. 4.

 일단 쿼드콥터 카페[quadcopter 자작 카페]에서 하늬카스(kreder)님이 

 쓰로틀 조종없이 ESC 세팅하는 방법이 있나요?
 이 질문을 하셔서 도움이 될까 싶어서 제가 송신기 없이도 셋팅을 했던 프로그램을 짤막하게 올립니다.

 일단은 제가 한 ESC 모델은 Hobbywing FlyFun 12A Brushless ESC 아래 사진과 같습니다.
 아무튼 이 모델을 가지고 셋팅을 해야하는데요... 저도 처음에 엄청 고생하다가... 친구녀석이 데이터 이거 살때 주는 데이터 시트 한장을 가지고 프로그램을 짜더군요 ㅋㅋ 뭐 나중에 저도 하나하나 해보니 되긴 되더라구요 ㅎㅎ

 이 ESC 셋팅을 할 때는 최소와 최대 2가지 상태만 가지고 셋팅을 다 됩니다. 메뉴얼에 소리 톤을 잘 보고 셋팅을 하시면 됩니다. 이 셋팅을 하기 위한 MCU는 ATmega128이고, 프로그램은 CodevisionAVR으로 제작하였습니다. 입력스위치는 3개 정도 두었습니다. 그리고 PWM출력이 가능 한 핀, 프로그램 보시면 어느 핀이PWM 출력 핀인지 알게 되실 것 같습니다 ㅎㅎ
(최종적으로 보니 입력스위치는 두개밖에 쓰지 않았네요 ㅎㅎ)

 첨부파일에 코드비젼 프로젝트 파일 압축해서 올렸습니다 ^-^ 필요하시면 받으시구요!

ESC_setting.zip
다운로드

 

 


 

/*****************************************************

 

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

출력핀 찍어서 주파수를 측정하는 것도 좋은 방법입니다!!

 

아무튼 궁금하신 사항 있으면 댓글달아주세요!