pát 09.03.2018 7:47
úte 13.03.2018 22:08
stř 14.03.2018 13:07
Medved74 píše:Ahoj slowake,
děkuju za odkaz. Vypadá že tester toho umí hodně, ale jestli jsem dobře hledal, tak rychlost přeběhu umí jen v 4 nebo 6 stupních. To je nejspíš málo.
Jirka
čtv 15.03.2018 20:01
Servotester SETUP píše:void setup() {
// set up Timer 2
TCCR2A = 0; // normal operation
TCCR2B = bit(WGM22) | bit (CS22); // CTC, scale to clock / 256
OCR2A = 124; // compare A register value (256 * clock speed / 125)
TIMSK2 = bit (OCIE2A); // interrupt on Compare A Match
...
Servotester INTERRUPT ROUTINE píše:ISR(TIMER2_COMPA_vect)
{ // zaciatok prerusenia
noInterrupts();
citac++;
if ( citac >= 20)
{
citac = 0;
static boolean state = false;
state = !state; // toggle
digitalWrite (LED, state ? HIGH : LOW);
if( val <= 0)
outservo = map(val, -100, 0, MinRange, MidRange); // scale it to use it with the servo (value between 0 and 180)
if( val > 0)
outservo = map(val, 0, 100, MidRange, MaxRange); // scale it to use it with the servo (value between 0 and 180)
myservo.writeMicroseconds(outservo); // set servo to mid-point
...
...
interrupts();
} // koniec prerusenia
pát 16.03.2018 22:30
sob 17.03.2018 8:14
// servo rozsah a rychlost pohybu @ Arduino nano:
int dir = 1;
unsigned int min_uS = 1000;
unsigned int max_uS = 2000;
unsigned int puls2_uS = 1500;
unsigned int wide_uS = 500;
static unsigned int neutral_uS = 1500;
static unsigned long period_uS = 20000;
void setup() {
pinMode(2, OUTPUT); // servo 1 @ pin 2 (servo s pohybem dle poťáku - klasický servotester)
pinMode(3, OUTPUT); // servo 2 @ pin 3 (servo s rozkmitem a rychlostí dle poťáků)
pinMode(4, OUTPUT); // servo 3 @ pin 4 (servo s trvalým neutrálem)
pinMode(A1, INPUT); // potak1 @ pin A1
pinMode(A5, INPUT); // potak2 @ pin A5
}
void loop() {
unsigned long aktual_uS = micros();
unsigned int puls1_uS = analogRead(A1) + min_uS;
unsigned int step_ = ( puls1_uS - min_uS ) / 10;
wide_uS = analogRead(A5)/2;
puls2_uS = puls2_uS + dir * step_;
if (puls2_uS >= (neutral_uS + wide_uS) || puls2_uS <= (neutral_uS - wide_uS)) {
puls2_uS = puls2_uS - dir * step_;
dir = -1 * dir;
}
pulz(puls1_uS, 2);
pulz(puls2_uS, 3);
pulz(neutral_uS, 4);
while (micros() - aktual_uS <= period_uS){ }
}
void pulz(int pulz_uS, byte servo) {
unsigned long out_uS = micros();
digitalWrite(servo, HIGH);
while (micros() - out_uS <= pulz_uS){}
digitalWrite(servo, LOW);
}
sob 17.03.2018 9:33
sob 17.03.2018 18:39
sob 17.03.2018 20:47
ellet píše:Nevím co tam všechno máš ale TCCR2B bit WGM22 dle datasheetu ATmega328, nastavuje režim 4 (rezervováno) asi by mělo být:
TCCR2A | = (1 << WGM21); // režim 2, CTC
TCCR2B | = (1 << CS22);
...
A zákaz přerušení v přerušení by bylo další téma.
Timer2 SETUP píše:...
TCCR2A = (1 << WGM21); // režim 2, CTC
TCCR2B = bit (CS22)| bit (CS21)| bit (CS20);
OCR2A = 155; // approx 10ms
TIMSK2 = bit (OCIE2A); // interrupt on Compare A Match
...
pulz píše:void pulz(int pulz_uS, byte servo) {
unsigned long out_uS = micros();
digitalWrite(servo, HIGH);
delayMicroseconds(pulz_uS);
digitalWrite(servo, LOW);
}
sob 17.03.2018 21:07
Co jsem napsal bylo míněno jen jako oprava dvou řádků a to tak aby bylo zachováno tvoje nastavení (/64). Nic jsem nepočítal (taky nevím jaký používáš "hodiny") ale hlavně že to chodí! A datasheet je fakt základ.ddano007 píše:Ten Tvoj setup bol brutál rýchly, takže som na rýchlo spravil prienik z môjho a Tvojho setupu a vzniklo toto...
sob 17.03.2018 23:03
sob 17.03.2018 23:45
ned 18.03.2018 0:05
ned 18.03.2018 10:10
ned 18.03.2018 11:18