collapse

* Posts Recentes

Proteção Lipo por Kristey
[Ontem às 13:24]


Mais uma reparação - frigorífico Fagor por SerraCabo
[16 de Janeiro de 2019, 18:46]


Rolamentos por almamater
[13 de Janeiro de 2019, 22:26]


Artigo 11, 13 e os restantes por brunus
[13 de Janeiro de 2019, 20:26]


Corte de metal - Evolution Rage 2 por SerraCabo
[12 de Janeiro de 2019, 12:36]


Procuro serviço de impressão 3D por brunus
[10 de Janeiro de 2019, 13:41]


Compra partilhada no site da Elektor [voucher 10€ até 2 Janeiro] por brunus
[09 de Janeiro de 2019, 17:37]


Video Porteiro do Prédio por Alfredo Garcia
[06 de Janeiro de 2019, 23:27]


Alicate para crimpar? por Njay
[02 de Janeiro de 2019, 02:02]


Quem quer uma Elektor? por jm_araujo
[01 de Janeiro de 2019, 13:10]

Autor Tópico: Robo Seguidor de linha - Ajuda com servos  (Lida 1146 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline NoSwear

  • Mini Robot
  • *
  • Mensagens: 3
Robo Seguidor de linha - Ajuda com servos
« em: 22 de Novembro de 2014, 23:59 »
Boas, estou a montar um robo que segue uma linha preta...  No entanto, mal comecei,deparei me com uma grande dificuldade... a programação dos servos XD

Bem, a grande questão é que estou a programar em .C, directamente no microprocessador ATMEGA328p

Encontrei um ou outro código na web que poderia ajudar me mas até agora, algo esta errado:
-> ou o servo anda... sem parar
-> ou o servo não anda

outro grande problema é, vou precisar de 2 rodas (2 servos)... tenho que utilizar os timers de 8 bits (Timer 0 e Timer 2) certo?

Alguém que me possa elucidar sobre o assunto?

*em anexo segue o código que quase funciona direito XD*
Código: [Seleccione]
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>

#define RODA PB1

void pwm_anda()
{
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);        //NON Inverted PWM
  TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); //PRESCALER=64 MODE 14(FAST PWM)
  ICR1=4999;  //fPWM=50Hz
}

void pwm_nao_anda()
{
TCCR1A &= ~(1<<COM1A1) & ~(1<<COM1B1);        //NON Inverted PWM
  TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); //PRESCALER=64 MODE 14(FAST PWM)
  ICR1=0;  //fPWM=50Hz
}

void main()
{
DDRB|=(1<<RODA);

TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);        //NON Inverted PWM
  TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS11)|(1<<CS10); //PRESCALER=64 MODE 14(FAST PWM)
  ICR1=4999;  //fPWM=50Hz
 
while(1)
  {
void pwm_anda();
_delay_ms(2000);

  void pwm_nao_anda();
_delay_ms(10000);
   }
}

Desde já, Boa Noite.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.223
    • Clube de Robotica
Re: Robo Seguidor de linha - Ajuda com servos
« Responder #1 em: 23 de Novembro de 2014, 03:08 »
Ora boas noites

Se estas a usar um ATMega porque não tentas ver o source code da biblioteca servo do arduino? Ajuda muito.

Quanto ao teu codigo, não pareces estar a mudar o duty do teu PWM, a percentagem do periodo que está a 1.
Um servo tem de receber um PWM de 50Hz mas tens de mudar o tempo a HIGH entre 1ms e 2ms para mudar a posição do servo.


Eu o que faço para usar só um timer é criar um timer que contar microsegundos (acho que algo como 10-100uS não me lembro de cor). Depois dentro do interrupt do timer, conforme o valor do contador meto os pins que quero a 1 ou 0. Quando o contador indica que já passou 0,2 segundos (os 50Hz), faço reset ao contador.
Basicamente emulo um timer de 50Hz usando um timer a uma frequência mais alta que me permite mudar por software os dutys do PWM de varios pins
« Última modificação: 23 de Novembro de 2014, 03:10 por LuísR.A. »
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/