Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 41 по 50 из 54
  1. #41
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Цитата Сообщение от Chip Посмотреть сообщение
    Может странные значения от того что куда нибудь не туда вставляешь serialprint ?
    Я сейчас на работе, но помню, стоит в основном цикле. Данные для печати выбираю тоже в основном цикле через for (int t=0; t <= 255; t++)
    Последний раз редактировалось Mastar; 25.11.2011 в 20:36.
    Мои проекты - Катер для рыбалки

  2. #42
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: PPM энкодер на ...дуино

    Данные из двух массивов?

  3. #43
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Цитата Сообщение от Chip Посмотреть сообщение
    Данные из двух массивов?
    Да оба массива.
    Мои проекты - Катер для рыбалки

  4. #44
    Пользователь
    Регистрация
    07.10.2011
    Сообщений
    23
    Вес репутации
    190

    По умолчанию Re: PPM энкодер на ...дуино

    если у тебя 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.

  5. #45
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Цитата Сообщение от _msd Посмотреть сообщение
    если у тебя 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).
    Спасибо, посмотрю.

    Мне интересно другое, почему забраковали скетчь из 9 поста, там все идеально читается, но я не могу побороть зависания при пропадании сигнала. Я уверен, что допустил ошибку где-то или просто мало понимаю в программировании.
    Мои проекты - Катер для рыбалки

  6. #46
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Я не против экспериментов, еще процентов 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);    
    } 
    Я не претендую на уникальность, но тут реально все работает, но не могу добавить обработку ошибочных данных.
    Мои проекты - Катер для рыбалки

  7. #47
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Добавлю, в трех каналах CH4, CH5, и CH7 есть момент усреднения по пяти значениям, дальше стабильно.
    Нулевой канал и положительные импульсы чистые.
    Эти данные соответствуют 0,01 мс.
    Значение 48-49 соответствует 480-490 мкс.
    Мои проекты - Катер для рыбалки

  8. #48
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: PPM энкодер на ...дуино

    Использование upImpuls не совсем правильное
    Дело в том что эта переменная может несколько раз поменять свое значение пока будет отображаться в мониторе
    Последний раз редактировалось Chip; 26.11.2011 в 15:26.

  9. #49
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Цитата Сообщение от Chip Посмотреть сообщение
    Использование upImpuls не совсем правильное
    Дело в том что эта переменная может несколько раз поменять свое значение пока будет отображаться в мониторе
    Это она сейчас отображается, а вообще она мне и ненужна, только для контроля верного сигнала.

    Может есть короткая(по времени) функция сравнения (44 < upImpuls < 50) ?
    Или кроме if ( upImpuls > 44 && upImpuls < 51) вариантов нет?
    Последний раз редактировалось Mastar; 26.11.2011 в 18:06.
    Мои проекты - Катер для рыбалки

  10. #50
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    62
    Сообщений
    241
    Вес репутации
    244

    По умолчанию Re: PPM энкодер на ...дуино

    Сделал проверку через 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);    
    } 
    Мои проекты - Катер для рыбалки

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 6 (пользователей: 0 , гостей: 6)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •