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

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

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


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

페이지 정보

작성자 키트 작성일2017-09-05 17:17 조회2,380회 댓글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

조회수 2,380

등록된 댓글이 없습니다.

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