모터 > 쿼드콥터 변속기 - tgy6a 소스코드 분석시 참고하세요-2

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 모터

BLDC모터 | 쿼드콥터 변속기 - tgy6a 소스코드 분석시 참고하세요-2

페이지 정보

작성자 키트 작성일17-09-05 15:05 조회1,024회 댓글0건

첨부파일

본문

tgy6a 소스코드 분석하는 분들을 위해서 그동안 작업하던 파일을 첨부 파일에 올려둡니다.

어셈블러 파일이 첫 작업파일이고 c파일이 현재 작업중인 파일입니다.

i2c_r09_01 - I2C version with sources 이 파일을 가지고 작업 했으며

AVR 어셈블러는 이번에 처음 본 것인데다가

그동안 작업한 mcu의 어셈블러는 skip 명령어를 거의 사용하지 않는 것들이라서

skip 명령어가 많은 AVR의 명령어는 많이 헷갈립니다.

c로 변환하면서 많은 오류가 내포되어 있는 소스이니 이점 숙지하시고

분석하면서 참고만 하세요^^

 

업무 때문에 일정기간 동안 손을 대지 못 할 것 같고

소스 분석하고 있는 분이 계실지 몰라서 그동안 작업하던 파일을 올려두는 것입니다.^^

c로 변환하면서 변수명, 함수명등을 많이 변경 했습니다.(나름 간단하게 줄인다고..^^)

 

앞의 글에서 언급한 것처럼

c 파일에서 FET는 B채널과 C채널을 바꿔 놓은 상태입니다.

 

추가로, 비교기에 사용된 변수 하나만 설명 해드리죠


//----------------------------------------------------------------------
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
    if(I_ON_CY_flg)goto t0_on_cycle
//------------------------
t0_off_cycle:
    if(ACSR&ACO)COMP_flg=0; // mirror inverted ACO
    else        COMP_flg=1;

주석에보면 반전 시켰다는 설명이 있습니다.

비교기 +입력은 AIN0이고

ADC 채널이 -입력입니다.

따라서 ADC채널인 -입력이 높을 때에 +로 표시 하려면 반전 시켜야 이해하기 쉽습니다.

 

비교기 +입력인 AIN0는 BLDC 중성점(가상GND)이고

제로크로싱을 체크하기 위해서 사용됩니다.^^

 

//----------------------------------------------------------------------
// *** scan comparator utilities ***
void wt_comp_L(){ while(  ACSR&ACO ){ if(OCT1_flg)return; }; delay_us(2); if(!(ACSR&ACO))goto wt_for_lo; }
void wt_comp_H(){ while(!(ACSR&ACO)){ if(OCT1_flg)return; }; delay_us(2); if(  ACSR&ACO )goto wt_for_hi; } 

이 함수는 오류가 있습니다.

//----------------------------------------------------------------------
// *** scan comparator utilities ***
void wt_comp_L(){ while(!(ACSR&ACO)){ if(OCT1_flg)return; }; delay_us(2); if(!(ACSR&ACO))wt_comp_L; }
void wt_comp_H(){ while(  ACSR&ACO ){ if(OCT1_flg)return; }; delay_us(2); if(  ACSR&ACO )wt_comp_H; }
while문의 조건문이 바뀌었습니다.

goto 점프 어드레스도 함수명으로 바꿔야 합니다.

오류는 이 처럼 많은 곳에 존재 할겁니다.;;;^^

 

 두개가 같은 유형이니 하나만 설명 해드리겠습니다.

// *** scan comparator utilities ***
void wt_comp_L(){

    while(!(ACSR&ACO)){ // 비교기 출력이 low인동안(high가 될 때까지) 루프 실행

        if(OCT1_flg)return; // 타이머1 비교매치 인터럽트가 발생하면 빠져나감( time over )

    };

    delay_us(2); //약간의 시간을 기다린 후에

    if(!(ACSR&ACO))wt_comp_L; // 진짜로 high가 아니면 다시 처음으로

} 

 

delay_us(2);는 rcall wait_if_spike 명령으로

wait_if_spike: ldi temp1, 4
wait_if_spike2: dec temp1
  brne wait_if_spike2
  ret
함수는 위 명령어이고

 

void wait_if_spike(){

    char temp1=4;

    while(temp1--);

}

c로 바꾸면 위와 같이 됩니다.

정확한 시간은 시뮬레이션 돌려서 찾을 수 있지만

길지 않은 시간이니 대충 2us 딜레이라고 적어 놓은 것입니다.^^

 

3660040649_bDJW5Ozc_146.jpg

http://www.rctimer.com/product_146.html

 

3660040649_2Cbkx07J_20140418_163512.jpg3Ftype3Dw740

변속기 기판 사진입니다.^^

뒷면은 전에 올린 사진과 동일하나 알루미늄 방열판이 하나 덧대어 있는 점이 다릅니다.

 

3660040649_fsoN1upn_DYS20AMP.PNG3Ftype3Dw740

http://www.rcgroups.com/forums/showthread.php?t=1513678

가지고 있는 ESC와 PCB가 조금 다르지만 비슷한 버전인 것 같습니다.

댓글 : 0

조회수 : 1,024

등록된 댓글이 없습니다.

게시물 검색

모터 목록

게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전