모터 > RC수신기로부터 8채널 PWM 신호 입력 - PPM

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

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


BASIC4MCU | 모터 | 서보모터 | RC수신기로부터 8채널 PWM 신호 입력 - PPM

페이지 정보

작성자 키트 작성일2017-09-05 17:17 조회665회 댓글0건

본문

	

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//--------------------------------------------------------
// CVAVR
//--------------------------------------------------------
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
//
#define U_C unsigned char
#define U_I unsigned int
// 
U_I PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0;
U_I srt0=0,srt1=0,srt2=0,srt3=0,srt4=0,srt5=0,srt6=0,srt7=0;
U_I end0=0,end1=0,end2=0,end3=0,end4=0,end5=0,end6=0,end7=0;
//
void U1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }
void U1_str(char *s){ while(*s)U1_char(*s++); }
//
interrupt [EXT_INT0] void ext_int0_isr(void){ if(EICRA&0x01)srt0=TCNT1; else{ end0=TCNT1; PWM0=end0-srt0; } EICRA^=0x01; }
interrupt [EXT_INT1] void ext_int1_isr(void){ if(EICRA&0x04)srt1=TCNT1; else{ end1=TCNT1; PWM1=end1-srt1; } EICRA^=0x04; }
interrupt [EXT_INT2] void ext_int2_isr(void){ if(EICRA&0x10)srt2=TCNT1; else{ end2=TCNT1; PWM2=end2-srt2; } EICRA^=0x10; }
interrupt [EXT_INT3] void ext_int3_isr(void){ if(EICRA&0x40)srt3=TCNT1; else{ end3=TCNT1; PWM3=end3-srt3; } EICRA^=0x40; }
interrupt [EXT_INT4] void ext_int4_isr(void){ if(EICRB&0x01)srt4=TCNT1; else{ end4=TCNT1; PWM4=end4-srt4; } EICRB^=0x01; }
interrupt [EXT_INT5] void ext_int5_isr(void){ if(EICRB&0x04)srt5=TCNT1; else{ end5=TCNT1; PWM5=end5-srt5; } EICRB^=0x04; }
interrupt [EXT_INT6] void ext_int6_isr(void){ if(EICRB&0x10)srt6=TCNT1; else{ end6=TCNT1; PWM6=end6-srt6; } EICRB^=0x10; }
interrupt [EXT_INT7] void ext_int7_isr(void){ if(EICRB&0x40)srt7=TCNT1; else{ end7=TCNT1; PWM7=end7-srt7; } EICRB^=0x40; }
//
void main(){
  char str[50];
  EICRA=0xFF; EICRB=0xFF; EIMSK=0xFF// Rising edge
  TCCR1B=2;   // 0.5us
  UBRR1L=8; UCSR1B=0x18// 115200
  SREG=0x80;
  while(1){
    sprintf(str,"0=%5d 1=%5d 2=%5d 3=%5d "    ,PWM0,PWM1,PWM2,PWM3); U1_str(str);
    sprintf(str,"4=%5d 5=%5d 6=%5d 7=%5d \r\n",PWM4,PWM5,PWM6,PWM7); U1_str(str);
    delay_ms(100);
  }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//--------------------------------------------------------
// AVRStudio
//--------------------------------------------------------
#define F_CPU 16000000UL // 16MHz (AVRstudio6.2 작성)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
//
#define U_C unsigned char
#define U_I unsigned int
//
volatile U_I PWM0=0,PWM1=0,PWM2=0,PWM3=0,PWM4=0,PWM5=0,PWM6=0,PWM7=0;
volatile U_I srt0=0,srt1=0,srt2=0,srt3=0,srt4=0,srt5=0,srt6=0,srt7=0;
volatile U_I end0=0,end1=0,end2=0,end3=0,end4=0,end5=0,end6=0,end7=0;
//
void U1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }
void U1_str(char *s){ while(*s)U1_char(*s++); }
//
ISR(INT0_vect){ if(EICRA&0x01)srt0=TCNT1; else{ end0=TCNT1; PWM0=end0-srt0; } EICRA^=0x01; }
ISR(INT1_vect){ if(EICRA&0x04)srt1=TCNT1; else{ end1=TCNT1; PWM1=end1-srt1; } EICRA^=0x04; }
ISR(INT2_vect){ if(EICRA&0x10)srt2=TCNT1; else{ end2=TCNT1; PWM2=end2-srt2; } EICRA^=0x10; }
ISR(INT3_vect){ if(EICRA&0x40)srt3=TCNT1; else{ end3=TCNT1; PWM3=end3-srt3; } EICRA^=0x40; }
ISR(INT4_vect){ if(EICRB&0x01)srt4=TCNT1; else{ end4=TCNT1; PWM4=end4-srt4; } EICRB^=0x01; }
ISR(INT5_vect){ if(EICRB&0x04)srt5=TCNT1; else{ end5=TCNT1; PWM5=end5-srt5; } EICRB^=0x04; }
ISR(INT6_vect){ if(EICRB&0x10)srt6=TCNT1; else{ end6=TCNT1; PWM6=end6-srt6; } EICRB^=0x10; }
ISR(INT7_vect){ if(EICRB&0x40)srt7=TCNT1; else{ end7=TCNT1; PWM7=end7-srt7; } EICRB^=0x40; }
//
int main(){
  char str[50];
  EICRA=0xFF; EICRB=0xFF; EIMSK=0xFF// Rising edge
  TCCR1B=2;   // 0.5us
  UBRR1L=8; UCSR1B=0x18// 115200
  SREG=0x80;
  while(1){
    sprintf(str,"0=%5d 1=%5d 2=%5d 3=%5d "    ,PWM0,PWM1,PWM2,PWM3); U1_str(str);
    sprintf(str,"4=%5d 5=%5d 6=%5d 7=%5d \r\n",PWM4,PWM5,PWM6,PWM7); U1_str(str);
    _delay_ms(100);
  }
}
cs

사용하지 않는 채널은 노이즈에 의한 오동작 등을 방지하기 위해서 10K 풀다운 저항을 사용하는 것이 좋습니다.


스타트값에서 TCNT1이 65000 이고, 엔드값에서 TCNT1이 200 인 경우
PWM7=end7-srt7;  
200-65000=-64800 이렇게 연산을 하면 음수값이 발생합니다.
우리가 원하는 값은 (65536-65000)+200=736 이고 16진으로는 0x02E0 입니다.

200-65000=-64800 이렇게 연산을 하면 오버플로우 해서 정상적이 아닌 값이 될 것 같지만
16진으로보면 0x02E0로 같은 결과가 얻어집니다.

3660040649_sdRnDFMT_frame_ppm.gif

3660040649_UcuC9t5Z_ppm.jpg

RC

한개의 신호가 아니고

분리된 신호를 입력 받는 예제입니다. 

댓글 0

조회수 665

등록된 댓글이 없습니다.

모터HOME > 모터 > 서보모터 목록

게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기