23-05-2017, 22:50
Witam wszystkich.
"Zmajstrowałem" sobie moduł oświetlenia samolotu oparty o Arduino Nano. Od strony programowej wszystko działa mi poprawnie, jednak mam problem natury technicznej.
Chodzi konkretnie o odczytywanie PWM.
Całość opiera się na kodzie znalezionym gdzieś w sieci (tutaj kod niekompletny - brak definicji i wywołań):
Bez problemu odczytuję kanały 3 i 9 - do CH3 mam podpięty regulator sterujący silnikiem, a do CH9 mam przypisany przełącznik trójpozycyjny w nadajniku, który włącza/wyłącza światła..
CH6 to kanał przypisany również do przełącznika trójpozycyjnego w nadajniku, ale steruje on klapami w samolocie. Wymyśliłem więc sobie, że w momencie włączenia klap do lądowania, automatycznie mają włączyć mi się światła do lądowania. I tu dochodzimy do sedna sprawy.
Jeśli mam zmontowany cały samolot ( na kanale 6 są wpięte 2 serwomechanizmy), to odczytywana wartość PWM wynosi 0, jeśli wepnę tylko jedno serwo - odczytuję wartość PWM pomniejszoną o jakieś 200-250us od rzeczywistej, a jeśli w ogóle nie podłączę klap (2 serw) to nie ma problemu z odczytem PWM i wszystko działa poprawnie.
Może ktoś z Was wie dlaczego tak się dzieje i jak temu zaradzić ?
"Zmajstrowałem" sobie moduł oświetlenia samolotu oparty o Arduino Nano. Od strony programowej wszystko działa mi poprawnie, jednak mam problem natury technicznej.
Chodzi konkretnie o odczytywanie PWM.
Całość opiera się na kodzie znalezionym gdzieś w sieci (tutaj kod niekompletny - brak definicji i wywołań):
Kod:
uint16_t rc_values[RC_NUM_CHANNELS];
uint32_t rc_start[RC_NUM_CHANNELS];
volatile uint16_t rc_shared[RC_NUM_CHANNELS];
void rc_read_values() {
noInterrupts();
memcpy(rc_values, (const void *)rc_shared, sizeof(rc_shared));
interrupts();
}
void calc_input(uint8_t channel, uint8_t input_pin) {
if (digitalRead(input_pin) == HIGH) {
rc_start[channel] = micros();
} else {
uint16_t rc_compare = (uint16_t)(micros() - rc_start[channel]);
rc_shared[channel] = rc_compare;
}
}
void calc_ch9() { calc_input(RC_CH9, RC_CH9_INPUT); }
void calc_ch6() { calc_input(RC_CH6, RC_CH6_INPUT); }
void calc_ch3() { calc_input(RC_CH3, RC_CH3_INPUT); }
Bez problemu odczytuję kanały 3 i 9 - do CH3 mam podpięty regulator sterujący silnikiem, a do CH9 mam przypisany przełącznik trójpozycyjny w nadajniku, który włącza/wyłącza światła..
CH6 to kanał przypisany również do przełącznika trójpozycyjnego w nadajniku, ale steruje on klapami w samolocie. Wymyśliłem więc sobie, że w momencie włączenia klap do lądowania, automatycznie mają włączyć mi się światła do lądowania. I tu dochodzimy do sedna sprawy.
Jeśli mam zmontowany cały samolot ( na kanale 6 są wpięte 2 serwomechanizmy), to odczytywana wartość PWM wynosi 0, jeśli wepnę tylko jedno serwo - odczytuję wartość PWM pomniejszoną o jakieś 200-250us od rzeczywistej, a jeśli w ogóle nie podłączę klap (2 serw) to nie ma problemu z odczytem PWM i wszystko działa poprawnie.
Może ktoś z Was wie dlaczego tak się dzieje i jak temu zaradzić ?