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=100else 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보다 작으면 최소값 10NewDuty=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등록된 댓글이 없습니다.