Tufican
Joined: 23 Feb 2011 Posts: 10 Location: Turkey- izmir
|
Pwm decoder from rc transmitter |
Posted: Thu Jan 26, 2012 5:37 am |
|
|
I write this code. It reads 4 pwm signals from a remote controller from 1 pin with 4 to 1 multiplexer.
You can use this program for your quadcopter multicopter helicopter or plane.
You can add imu sensors and another sensors.
The program is working good and output data is coming from uart.
I use 74153 mux.
Mux selector pins is pin_d0 and pin_d1
and pic 18f4580 8mhz internal with 4xpll 32mhz.
Data format is
0*0*0*0
If every channels will left
data is
-8*-8*-8*-8
If every channels will right
8*8*8*8
coming from uart
loop time is 20ms
Code: |
#include <18F4580.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(internal=8Mhz , clock=32Mhz)
#use rs232(baud=38400, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
int a=0;
int t=0;
int sira=1;
int k[5];
#INT_CCP1 // INT_CCP1 kesmesi fonksiyonu
void yakala1_kesmesi ()
{
if(a==1)
a=0;
else
a=1;
}
void main() {
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
set_tris_b(0x00); // B portu komple çıkış
set_tris_d(0x00); // B portu komple çıkış
set_tris_c(0x07); // RC0, RC1 ve RC2 pini giriş
output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor
output_d(0x00); // İlk anda B portu çıkışı sıfırlanıyor
setup_ccp1(CCP_CAPTURE_re); // CCP1 kesmesi yükselen aktif// fe olursa düşen
CCP_1_HIGH=0x00; // CCPR1H kaydedicisi sıfırlanıyor
CCP_1_LOW=0x00; // CCPR1H kaydedicisi sıfırlanıyor
enable_interrupts(INT_CCP1); // INT_CCP1 kesmesi aktif yapılıyor
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
k[1]=0;
k[2]=0;
k[3]=0;
k[4]=0;
Delay_ms(10);
printf("START!");
Delay_ms(10);
while(TRUE)
{
output_d(sira-1);
//delay_ms(1);
setup_ccp1(CCP_CAPTURE_re);
while(a==0)
{
//output_d(1);
}
if(a==1)
{
setup_ccp1(CCP_CAPTURE_fe);
while(a==1)
{
t++;
delay_us(15);
}}
a=0;
k[sira]=(t+160);
sira++;
if(sira==5)
{
printf("%d*%d*%d*%d"k[1]*(-1),k[2],k[3]+25,k[4]);
sira=1;
// delay_ms(100);
}
t=0;
}
}
|
|
|