BASIC4MCU | 모터 | 서보모터 | RC수신기로부터 8채널 PWM 신호 입력 - PPM
페이지 정보
작성자 키트 작성일2017-09-05 17:17 조회3,209회 댓글0건본문
1234567891011121314151617181920212223242526272829303132333435363738 //--------------------------------------------------------// 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 edgeTCCR1B=2; // 0.5usUBRR1L=8; UCSR1B=0x18; // 115200SREG=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
12345678910111213141516171819202122232425262728293031323334353637383940 //--------------------------------------------------------// 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 edgeTCCR1B=2; // 0.5usUBRR1L=8; UCSR1B=0x18; // 115200SREG=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로 같은 결과가 얻어집니다.한개의 신호가 아니고분리된 신호를 입력 받는 예제입니다.
댓글 0
조회수 3,209등록된 댓글이 없습니다.