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 4TWAR=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등록된 댓글이 없습니다.