BASIC4MCU | 질문게시판 | 답변 : 아트메가 코드에 대해서 질문하겠습니다!
페이지 정보
작성자 master 작성일2018-09-02 10:16 조회6,632회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=2885
본문
서보모터는 20ms 주기에서
high가 600us면 -90도 위치
high가 1500us면 0도 위치
high가 2400us면 +90도 위치
//일부 서보모터는 오차 등이 있어서 600 또는 2400으로 출력 했을 때 좌우 범위를 넘으므로700~2300us 로 범위를 조금 적게 주기도 합니다.범위를 넘게되면 브라켓에 닿아서 (드드드~) 심한 소음이 발생하게되고, 모터에도 좋지 않습니다.//RC용 서보모터는 5ms 정도의 짧은 주기에도 반응하지만일부 서보모터는 15ms 이상의 주기를 유지해야만 정상적인 동작을 합니다.//
//------------------------------------------------------------------------------void rc1_forward(void){for(i=0; i<80; i++){ // 10.6ms*80 = 848msPORTB|=_BV(0); _delay_us(600); PORTB&=~_BV(0); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc1_back(void){for(i=0; i<80; i++){ // 12.1ms*80 = 968msPORTB|=_BV(0); _delay_us(2100); PORTB&=~_BV(0); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc2_forward(void){for(i=0; i<80; i++){ // 10.5ms*80 = 840msPORTB|=_BV(5); _delay_us(500); PORTB&=~_BV(5); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc2_back(void){for(i=0; i<80; i++){ // 12.25ms*80 = 980msPORTB|=_BV(5); _delay_us(2250); PORTB&=~_BV(5); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc3_forward(void){for(i=0; i<80; i++){ // 10.5ms*80 = 840msPORTB|=_BV(6); _delay_us(500); PORTB&=~_BV(6); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc3_back(void){for(i=0; i<80; i++){ // 12.25ms*80 = 980msPORTB|=_BV(6); _delay_us(2250); PORTB&=~_BV(6); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc4_forward(void){for(i=0; i<80; i++){ // 10.5ms*80 = 840msPORTB|=_BV(7); _delay_us(500); PORTB&=~_BV(7); _delay_ms(10);}PORTB=0xFF;}//------------------------------------------------------------------------------void rc4_back(void){for(i=0; i<80; i++){ // 12.25ms*80 = 980msPORTB|=_BV(7); _delay_us(2250); PORTB&=~_BV(7); _delay_ms(10);}PORTB=0xFF;}
4개의 서보모터중 rc1만 시간이 다릅니다.같은 종류의 서보모터라면 이 서보모터가 다른 모터에 비해서 오차가 더 있는 것이죠또 시간이 제가 설명한 것과 조금 다릅니다.500us~2250us로 제어하고 있습니다.이 것은 딜레이 함수에 문제가 있을 수 있습니다.사용자 함수로 딜레이를 만드는 것보다컴파일러에서 제공하는 딜레이가 훨씬 정확합니다.딜레이 함수 사용 시에는 컴파일러 옵션에서최적화옵션을 -O1로 하는 것이 좋습니다.//PORTB = 0xFF;함수 마지막에 왜 0xFF를 줬는지 모르겠습니다.
댓글 0
조회수 6,632등록된 댓글이 없습니다.