Gerando PPM Atmega48/168/328

Li-po, Li-Ion, Nimh, 1s2p, 10c...... quer aprender mais sobre o "combustivel" dos nossos modelos? Este é o local! Aqui também está aqueles esquema de carregador ou aquele ESC que estava procurando.
Avatar do usuário
gustavo_123
membro
Mensagens: 170
Registrado em: Qua Mai 21, 2008 5:00 pm
Localização: São Paulo

Gerando PPM Atmega48/168/328

Mensagem por gustavo_123 »

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]
Avatar do usuário
Igor Souza
membro
Mensagens: 5427
Registrado em: Dom Nov 19, 2006 12:47 pm
Localização: São Paulo - SP
Contato:

Mensagem por Igor Souza »

Bem... vc quer ler o sinal PPM, modifica-lo e gerar um novo a cada ciclo?

Já deu uma olhada nos projetos de arduino? Tem vários, acho que nao precisa nada além de pulseIn() e delayMicroseconds() para fazer isso, hehehhe.

A noite tento escrever algo.

Abrcs!
Avatar do usuário
gustavo_123
membro
Mensagens: 170
Registrado em: Qua Mai 21, 2008 5:00 pm
Localização: São Paulo

Mensagem por gustavo_123 »

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.
Avatar do usuário
Igor Souza
membro
Mensagens: 5427
Registrado em: Dom Nov 19, 2006 12:47 pm
Localização: São Paulo - SP
Contato:

Mensagem por Igor Souza »

Acabei não escrevendo... :lol:

Porque não pega os sinais direto dos potenciômetros? Afinal o rádio não deve ter funções que irão fazer falta ou que não possam ser implementadas no programa.
Se falar que vai sobrar um baita tempo para processar quase qualquer coisa :D.

Abrcs!
Avatar do usuário
gustavo_123
membro
Mensagens: 170
Registrado em: Qua Mai 21, 2008 5:00 pm
Localização: São Paulo

Mensagem por 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.
Avatar do usuário
MacCross
membro
Mensagens: 633
Registrado em: Dom Dez 07, 2008 8:32 pm
Localização: Santana de Parnaíba, SP

Mensagem por MacCross »

Gustavo

Seria ótimo se vc comentasse o código para ser mais fácil aprender.
Abrç
Avatar do usuário
marcos soares
membro
Mensagens: 957
Registrado em: Dom Out 18, 2009 9:28 am
Localização: brasilia de minas MG

Mensagem por marcos soares »

[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
Avatar do usuário
gustavo_123
membro
Mensagens: 170
Registrado em: Qua Mai 21, 2008 5:00 pm
Localização: São Paulo

Mensagem por gustavo_123 »

como to bonzinho (aprendendo a usar um software), fiz um esquematico simples, ta aqui [url]http://dl.dropbox.com/u/6608330/controle.pdf[/url]

(o cristal é de 8Mhz)

O codigo como está ainda nao funciona com esse esquematico, logo posto um novo codigo comentado.
Avatar do usuário
RCampos
membro
Mensagens: 935
Registrado em: Sáb Ago 11, 2007 12:30 pm
Localização: Uberaba-MG
Contato:

Mensagem por RCampos »

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.
Avatar do usuário
gustavo_123
membro
Mensagens: 170
Registrado em: Qua Mai 21, 2008 5:00 pm
Localização: São Paulo

Mensagem por gustavo_123 »

direto pelo pc eu não sei se tem como... mas vc pode usar um microcontrolador ligado ao pc pela serial ou pela usb, que receba dados seriais e com eles gerar o PPM.

só fique atento em usar um baudrate alto pra não criar um gargalo na comunicação...
Responder