Servus zusammen.
Ich hab die erste Version von Radbruch (vielen Dank dafür) mal etwas verändert und hab den Timer mal etwas anders konfiguriert - eigentlich nur die interrupt-frequenz erhöht, um eine höhere Auflösung bei der Ansteuerung zu erhalten.
Das funktioniert soweit auch super und problemlos. Werte die im Programm für links und rechts Anschlag stehen hab ich mit meinem kleinen
Modelcraft ES - 05 Servo ermittelt - durch probieren.
jetzt wollte ich aber mal an die anderen beiden ausgänge auch noch jeweils einen Servo hängen. Einer davon ist der kleine oben genannte, und der andere ein etwas größerer Modelcraft RS - 2.
Problem dabei ist, dass wenn ich den "großen" Servo dranhänge, schaltet meine Platine ab, schaut aus als würde kurz die Spannung zusammenbrechen. Das selbe passiert wenn ich zu dem kleinen, noch den andren kleinen hänge.
Jetzt ist natürlich die Frage:
Liegt das am Controller, dass dieser bei zu hohem (gesamt-)Strom abschaltet, oder liegt dass an der Spannungsversorung von der Hauptplatine?
Ich hab hier mal meine Servo-Ansteuerung angehängt, auch wenn diese vorerst nicht das Thema sein soll.
ps: zum code: ich wusste nicht ob der timer1 auf der m32 verwendet wird, und ob er so wie auf der base verwendet wird, daher habe ich ihn per Hand konfiguriert
Code:
// Servoansteuerung mit Timer1 31.1.2010 mic
// Einfach und elegant, warum finde ich das erst jetzt? Timer1 (RP6-Motoransteuerung)
// läuft ja sowieso im Hintergrund. Deshalb kann man die "klassische" Servoansteuerung
// in die Overflow-ISR einbauen und mit ca. 19kHz aufrufen lassen. Timersetup der Lib:
// Mode 10, Phase Correct mit ICR1 als Top ergibt bei ICR1=210 ca. 8MHz/420=19047,6Hz ;)
// Drehbereich meiner RS-2-Servos ist von ca. 14 bis ca. 38
/*****************************************************************************/
// Includes:
#include "RP6ControlLib.h" // The RP6 Control Library.
// Always needs to be included!
/*****************************************************************************/
// Variales:
volatile uint16_t servo1, servo2, servo3, p; // Servopositionen und Impulszähler
uint8_t c; // freie variable
/*****************************************************************************/
int main(void)
{
initRP6Control();
showScreenLCD("################", "################");
mSleep(1000);
showScreenLCD("<<Mein Test", "<<LC - DISPLAY>>");
mSleep(2000);
showScreenLCD(" Servo - Test 2 ", " Version 1.00 ");
mSleep(2000);
clearLCD(); // Clear the whole LCD Screen
cli();
// Timer 1:
// Clear OC1A when up-counting and set OC1A when down-counting,
// mode 8 (PWM, Phase and Frequency Correct, TOP ICR1), clk/8
TIMSK |= (1 << TOIE1);// Die Timer1 Overflow-ISR zur Servoansteuerung
TCCR1A = (1 << COM1A1)
| (0 << COM1A0)
| (0 << COM1B1)
| (0 << COM1B0)
| (0 << FOC1A)
| (0 << FOC1B)
| (1 << WGM11) //mode10
| (0 << WGM10);//mode10
TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (1 << WGM13) //mode10
| (0 << WGM12) //mode10
| (0 << CS12) //ohne vorteiler
| (0 << CS11) //ohne vorteiler
| (1 << CS10); //ohne vorteiler
ICR1 = 50; // 8mhz/(2*100) =160 kHz
sei();
DDRC = IO_PC5 | IO_PC6 |IO_PC7 ; // Servopins auf Ausgang setzen
servo1=servo2=servo3=26; // Servomitte?
setLEDs(0b1001); // und los!
//startStopwatch1();
//startStopwatch2();
//startStopwatch3();
while(1)
{
for(c=0;c<6;c++) // 6 mal ein einfaches Demo....
{
setLEDs(1<<c);
servo1=servo2=servo3=220; // mitte
p=50; while(p); // warten bis 50 Impulse gesendet (ca. 1 Sek.)
servo1=servo2=servo3=75; // links
p=50; while(p);
servo1=servo2=servo3=365; // rechts
p=50; while(p);
}
/*
setStopwatch1(0);
setStopwatch2(0);
setStopwatch3(0);
while(c) // und 6 mal ein etwas anspruchsvolleres Demo
{
setLEDs(1<<c);
if(getStopwatch1()>1000)
{
setStopwatch1(0);
switch(servo1)
{
case 38: servo1=30; break;
case 30: servo1=20; break;
case 20: servo1=14; break;
case 14: servo1=21; break;
case 21: servo1=31; break;
case 31: servo1=38; break;
}
}
if(getStopwatch2()>100)
{
setStopwatch2(0);
servo2++;
if (servo2 > 38) { servo2=14; c--; }
}
if(getStopwatch3()>300)
{
setStopwatch3(0);
if (servo3 == 10) servo3=50; else servo3=10;
}
task_RP6System(); // Verträglichkeitstest ;)
} */
}
return 0;
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > servo1) PORTC &= ~IO_PC5; else PORTC |= IO_PC5; // IO Pin 3
if(servocount > servo2) PORTC &= ~IO_PC6; else PORTC |= IO_PC6; // IO Pin 4
if(servocount > servo3) PORTC &= ~IO_PC7; else PORTC |= IO_PC7; // IO Pin 1
if(servocount < 3200) servocount++; else {servocount=1; if(p) p--;} // p = 1/50 Sek
}
Wär super wenn mir jemand einen Tip zum "Absturz" des Robbies geben kann.
Gruß!
Lesezeichen