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

TODAY669 TOTAL2,229,227
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


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

페이지 정보

작성자 키트 작성일2017-09-05 15:05 조회990회 댓글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

조회수 990

등록된 댓글이 없습니다.

모터HOME > 모터 > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기