Witam
od dłuższego czasu siedzę nad jednym problemem a mianowicie zrobiłem płytkę na Atmega8 sterującą ośmioma serwami... napisałem kod...
Problem polega na tym ze serwa chodzą ładnie ale nie dla każdej zadanej pozycji(dla niektórych drgają).
jak zmieniam wartość TCNT0 (przy TCNT0=200 jeszcze w miarę działa, przy 230 już nie działa praktycznie nic, nie widać nawet nic na oscyloskopie) na większa w celu zwiększenia częstotliwości przerwania to procesor prawdopodobnie nie nadąża wykonywać instrukcji warunkowych.
Chcemy zwiekszyc częstotliwość przerwań w celu możliwości sterowania serwem z większa dokładnością(mniejszy kąt), aby zmienne serwo1 .... były rzędu kilkuset. Kiedy te zmienne są w okolicach 10-20 wtedy zmiana o 1 licznika (count) wywołuje zbyt duży ruch serwa.
Co zrobić aby móc sterować serwem z większą precyzją i żeby program nie głupiał? Czy moje podejrzenia są słuszne, że procek nie nadąża wykonywać instrukcji?
od dłuższego czasu siedzę nad jednym problemem a mianowicie zrobiłem płytkę na Atmega8 sterującą ośmioma serwami... napisałem kod...
#include <avr/interrupt.h>
#include <avr/delay.h>
volatile int counter=0;
int serwo1, serwo2, serwo3, serwo4, serwo5, serwo6, serwo7, serwo8;
// volatile unit8_t flagi;
unsigned char liczt0;
ISR(SIG_OVERFLOW0)
{
TIMSK |= _BV(TOIE2);
TCNT0=200;
counter++;
}
int main(void)
{
DDRB=0b00000111;
DDRD=0b11101100;
DDRC=0x00;
TIMSK = (1<<TOIE0) | (1<<TOIE2); //elaczenie przerwan
// TCNT0=200 ; // od 61 liczy do 255 - przepelnienie
TCCR0 = _BV(CS00) ; //ust bez preskalera
sei();
// if ((PINC & 0x01) == 0)
//
// serwo7=10;
// else
// serwo7=22;
serwo1=8;
serwo2=12;
serwo3=12;
serwo4=12;
serwo5=12;
serwo6=12;
serwo7=12;
serwo8=12;
while(1)
{
if (counter<=1)
{
PORTD |= _BV(2); // SERWO 1
PORTD |= _BV(3); // SERWO 2
PORTD |= _BV(5); // SERWO 3
PORTD |= _BV(6); // SERWO 4
PORTD |= _BV(7); // SERWO 5
PORTB |= _BV(0); // portb0=1 SERWO 6
PORTB |= _BV(1); // SERWO 7
PORTB |= _BV(2); // SERWO 8
}
if (counter>=serwo1)
PORTD &= ~(_BV(2));
if (counter>=serwo2)
PORTD &= ~(_BV(3));
if (counter>=serwo3)
PORTD &= ~(_BV(5));
if (counter>=serwo4)
PORTD &= ~(_BV(6));
if (counter>=serwo5)
PORTD &= ~(_BV(7));
if (counter>=serwo6)
PORTB &= ~(_BV(0));
if (counter>=serwo7)
PORTB &= ~(_BV(1));
if (counter>=serwo8)
PORTB &= ~(_BV(2));
if (counter>=500)
counter=0;
/* if(licznik==zadane0)
PORTD &= ~(_BV(6));
if(licznik==zadane0)
PORTD &= ~(_BV(7));
if(licznik==zadane0)
PORTB &= ~(_BV(0));
if(licznik==zadane1)
PORTB &= ~(_BV(1));
if(licznik == zadane2)
PORTB &= ~(_BV(2));
if(licznik == 100)
{
TIMSK &= ~(_BV(TOIE2));
TCCR2 = 0;
licznik = 0;
} */
}
}
Problem polega na tym ze serwa chodzą ładnie ale nie dla każdej zadanej pozycji(dla niektórych drgają).
jak zmieniam wartość TCNT0 (przy TCNT0=200 jeszcze w miarę działa, przy 230 już nie działa praktycznie nic, nie widać nawet nic na oscyloskopie) na większa w celu zwiększenia częstotliwości przerwania to procesor prawdopodobnie nie nadąża wykonywać instrukcji warunkowych.
Chcemy zwiekszyc częstotliwość przerwań w celu możliwości sterowania serwem z większa dokładnością(mniejszy kąt), aby zmienne serwo1 .... były rzędu kilkuset. Kiedy te zmienne są w okolicach 10-20 wtedy zmiana o 1 licznika (count) wywołuje zbyt duży ruch serwa.
Co zrobić aby móc sterować serwem z większą precyzją i żeby program nie głupiał? Czy moje podejrzenia są słuszne, że procek nie nadąża wykonywać instrukcji?