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

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

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


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

페이지 정보

작성자 키트 작성일2017-09-05 15:16 조회1,585회 댓글0건

본문

전에 분석하다가 중단한 소스를 시간나는대로 조금씩 분석 하겠습니다.^^
윗글의 첨부파일 참고하세요^^

        //----------------------------------------------------------------------
        // **** running control loop ****
run1: // Cp_on+Bn_pwm->comp A↑
        wt_comp_L2H(); if(OCT1_flg)goto run_to_srt; eval_rpm(); wt_OCT1_B4_sw(); comuApBn1(); update_tm(wt_comp_scan); wt_OCT1();
run2: // Ap_on+Bn_pwm->comp B↓
        wt_comp_H2L(); if(OCT1_flg)goto run_to_srt; eval_i2c(); wt_OCT1_B4_sw(); comuApCn2(); update_tm(wt_comp_scan); wt_OCT1();
run3: // Ap_on+Cn_pwm->comp C↑
        wt_comp_L2H(); if(OCT1_flg)goto run_to_srt; set_duty(); wt_OCT1_B4_sw(); comuBpCn3(); update_tm(wt_comp_scan); wt_OCT1();
run4: // Bp_on+Cn_pwm->comp A↓
        wt_comp_H2L(); if(OCT1_flg)goto run_to_srt;             wt_OCT1_B4_sw(); comuBpAn4(); update_tm(wt_comp_scan); wt_OCT1();
run5: // Bp_on+An_pwm->comp B↑
        wt_comp_L2H(); if(OCT1_flg)goto run_to_srt;             wt_OCT1_B4_sw(); comuCpAn5(); update_tm(wt_comp_scan); wt_OCT1();
run6: // Cp_on+An_pwm->comp C↓
        wt_comp_H2L(); if(OCT1_flg)goto run_to_srt;             wt_OCT1_B4_sw(); comuCpBn6(); update_tm(wt_comp_scan); wt_OCT1();

상 출력을 하는 사이사이 몇가지 작업을 분산해서 처리하고 있습니다.
나누어서 처리하면 시간적으로 여유가 생기죠^^
이중에서 eval_i2c(); 이 부분을 보죠


//----------------------------------------------------------------------
interrupt [TWI] void twi_isr(void){
    i_tp1=TWSR&0xf8;
    if     ( i_tp1==0x60)                { byte_cnt=0;                   TWINT=1; }
    else if( i_tp1==0x80)                { i2c_pwm=TWDR; i2c_tm_out=100; TWINT=1; }  //I2C_TM_MAX=100
    else if((i_tp1==0xa8)||(i_tp1==0xb8)){ TWDR=byte_cnt++;              TWINT=1; }
    else if((i_tp1==0xf8)||(i_tp1==0x00)){ TWSTO=1;                      TWINT=1; }
    else                                 { TWEA=1; TWEN=1; TWIE=1;       TWINT=1; }
}
//----------------------------------------------------------------------
I2C 통신 방식의 예제라서 I2C로 PWM 듀티를 입력 받고
아래 함수에서는 0~255 입력을 0~100으로 변환합니다.

void eval_i2c(){
    tp2=i2c_pwm-i2c_pwm/8-i2c_pwm/16;       // sub i2c_pwm*(13/16), 0~255 -> 0~207로 1차 변환 한 후
    if(tp2>200)tp2=200;                     // limit to 200, 200이 넘으면 200으로 자른 후
    tp2/=2;                                 // (100 steps), 2로 나누어서 0~100으로 변환 했습니다.
    if((i2c_pwm>=10)&&(tp2<10))tp2=10;      // MIN_DUTY=10%, I2C 입력이 10이상이고 결과가 10보다 작으면 최소값 10
    NewDuty=tp2;                            // 계산된 듀티를 저장
}
//----------------------------------------------------------------------
이 함수를 c스타일로 변경하면

void eval_i2c(){
    if((i2c_pwm>=10)&&(i2c_pwm<26))NewDuty=10; // I2C값이 10이상이고 연산후의 값이 10미만이 되는 경우 10으로 설정
    else                           NewDuty=(U_C)( (float)i2c_pwm*100.0/255.0 ); // 연산후 10이상의 값인 경우
}
실수 연산은 시간이 많이 걸려서 사용하지 못하지만 연산만 보면 이렇게 됩니다.

댓글 0

조회수 1,585

등록된 댓글이 없습니다.

모터HOME > 모터 > BLDC모터 목록

게시물 검색

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
모바일버전으로보기