diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 634da234b..e348f91d3 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -138,6 +138,7 @@ SRC += $(PIOSSTM32F10X)/pios_adc.c SRC += $(PIOSSTM32F10X)/pios_servo.c SRC += $(PIOSSTM32F10X)/pios_i2c.c SRC += $(PIOSSTM32F10X)/pios_spi.c +SRC += $(PIOSSTM32F10X)/pios_ppm.c SRC += $(PIOSSTM32F10X)/pios_pwm.c SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c diff --git a/flight/OpenPilot/System/inc/pios_board.h b/flight/OpenPilot/System/inc/pios_board.h index b7c1bd1b1..a5863cca0 100644 --- a/flight/OpenPilot/System/inc/pios_board.h +++ b/flight/OpenPilot/System/inc/pios_board.h @@ -290,7 +290,7 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8 #define PIOS_PPM_TIM TIM1 #define PIOS_PPM_TIM_IRQ TIM1_CC_IRQn #define PIOS_PPM_NUM_INPUTS 8 //Could be more if needed -#define PIOS_PPM_SUPV_ENABLED 0 +#define PIOS_PPM_SUPV_ENABLED 1 #define PIOS_PPM_SUPV_TIMER TIM6 #define PIOS_PPM_SUPV_TIMER_RCC_FUNC RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE) #define PIOS_PPM_SUPV_HZ 25 @@ -378,8 +378,8 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8 #define PIOS_ADC_SAMPLE_TIME ADC_SampleTime_239Cycles5 /* Sample time: */ /* With an ADCCLK = 14 MHz and a sampling time of 293.5 cycles: */ - /* Tconv = 239.5 + 12.5 = 252 cycles = 18µs */ - /* (1 / (ADCCLK / CYCLES)) = Sample Time (µS) */ + /* Tconv = 239.5 + 12.5 = 252 cycles = 18�s */ + /* (1 / (ADCCLK / CYCLES)) = Sample Time (�S) */ #define PIOS_ADC_IRQ_PRIO PIOS_IRQ_PRIO_HIGH //------------------------- diff --git a/flight/OpenPilot/System/openpilot.c b/flight/OpenPilot/System/openpilot.c index 879fe0c6b..43f488087 100644 --- a/flight/OpenPilot/System/openpilot.c +++ b/flight/OpenPilot/System/openpilot.c @@ -96,6 +96,8 @@ int main() PIOS_GPIO_Init(); + //PIOS_PPM_Init(); + PIOS_PWM_Init(); PIOS_USB_Init(0); @@ -171,6 +173,7 @@ static void TaskTesting(void *pvParameters) */ PIOS_COM_SendFormattedStringNonBlocking(COM_DEBUG_USART, "%u,%u,%u,%u,%u,%u,%u,%u uS\r", PIOS_PWM_Get(0), PIOS_PWM_Get(1), PIOS_PWM_Get(2), PIOS_PWM_Get(3), PIOS_PWM_Get(4), PIOS_PWM_Get(5), PIOS_PWM_Get(6), PIOS_PWM_Get(7)); + //PIOS_COM_SendFormattedStringNonBlocking(COM_DEBUG_USART, "%u,%u,%u,%u,%u,%u,%u,%u uS\r", PIOS_PPM_Get(0), PIOS_PPM_Get(1), PIOS_PPM_Get(2), PIOS_PPM_Get(3), PIOS_PPM_Get(4), PIOS_PPM_Get(5), PIOS_PPM_Get(6), PIOS_PPM_Get(7)); /* This blocks the task until there is something on the buffer */ /*xSemaphoreTake(PIOS_USART1_Buffer, portMAX_DELAY); diff --git a/flight/PiOS/STM32F10x/pios_ppm.c b/flight/PiOS/STM32F10x/pios_ppm.c index 8de74b339..ee3b7faf0 100644 --- a/flight/PiOS/STM32F10x/pios_ppm.c +++ b/flight/PiOS/STM32F10x/pios_ppm.c @@ -35,9 +35,9 @@ static TIM_ICInitTypeDef TIM_ICInitStructure; static uint8_t PulseIndex; -static uint8_t CaptureState; -static uint16_t RiseValue; -static uint16_t FallValue; +static uint32_t PreviousValue; +static uint32_t CurrentValue; +static uint32_t CapturedValue; static uint32_t CaptureValue[PIOS_PPM_NUM_INPUTS]; static uint8_t SupervisorState = 0; @@ -54,9 +54,9 @@ void PIOS_PPM_Init(void) int32_t i; PulseIndex = 0; - CaptureState = 0; - RiseValue = 0; - FallValue = 0; + PreviousValue = 0; + CurrentValue = 0; + CapturedValue = 0; for(i = 0; i < PIOS_PPM_NUM_INPUTS; i++) { CaptureValue[i] = 0; @@ -172,47 +172,31 @@ int32_t PIOS_PPM_Get(int8_t Channel) void TIM1_CC_IRQHandler(void) { /* Do this as it's more efficient */ - if(TIM_GetITStatus(PIOS_PWM_CH1_TIM_PORT, RECEIVER1_CCR) == SET) { - if(CaptureState == 0) { - RiseValue = TIM_GetCapture2(PIOS_PWM_CH1_TIM_PORT); - } else { - FallValue = TIM_GetCapture2(PIOS_PWM_CH1_TIM_PORT); - } + if(TIM_GetITStatus(PIOS_PPM_TIM_PORT, PIOS_PPM_TIM_CCR) == SET) { + PreviousValue = CurrentValue; + CurrentValue = TIM_GetCapture2(PIOS_PPM_TIM_PORT); } /* Clear TIM3 Capture compare interrupt pending bit */ - TIM_ClearITPendingBit(PIOS_PWM_CH1_TIM_PORT, RECEIVER1_CCR); - - /* Simple rise or fall state machine */ - if(CaptureState == 0) { - /* Switch states */ - CaptureState = 1; - - /* Switch polarity of input capture */ - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; - TIM_ICInitStructure.TIM_Channel = RECEIVER1_CH; - TIM_ICInit(PIOS_PWM_CH1_TIM_PORT, &TIM_ICInitStructure); + TIM_ClearITPendingBit(PIOS_PPM_TIM_PORT, PIOS_PPM_TIM_CCR); + /* Capture computation */ + if (CurrentValue > PreviousValue) { + CapturedValue = (CurrentValue - PreviousValue); } else { - /* Capture computation */ - if (FallValue > RiseValue) { - //need to change - CaptureValue[0] = (FallValue - RiseValue); - } else { - //need to change - CaptureValue[0] = ((0xFFFF - RiseValue) + FallValue); + CapturedValue = ((0xFFFF - PreviousValue) + CurrentValue); + } + + /* sync pulse */ + if(CapturedValue > 8000) { + PulseIndex = 0; + /* trying to detect bad pulses, not sure this is working correctly yet. I need a scope :P */ + } else if(CapturedValue > 750 && CapturedValue < 2500) { + if(PulseIndex < PIOS_PPM_NUM_INPUTS) { + CaptureValue[PulseIndex] = CapturedValue; + CapCounter[PulseIndex]++; + PulseIndex++; } - - /* Switch states */ - CaptureState = 0; - - /* Increase supervisor counter */ - CapCounter[0]++; - - /* Switch polarity of input capture */ - TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; - TIM_ICInitStructure.TIM_Channel = RECEIVER1_CH; - TIM_ICInit(PIOS_PWM_CH1_TIM_PORT, &TIM_ICInitStructure); } } diff --git a/flight/PiOS/inc/pios_ppm.h b/flight/PiOS/inc/pios_ppm.h new file mode 100644 index 000000000..ccfe128fc --- /dev/null +++ b/flight/PiOS/inc/pios_ppm.h @@ -0,0 +1,33 @@ +/** + ****************************************************************************** + * + * @file pios_ppm.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief PWM Input functions header. + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PIOS_PPM_H +#define PIOS_PPM_H + +/* Public Functions */ +extern void PIOS_PPM_Init(void); +extern int32_t PIOS_PPM_Get(int8_t Channel); + +#endif /* PIOS_PPM_H */ diff --git a/flight/PiOS/pios.h b/flight/PiOS/pios.h index 74fcc1477..7134ad479 100644 --- a/flight/PiOS/pios.h +++ b/flight/PiOS/pios.h @@ -73,6 +73,7 @@ #include #include #include +#include #include #include #include