Последний раз редактировалось Mastar; 25.11.2011 в 20:36.
Мои проекты - Катер для рыбалки
Данные из двух массивов?
Мои проекты - Катер для рыбалки
если у тебя mega, то посмотри на эти коды:http://code.google.com/p/ardupilot-m...rammingArduino
Просто, если у тебя заработает, так, как ты делаешь, то скорее всего будет все равно плохо работать, сервы будут трепыхаться.
В тех примерах, см. ссылку, выполняется декодирование суммарного PPM сигнала, у тебя он есть (функция ISR(TIMER4_CAPT_vect) в модуле Timers.pde).
А управление сервами сделано с помощью ШИМ, с использованием 16 разрядных таймеров (функции void Init_PPM_PWM1-4(void), модуль Timers.pde).
Последний раз редактировалось _msd; 26.11.2011 в 00:58.
Мои проекты - Катер для рыбалки
Я не против экспериментов, еще процентов 20-30 осталось у моей Меги до предполагаемого отказа по количеству перепрошивок.
Вот посмотрите на данные полученные по "сериал"
CH0 = пауза, I = между-канальный импульс, CH(1-8) = остальные каналы
А вот скетчьCH0=1022 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=48 CH4=100 I=47 CH5=48 I=47 CH6=100 I=46 CH7=93 I=46 CH8=104 I=46
CH0=1025 I=46 CH1=101 I=47 CH2=98 I=47 CH3=106 I=47 CH4=100 I=47 CH5=48 I=47 CH6=100 I=48 CH7=93 I=48 CH8=104 I=48
CH0=1027 I=47 CH1=101 I=47 CH2=98 I=46 CH3=106 I=46 CH4=100 I=46 CH5=48 I=46 CH6=100 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1029 I=47 CH1=101 I=47 CH2=98 I=48 CH3=106 I=48 CH4=100 I=48 CH5=48 I=47 CH6=100 I=47 CH7=94 I=47 CH8=104 I=46
CH0=1030 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=100 I=46 CH5=48 I=46 CH6=100 I=48 CH7=94 I=47 CH8=104 I=47
CH0=1031 I=48 CH1=101 I=47 CH2=98 I=47 CH3=106 I=47 CH4=100 I=46 CH5=48 I=46 CH6=100 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1032 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=47 CH4=100 I=47 CH5=48 I=47 CH6=100 I=47 CH7=94 I=46 CH8=104 I=47
CH0=1033 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=48 CH7=94 I=48 CH8=104 I=47
CH0=1034 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=46 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=47 CH8=104 I=47
CH0=1034 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=48 CH4=101 I=47 CH5=48 I=47 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1034 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=47 CH4=101 I=47 CH5=48 I=47 CH6=101 I=48 CH7=94 I=48 CH8=104 I=47
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=48 CH3=106 I=48 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=47 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=48 CH7=94 I=47 CH8=104 I=47
CH0=1035 I=48 CH1=101 I=47 CH2=98 I=47 CH3=106 I=47 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=47 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=46 CH8=104 I=47
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=48 CH7=94 I=48 CH8=104 I=48
CH0=1035 I=48 CH1=101 I=47 CH2=98 I=47 CH3=106 I=46 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=47 CH8=104 I=47
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=47 CH3=106 I=48 CH4=101 I=48 CH5=48 I=47 CH6=101 I=47 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=47 CH4=101 I=47 CH5=48 I=47 CH6=101 I=48 CH7=94 I=48 CH8=104 I=47
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=48 CH4=101 I=47 CH5=48 I=47 CH6=101 I=46 CH7=94 I=47 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=48 CH7=94 I=47 CH8=104 I=47
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=46 CH3=106 I=47 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=48 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=47 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=47 CH7=94 I=47 CH8=104 I=48
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=46 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=47 CH8=104 I=47
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=47 CH3=106 I=47 CH4=101 I=48 CH5=48 I=47 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=48 CH7=94 I=48 CH8=104 I=47
CH0=1035 I=48 CH1=101 I=47 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=48 CH4=101 I=47 CH5=48 I=46 CH6=101 I=46 CH7=94 I=47 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=47 CH7=94 I=48 CH8=104 I=47
CH0=1035 I=47 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=48 CH3=106 I=47 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=47 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=48 CH6=101 I=48 CH7=94 I=47 CH8=104 I=48
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=47 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=48 CH2=98 I=48 CH3=106 I=47 CH4=101 I=48 CH5=48 I=47 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=48 CH6=101 I=48 CH7=94 I=48 CH8=104 I=47
CH0=1035 I=48 CH1=101 I=47 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=48 CH2=98 I=48 CH3=106 I=47 CH4=101 I=47 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=48 CH6=101 I=48 CH7=94 I=48 CH8=104 I=47
CH0=1035 I=47 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=47 CH1=101 I=48 CH2=98 I=48 CH3=106 I=48 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=48 CH6=101 I=47 CH7=94 I=47 CH8=104 I=47
CH0=1035 I=47 CH1=101 I=47 CH2=98 I=47 CH3=106 I=46 CH4=101 I=46 CH5=48 I=46 CH6=101 I=46 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=48 CH2=98 I=47 CH3=106 I=47 CH4=101 I=47 CH5=48 I=47 CH6=101 I=47 CH7=94 I=46 CH8=104 I=46
CH0=1035 I=46 CH1=101 I=46 CH2=98 I=46 CH3=106 I=46 CH4=101 I=46 CH5=48 I=48 CH6=101 I=48 CH7=94 I=47 CH8=104 I=47
Я не претендую на уникальность, но тут реально все работает, но не могу добавить обработку ошибочных данных.PHP код:
#include <TimerOne.h>
volatile uint16_t timerCount;
#define BTNPIN 2 //Входной сигнал PPM
int ppmImpuls[9]; // Массив импульсов для паузы и 8 каналов
int chImpuls[9] = {1000, 100, 100, 100, 100, 100, 100, 100, 100}; // Массив средних значений для паузы и 8 каналов
int chanel = 0 ; // Номер канала
int minImpuls = 45 ; // Минимальный импульс (450 us)
int maxImpuls = 155; // Максимальный импульс (1550 us)
int minPausa = 500; // Минимальная пауза (5000 us)
int maxPausa = 1300; // Максимальная пауза (13000 us)
int upImpuls = 50; // Положительный импульс между каналами
void setup()
{
Serial.begin(115200);
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, impDown, RISING);
}
void loop()
{
for (int i=0; i <= 8; i++)
{
chImpuls[i] = (4 * chImpuls[i] + ppmImpuls[i]) / 5 ; // усреднение 3 импульсов
Serial.print("CH"); Serial.print(i); Serial.print("=");
Serial.print(chImpuls[i]); Serial.print(" I=");
Serial.print(upImpuls); Serial.print(" ");
}
Serial.println("");
delay (200);
}
void callback() { timerCount++; } //--------- Счетчик------------
void impUp() //---------- Функция обработки положительного импульса
{
detachInterrupt(0) ;
upImpuls = timerCount ;
timerCount = 0 ;
attachInterrupt(0, impDown, RISING);
}
void impDown() // Функция обработки отрицательного импульса
{
int ppm = timerCount;
detachInterrupt(0);
if( ppm > minPausa ) { chanel=0 ; } else { chanel ++ ; }
ppmImpuls[chanel] = ppm ;
timerCount=0;
attachInterrupt(0, impUp, FALLING);
}
Мои проекты - Катер для рыбалки
Добавлю, в трех каналах CH4, CH5, и CH7 есть момент усреднения по пяти значениям, дальше стабильно.
Нулевой канал и положительные импульсы чистые.
Эти данные соответствуют 0,01 мс.
Значение 48-49 соответствует 480-490 мкс.
Мои проекты - Катер для рыбалки
Использование upImpuls не совсем правильное
Дело в том что эта переменная может несколько раз поменять свое значение пока будет отображаться в мониторе
Последний раз редактировалось Chip; 26.11.2011 в 15:26.
Последний раз редактировалось Mastar; 26.11.2011 в 18:06.
Мои проекты - Катер для рыбалки
Сделал проверку через if и теперь не зависает ни при каких вариантах.
PHP код:
#include <TimerOne.h>
volatile uint16_t timerCount; // переменная счетчика
#define BTNPIN 2 //Входной сигнал PPM на 2 пине
int ppmImpuls[9]; // Массив импульсов для паузы и 8 каналов
int chImpuls[9] = {1000, 100, 100, 100, 100, 100, 100, 100, 100}; // Массив средних значений для паузы и 8 каналов
int chanel = 0 ; // Номер канала
int upImpuls = 50; // Положительный импульс
int Error = 2 ; // Переменная ошибок. 0 - помеха, 1 - длинная пауза, 2 - хороший сигнал
void setup()
{
Serial.begin(115200);
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, impDown, RISING);
}
void loop()
{
for (int i=0; i <= 8; i++)
{
chImpuls[i] = (3 * chImpuls[i] + ppmImpuls[i]) / 4 ; // усреднение 4 импульсов
Serial.print("CH"); Serial.print(i); Serial.print("="); Serial.print(chImpuls[i]);
Serial.print(" I="); Serial.print(upImpuls); Serial.print(" ");
}
Serial.println("");
}
void callback() { timerCount++; } //--------- Счетчик------------
void impUp() //---------- Функция обработки положительного импульса
{
detachInterrupt(0) ;
upImpuls = timerCount ;
if ( upImpuls > 43 && upImpuls < 51) { Error = 2 ; } else { Error = 0 ; delay(50) ; chanel = 0 ; }
timerCount = 0 ;
attachInterrupt(0, impDown, RISING);
}
void impDown() // Функция обработки отрицательного импульса
{
int ppm = timerCount;
detachInterrupt(0);
if( ppm > 400 ) { chanel = 0 ; } else { chanel ++ ; }
ppmImpuls[chanel] = ppm ;
timerCount=0;
attachInterrupt(0, impUp, FALLING);
}
Мои проекты - Катер для рыбалки
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)