모터 > 쿼드콥터 변속기 - I2C 어드레스 및 UART 데이터 포멧

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

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


BASIC4MCU | 모터 | BLDC모터 | 쿼드콥터 변속기 - I2C 어드레스 및 UART 데이터 포멧

페이지 정보

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

본문

PPM 신호를 받는 경우에는 ESC에 각각의 PPM 신호를 입력하므로 어드레스가 필요 없지만

I2C 경우에는 버스를 공유 하므로 어드레스가 필요합니다.

 

#define I2C_ADR      0x50
#define MOTOR_ID     1     // 1, 2, 3 or 4 

        TWAR=I2C_ADR+(MOTOR_ID<<1); TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWEA); // i2c init

4개의 ESC는 MOTOR_ID  1,2,3,4로 구분합니다.

//

uart_r06_01 - UART 경우에는

#define MOTOR_ID   1
//.equ MOTOR_ID  = 2
//.equ MOTOR_ID  = 3
//.equ MOTOR_ID  = 4
 

#define POWER_RANGE  100             // full range of tcnt0 setting 

 

interrupt [USART0_RXC] void usart0_rx_isr(void){
    U_C ch;
    ch=UDR0;
    if     (ch==0xf5){ NO_SYNC_flag=0; return; } // f5는 stx라고 생각하면 되겠습니다.
    else if(ch> 0xf5){ return; }      // f5 보다 크면 빠져나감
    if(NO_SYNC_flag)return;           // stx를 받지 못했으면 빠져나감
    ch>>=1;                           // 0~200 의 신호를 0~100으로 바꿉니다.
    if(ch>POWER_RANGE)ch=POWER_RANGE; // 데이터가 100보다 크면 100으로 설정
    NewDuty=ch;                       // 새로운 듀티로 설정
    NO_SYNC_flag=1;                   // 다음 데이터를 받기 위해서 stx 크리어
    control_timeout=CONTROL_TOT;      // 50; time = NUMBER x 65ms, 50*65=3250ms
} 

제일 마지막라인은 uart 데이터를 받을 때마다 control_timeout 변수에 50을 설정 해두고

타이머1에서 1씩 감소하면 3.2초 후에 0이 됩니다.


s6_power_ok:
        if(control_timeout==0)goto restart_control; //3.2sec over


restart_control:
        cli(); switch_POWER_OFF(); goto main;

3.2초 동안 UART 신호를 받지 못하면 power를 off 시킵니다.

 

데이터 포멧을 정리하면 0xF5 + DUTY 두바이트 입니다.

ID를 체크하지 않으므로 4개의 ESC를 사용하려면 UART가 4개나 소요되므로

이 타입은 쿼드콥터용이라기보다 단독으로 1개의 BLDC를 돌리는데 사용 되겠습니다.

포멧을 변경해서 (1바이트 더 늘려서) ID를 체크 한다면 RXD를 모두 묶어서 사용할 수 있습니다. (수신은 여러개 연결 가능)

//

 

#define I2C_TIME_OUT           100

i2c_rx_data:
        i2c_pwm=TWDR;    // typical range 0-250
    // reset rx data timeout
        i2c_timeout=I2C_TIME_OUT;
        goto twi_i89;

 

start6_9:
        com6com1();

        if(tcnt0_power_on==NO_POWER)goto init_startup;
        if(i2c_timeout==0)goto init_startup;
        if(t1_timeout==0)goto init_startup; 

I2C 타입은 100으로 설정하므로 6.5초가 됩니다.

댓글 0

조회수 1,070

등록된 댓글이 없습니다.

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