Gerando PPM Atmega48/168/328
- gustavo_123
- membro
- Mensagens: 170
- Registrado em: Qua Mai 21, 2008 5:00 pm
- Localização: São Paulo
Gerando PPM Atmega48/168/328
Pessoal, fiz esse codigo para gerar o sinal ppm no padrao futaba, com quantos canais eu quiser.
Minha principal ideia é poder utilizar um micontrolador para acrescentar canais/mixagens em radios simples, colocando esse circuito entre o saida o sinal e a etapa transmissora.
Gostaria de opinioes para melhora-lo.
Quem tiver interesse pode utilizar sem problemas.
[code:1:193a77f89e]#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define FRAME_TIME 22500
#define SHIFT_TIME 300
#define CHANNELS 8
int channel[CHANNELS];
int output[(CHANNELS*2)+3];
int channel_num, pos_update=0, pos=0;
void update_output(void);
ISR(TIMER1_COMPA_vect){
pos++;
OCR1A = output[pos];
if (pos==(CHANNELS*2)+1)
update_output();
if (pos>=(CHANNELS*2)+2)
pos=0;
}
void start_timer_output(void){
sei();
TIMSK1 = (1<<OCIE1A);
TCCR1A = (1<<COM1A0); // Toggle OC1A
TCCR1B = (1<<WGM12)|(1<<CS11); // CTC, Clk/8
}
void update_output(void){
channel_num=0;
output[(CHANNELS*2)+1] = FRAME_TIME-((CHANNELS+2)*SHIFT_TIME);
for (pos_update=1; pos_update<(CHANNELS*2)+1; pos_update+=2){
output[pos_update] = channel[channel_num];
output[(CHANNELS*2)+1] -= channel[channel_num];
channel_num++;
}
}
int main (void){
DDRB = (1<<PB1);
//Valores Iniciais
for (pos=0; pos<((CHANNELS*2)+3); pos++){
output[pos] = SHIFT_TIME;
}
for (channel_num=0; channel_num<CHANNELS; channel_num++){
channel[channel_num]=1500;
}
update_output();
pos=0;
OCR1A = output[pos];
start_timer_output();
while (1)
{
//Atualizar canais
}
return 0;
}[/code:1:193a77f89e]
Minha principal ideia é poder utilizar um micontrolador para acrescentar canais/mixagens em radios simples, colocando esse circuito entre o saida o sinal e a etapa transmissora.
Gostaria de opinioes para melhora-lo.
Quem tiver interesse pode utilizar sem problemas.
[code:1:193a77f89e]#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define FRAME_TIME 22500
#define SHIFT_TIME 300
#define CHANNELS 8
int channel[CHANNELS];
int output[(CHANNELS*2)+3];
int channel_num, pos_update=0, pos=0;
void update_output(void);
ISR(TIMER1_COMPA_vect){
pos++;
OCR1A = output[pos];
if (pos==(CHANNELS*2)+1)
update_output();
if (pos>=(CHANNELS*2)+2)
pos=0;
}
void start_timer_output(void){
sei();
TIMSK1 = (1<<OCIE1A);
TCCR1A = (1<<COM1A0); // Toggle OC1A
TCCR1B = (1<<WGM12)|(1<<CS11); // CTC, Clk/8
}
void update_output(void){
channel_num=0;
output[(CHANNELS*2)+1] = FRAME_TIME-((CHANNELS+2)*SHIFT_TIME);
for (pos_update=1; pos_update<(CHANNELS*2)+1; pos_update+=2){
output[pos_update] = channel[channel_num];
output[(CHANNELS*2)+1] -= channel[channel_num];
channel_num++;
}
}
int main (void){
DDRB = (1<<PB1);
//Valores Iniciais
for (pos=0; pos<((CHANNELS*2)+3); pos++){
output[pos] = SHIFT_TIME;
}
for (channel_num=0; channel_num<CHANNELS; channel_num++){
channel[channel_num]=1500;
}
update_output();
pos=0;
OCR1A = output[pos];
start_timer_output();
while (1)
{
//Atualizar canais
}
return 0;
}[/code:1:193a77f89e]
- Igor Souza
- membro
- Mensagens: 5427
- Registrado em: Dom Nov 19, 2006 12:47 pm
- Localização: São Paulo - SP
- Contato:
- gustavo_123
- membro
- Mensagens: 170
- Registrado em: Qua Mai 21, 2008 5:00 pm
- Localização: São Paulo
Sim, conheco os principais projetos feitos com arduino, mas nao quero utiliza-lo, pois esses metodos usando pulsein e delay ocupam mto tempo do processador, nao restando mto processamento para outras funcoes.
O ideial é fazer baseado em interrupcoes como fiz, a leitura do sinal ppm tb será com interrupcoes. Alem de ter maior precisão no tempo com o uso de interrupcoes.
Seria interessante se no forum tivesse mais projetos de eletronica, e principalmente se o pessoal postasse esquematicos e codigos.
O ideial é fazer baseado em interrupcoes como fiz, a leitura do sinal ppm tb será com interrupcoes. Alem de ter maior precisão no tempo com o uso de interrupcoes.
Seria interessante se no forum tivesse mais projetos de eletronica, e principalmente se o pessoal postasse esquematicos e codigos.
- Igor Souza
- membro
- Mensagens: 5427
- Registrado em: Dom Nov 19, 2006 12:47 pm
- Localização: São Paulo - SP
- Contato:
- gustavo_123
- membro
- Mensagens: 170
- Registrado em: Qua Mai 21, 2008 5:00 pm
- Localização: São Paulo
- marcos soares
- membro
- Mensagens: 957
- Registrado em: Dom Out 18, 2009 9:28 am
- Localização: brasilia de minas MG
[quote:dcaaba042f="gustavo_123"]Pode ser tb direto dos potenciometros.
Por enquanto ainda nao tenho um projeto definido, só quis mesmo deixar o codigo disponivel pra alguem que quisesse.[/quote:dcaaba042f]
gustavo no caso voce poderia postar os esquema eletronico, tenho uma carcassa de um tx futaba e poderia montar um tx para simulador com a carcassa, ou ate mesmo colocar um modulo 2.4 , seu que nao compessa ja que o preco dos tx ta muito barato mas e interessante fazer algo e ver fucionando......... abracos
marcos soares
Por enquanto ainda nao tenho um projeto definido, só quis mesmo deixar o codigo disponivel pra alguem que quisesse.[/quote:dcaaba042f]
gustavo no caso voce poderia postar os esquema eletronico, tenho uma carcassa de um tx futaba e poderia montar um tx para simulador com a carcassa, ou ate mesmo colocar um modulo 2.4 , seu que nao compessa ja que o preco dos tx ta muito barato mas e interessante fazer algo e ver fucionando......... abracos
marcos soares
- gustavo_123
- membro
- Mensagens: 170
- Registrado em: Qua Mai 21, 2008 5:00 pm
- Localização: São Paulo
- RCampos
- membro
- Mensagens: 935
- Registrado em: Sáb Ago 11, 2007 12:30 pm
- Localização: Uberaba-MG
- Contato:
Aproveitando o tópico, seria possível gerar um sinal PPM de 8 canais através do PC?
A minha ideia é injetar este sinal direto do PC no módulo FrSky e controlar um automodelo através do PC.
Não sei se é possível gerar este tipo de sinal em um PC, uma vez que ele não trabalha em tempo real. Já ouvi relatos de pessoas fazendo isso com o DOS ou o Linux com módulo RTLinux.
Alguém aí pode me auxiliar.
Grato.
A minha ideia é injetar este sinal direto do PC no módulo FrSky e controlar um automodelo através do PC.
Não sei se é possível gerar este tipo de sinal em um PC, uma vez que ele não trabalha em tempo real. Já ouvi relatos de pessoas fazendo isso com o DOS ou o Linux com módulo RTLinux.
Alguém aí pode me auxiliar.
Grato.
- gustavo_123
- membro
- Mensagens: 170
- Registrado em: Qua Mai 21, 2008 5:00 pm
- Localização: São Paulo