1
1
/*
2
- Copyright (c) 2015 Arduino LLC. All right reserved.
2
+ Copyright (c) 2017 Arduino LLC. All right reserved.
3
3
4
4
This library is free software; you can redistribute it and/or
5
5
modify it under the terms of the GNU Lesser General Public
16
16
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
*/
18
18
19
- // #if defined(ARDUINO_ARCH_SAMD )
19
+ #if defined(ARDUINO_ARCH_STM32 )
20
20
21
21
#include < Arduino.h>
22
22
#include < Servo.h>
23
23
24
- #define usToTicks (_us ) (_us * 2 ) // converts microseconds to tick
25
- #define ticksToUs (_ticks ) (_ticks / 2 ) // converts from ticks back to microseconds
26
-
27
- #define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
28
-
29
24
static servo_t servos[MAX_SERVOS]; // static array of servo structures
30
25
static volatile int8_t timerChannel[_Nbr_16timers ]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
31
26
32
27
uint8_t ServoCount = 0 ; // the total number of attached servos
28
+ stimer_t _timer;
33
29
34
30
// convenience macros
35
31
#define SERVO_INDEX_TO_TIMER (_servo_nbr ) ((timer16_Sequence_t)(_servo_nbr / SERVOS_PER_TIMER)) // returns the timer controlling this servo
@@ -69,8 +65,8 @@ static void ServoIrqHandle(stimer_t *obj, uint32_t channel)
69
65
}
70
66
else {
71
67
// finished all channels so wait for the refresh period to expire before starting over
72
- if ( getTimerCounter (obj) + 4 < usToTicks ( REFRESH_INTERVAL) ) { // allow a few ticks to ensure the next OCR1A not missed
73
- setCCRRegister (obj, channel, (unsigned int )usToTicks ( REFRESH_INTERVAL) );
68
+ if ( getTimerCounter (obj) + 4 < REFRESH_INTERVAL ) { // allow a few ticks to ensure the next OCR1A not missed
69
+ setCCRRegister (obj, channel, (unsigned int )REFRESH_INTERVAL);
74
70
} else {
75
71
setCCRRegister (obj, channel, getTimerCounter (obj) + 4 ); // at least REFRESH_INTERVAL has elapsed
76
72
}
@@ -80,6 +76,11 @@ static void ServoIrqHandle(stimer_t *obj, uint32_t channel)
80
76
81
77
static void initISR (stimer_t *obj)
82
78
{
79
+ /*
80
+ * Timer clock set by default at 1us.
81
+ * Period set to REFRESH_INTERVAL*3
82
+ * Default pulse width set to DEFAULT_PULSE_WIDTH
83
+ */
83
84
TimerPulseInit (obj, REFRESH_INTERVAL*3 , DEFAULT_PULSE_WIDTH, ServoIrqHandle);
84
85
}
85
86
@@ -104,7 +105,7 @@ Servo::Servo()
104
105
{
105
106
if (ServoCount < MAX_SERVOS) {
106
107
this ->servoIndex = ServoCount++; // assign a servo index to this instance
107
- servos[this ->servoIndex ].ticks = usToTicks ( DEFAULT_PULSE_WIDTH) ; // store default values
108
+ servos[this ->servoIndex ].ticks = DEFAULT_PULSE_WIDTH; // store default values
108
109
} else {
109
110
this ->servoIndex = INVALID_SERVO; // too many servos
110
111
}
@@ -173,8 +174,6 @@ void Servo::writeMicroseconds(int value)
173
174
else if (value > SERVO_MAX ())
174
175
value = SERVO_MAX ();
175
176
176
- value = value - TRIM_DURATION;
177
- value = usToTicks (value); // convert to ticks after compensating for interrupt overhead
178
177
servos[channel].ticks = value;
179
178
}
180
179
}
@@ -188,7 +187,7 @@ int Servo::readMicroseconds()
188
187
{
189
188
unsigned int pulsewidth;
190
189
if (this ->servoIndex != INVALID_SERVO)
191
- pulsewidth = ticksToUs ( servos[this ->servoIndex ].ticks ) + TRIM_DURATION ;
190
+ pulsewidth = servos[this ->servoIndex ].ticks ;
192
191
else
193
192
pulsewidth = 0 ;
194
193
@@ -199,3 +198,5 @@ bool Servo::attached()
199
198
{
200
199
return servos[this ->servoIndex ].Pin .isActive ;
201
200
}
201
+
202
+ #endif // ARDUINO_ARCH_STM32
0 commit comments