Paparazzi UAS  v5.12_stable-4-g9b43e9b
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
servos_4015_hw.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006 Antoine Drouin
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22 #include "subsystems/actuators.h"
23 #include "armVIC.h"
24 
25 #include "generated/airframe.h"
26 #include "mcu_periph/sys_time.h"
27 
28 
30 
31 #define PWMMR_SERV0 PWMMR5
32 #define PWMMR_SERV1 PWMMR2
33 #define PWMLER_LATCH_SERV0 PWMLER_LATCH5
34 #define PWMLER_LATCH_SERV1 PWMLER_LATCH2
35 #define PWMMCR_MRI_SERV0 PWMMCR_MR5I
36 #define PWMMCR_MRI_SERV1 PWMMCR_MR2I
37 #define PWMPCR_ENA_SERV0 PWMPCR_ENA5
38 #define PWMPCR_ENA_SERV1 PWMPCR_ENA2
39 #define PWMIR_MRI_SERV0 PWMIR_MR5I
40 #define PWMIR_MRI_SERV1 PWMIR_MR2I
41 
42 #ifndef PWM_VIC_SLOT
43 #define PWM_VIC_SLOT 3
44 #endif
45 
47 {
48  /* PWM selected as IRQ */
50  /* PWM interrupt enabled */
53  /* address of the ISR */
55  /* PW5 pin (P0.21) used for PWM */
56  IO0DIR |= _BV(SERV1_CLOCK_PIN);
57  IO1DIR |= _BV(SERV1_DATA_PIN) | _BV(SERV1_RESET_PIN);
58  SERV1_CLOCK_PINSEL |= SERV1_CLOCK_PINSEL_VAL << SERV1_CLOCK_PINSEL_BIT;
59 
60  /* set match5 to go of a long time from now */
61  PWMMR0 = 0XFFFFFF;
62  PWMMR_SERV1 = 0XFFF;
63  /* commit above change */
65  /* interrupt on PWMMR5 match */
67  /* enable PWM5 ouptput */
69 
70  /* Prescaler */
71  PWMPR = PWM_PRESCALER - 1;
72 
73  /* enable PWM timer counter and PWM mode */
75  /* Load failsafe values */
76  /* Set all servos at their midpoints */
77  /* compulsory for unaffected servos */
78  uint8_t i;
79  for (i = 0 ; i < _4015_NB_CHANNELS ; i++) {
81  }
82 #ifdef SERVO_MOTOR
83  servos_values[SERVO_MOTOR] = SERVOS_TICS_OF_USEC(SERVO_MOTOR_NEUTRAL);
84 #endif
85 #ifdef SERVO_MOTOR_LEFT
86  servos_values[SERVO_MOTOR_LEFT] = SERVOS_TICS_OF_USEC(SERVO_MOTOR_LEFT_NEUTRAL);
87 #endif
88 #ifdef SERVO_MOTOR_RIGHT
89  servos_values[SERVO_RIGHT_MOTOR] = SERVOS_TICS_OF_USEC(SERVO_MOTOR_RIGHT_NEUTRAL);
90 #endif
91 #ifdef SERVO_HATCH
92  servos_values[SERVO_HATCH] = SERVOS_TICS_OF_USEC(SERVO_HATCH_NEUTRAL);
93 #endif
94 }
95 
96 
97 
98 #define SERVO_REFRESH_TICS SERVOS_TICS_OF_USEC(25000)
99 
100 
101 static uint8_t servos_idx = 0;
103 
104 void PWM_ISR(void)
105 {
106  ISR_ENTRY();
107  // LED_TOGGLE(2);
108  if (servos_idx == 0) {
109  IO1CLR = _BV(SERV1_RESET_PIN);
110  IO1SET = _BV(SERV1_DATA_PIN);
114  servos_idx++;
115  } else if (servos_idx < _4015_NB_CHANNELS) {
116  IO1CLR = _BV(SERV1_DATA_PIN);
120  servos_idx++;
121  } else {
122  IO1SET = _BV(SERV1_RESET_PIN);
125  servos_idx = 0;
126  }
127  /* clear the interrupt */
129  VICVectAddr = 0x00000000;
130  ISR_EXIT();
131 }
#define VICIntSelect
Definition: LPC21xx.h:430
unsigned short uint16_t
Definition: types.h:16
#define IO1SET
Definition: LPC21xx.h:338
#define PWMPCR_ENA_SERV1
#define SERVOS_TICS_OF_USEC(s)
#define PWMIR
Definition: LPC21xx.h:94
#define PWMMCR_MRI_SERV1
#define PWMMR0
Definition: LPC21xx.h:100
#define _VIC_CNTL(idx)
Definition: armVIC.h:19
#define PWMTCR
Definition: LPC21xx.h:95
#define PWMPCR
Definition: LPC21xx.h:107
#define VIC_PWM
Definition: lpcVIC.h:76
#define _VIC_ADDR(idx)
Definition: armVIC.h:20
#define PWMMR_SERV1
#define PWMTCR_COUNTER_ENABLE
Definition: lpcTMR.h:83
#define _4015_NB_CHANNELS
Hardware independent API for actuators (servos, motor controllers).
#define PWMMCR
Definition: LPC21xx.h:99
Architecture independent timing functions.
#define PWMLER
Definition: LPC21xx.h:108
static uint8_t servos_idx
#define VICVectAddr
Definition: LPC21xx.h:436
unsigned long uint32_t
Definition: types.h:18
#define PWMMCR_MR0R
Definition: lpcTMR.h:89
#define VIC_BIT(chan)
Definition: lpcVIC.h:105
void actuators_4015_init(void)
#define IO0DIR
Definition: LPC21xx.h:335
#define PWMPR
Definition: LPC21xx.h:97
#define PWM_VIC_SLOT
static uint32_t servos_delay
#define PWMIR_MRI_SERV1
#define PWMTCR_PWM_ENABLE
Definition: lpcTMR.h:85
#define SERVO_REFRESH_TICS
unsigned char uint8_t
Definition: types.h:14
#define PWMLER_LATCH0
Definition: lpcTMR.h:124
#define ISR_EXIT()
Definition: armVIC.h:61
void PWM_ISR(void)
#define VICIntEnable
Definition: LPC21xx.h:431
#define PWMLER_LATCH_SERV1
uint16_t servos_values[_4015_NB_CHANNELS]
#define IO1CLR
Definition: LPC21xx.h:340
#define ISR_ENTRY()
Definition: armVIC.h:40
#define VIC_ENABLE
Definition: lpcVIC.h:102
#define IO1DIR
Definition: LPC21xx.h:339