Paparazzi UAS  v5.2.2_stable-0-gd6b9f29
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures 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 
46 void actuators_4015_init ( void ) {
47  /* PWM selected as IRQ */
49  /* PWM interrupt enabled */
52  /* address of the ISR */
54  /* PW5 pin (P0.21) used for PWM */
55  IO0DIR |= _BV(SERV1_CLOCK_PIN);
56  IO1DIR |= _BV(SERV1_DATA_PIN) | _BV(SERV1_RESET_PIN);
57  SERV1_CLOCK_PINSEL |= SERV1_CLOCK_PINSEL_VAL << SERV1_CLOCK_PINSEL_BIT;
58 
59  /* set match5 to go of a long time from now */
60  PWMMR0 = 0XFFFFFF;
61  PWMMR_SERV1 = 0XFFF;
62  /* commit above change */
64  /* interrupt on PWMMR5 match */
66  /* enable PWM5 ouptput */
68 
69  /* Prescaler */
70  PWMPR = PWM_PRESCALER-1;
71 
72  /* enable PWM timer counter and PWM mode */
74  /* Load failsafe values */
75  /* Set all servos at their midpoints */
76  /* compulsory for unaffected servos */
77  uint8_t i;
78  for( i=0 ; i < _4015_NB_CHANNELS ; i++ )
80 #ifdef SERVO_MOTOR
81  servos_values[SERVO_MOTOR] = SERVOS_TICS_OF_USEC(SERVO_MOTOR_NEUTRAL);
82 #endif
83 #ifdef SERVO_MOTOR_LEFT
84  servos_values[SERVO_MOTOR_LEFT] = SERVOS_TICS_OF_USEC(SERVO_MOTOR_LEFT_NEUTRAL);
85 #endif
86 #ifdef SERVO_MOTOR_RIGHT
87  servos_values[SERVO_RIGHT_MOTOR] = SERVOS_TICS_OF_USEC(SERVO_MOTOR_RIGHT_NEUTRAL);
88 #endif
89 #ifdef SERVO_HATCH
90  servos_values[SERVO_HATCH] = SERVOS_TICS_OF_USEC(SERVO_HATCH_NEUTRAL);
91 #endif
92 }
93 
94 
95 
96 #define SERVO_REFRESH_TICS SERVOS_TICS_OF_USEC(25000)
97 
98 
99 static uint8_t servos_idx = 0;
101 
102 void PWM_ISR ( void ) {
103  ISR_ENTRY();
104  // LED_TOGGLE(2);
105  if (servos_idx == 0) {
106  IO1CLR = _BV(SERV1_RESET_PIN);
107  IO1SET = _BV(SERV1_DATA_PIN);
111  servos_idx++;
112  }
113  else if (servos_idx < _4015_NB_CHANNELS) {
114  IO1CLR = _BV(SERV1_DATA_PIN);
118  servos_idx++;
119  }
120  else {
121  IO1SET = _BV(SERV1_RESET_PIN);
124  servos_idx = 0;
125  }
126  /* clear the interrupt */
128  VICVectAddr = 0x00000000;
129  ISR_EXIT();
130 }
#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
#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
Hardware independent API for actuators (servos, motor controllers).
#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