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 딜레이라고 적어 놓은 것입니다.^^
http://www.rctimer.com/product_146.html
변속기 기판 사진입니다.^^
뒷면은 전에 올린 사진과 동일하나 알루미늄 방열판이 하나 덧대어 있는 점이 다릅니다.
http://www.rcgroups.com/forums/showthread.php?t=1513678
가지고 있는 ESC와 PCB가 조금 다르지만 비슷한 버전인 것 같습니다.
댓글 : 0
조회수 : 1,024
등록된 댓글이 없습니다.