88#include "qstr.h"
99#include "obj.h"
1010#include "runtime.h"
11+ #include "timer.h"
1112#include "servo.h"
1213
1314// this servo driver uses hardware PWM to drive servos on PA0, PA1, PA2, PA3 = X1, X2, X3, X4
1415// TIM2 and TIM5 have CH1, CH2, CH3, CH4 on PA0-PA3 respectively
1516// they are both 32-bit counters with 16-bit prescaler
16- // we use TIM2
17+ // we use TIM5
1718
1819#define PYB_SERVO_NUM (4)
1920
@@ -30,23 +31,8 @@ STATIC const mp_obj_type_t servo_obj_type;
3031
3132STATIC pyb_servo_obj_t pyb_servo_obj [PYB_SERVO_NUM ];
3233
33- TIM_HandleTypeDef TIM2_Handle ;
34-
3534void servo_init (void ) {
36- // TIM2 clock enable
37- __TIM2_CLK_ENABLE ();
38-
39- // set up and enable interrupt
40- HAL_NVIC_SetPriority (TIM2_IRQn , 6 , 0 );
41- HAL_NVIC_EnableIRQ (TIM2_IRQn );
42-
43- // PWM clock configuration
44- TIM2_Handle .Instance = TIM2 ;
45- TIM2_Handle .Init .Period = 2000 ; // timer cycles at 50Hz
46- TIM2_Handle .Init .Prescaler = ((SystemCoreClock / 2 ) / 100000 ) - 1 ; // timer runs at 100kHz
47- TIM2_Handle .Init .ClockDivision = 0 ;
48- TIM2_Handle .Init .CounterMode = TIM_COUNTERMODE_UP ;
49- HAL_TIM_PWM_Init (& TIM2_Handle );
35+ timer_tim5_init ();
5036
5137 // reset servo objects
5238 for (int i = 0 ; i < PYB_SERVO_NUM ; i ++ ) {
@@ -74,17 +60,17 @@ void servo_timer_irq_callback(void) {
7460 need_it = true;
7561 }
7662 switch (s -> servo_id ) {
77- case 1 : TIM2 -> CCR1 = s -> pulse_cur ; break ;
78- case 2 : TIM2 -> CCR2 = s -> pulse_cur ; break ;
79- case 3 : TIM2 -> CCR3 = s -> pulse_cur ; break ;
80- case 4 : TIM2 -> CCR4 = s -> pulse_cur ; break ;
63+ case 1 : TIM5 -> CCR1 = s -> pulse_cur ; break ;
64+ case 2 : TIM5 -> CCR2 = s -> pulse_cur ; break ;
65+ case 3 : TIM5 -> CCR3 = s -> pulse_cur ; break ;
66+ case 4 : TIM5 -> CCR4 = s -> pulse_cur ; break ;
8167 }
8268 }
8369 }
8470 if (need_it ) {
85- __HAL_TIM_ENABLE_IT (& TIM2_Handle , TIM_IT_UPDATE );
71+ __HAL_TIM_ENABLE_IT (& TIM5_Handle , TIM_IT_UPDATE );
8672 } else {
87- __HAL_TIM_DISABLE_IT (& TIM2_Handle , TIM_IT_UPDATE );
73+ __HAL_TIM_DISABLE_IT (& TIM5_Handle , TIM_IT_UPDATE );
8874 }
8975}
9076
@@ -105,7 +91,7 @@ STATIC void servo_init_channel(pyb_servo_obj_t *s) {
10591 GPIO_InitStructure .Mode = GPIO_MODE_AF_PP ;
10692 GPIO_InitStructure .Speed = GPIO_SPEED_FAST ;
10793 GPIO_InitStructure .Pull = GPIO_NOPULL ;
108- GPIO_InitStructure .Alternate = GPIO_AF1_TIM2 ;
94+ GPIO_InitStructure .Alternate = GPIO_AF2_TIM5 ;
10995 HAL_GPIO_Init (GPIOA , & GPIO_InitStructure );
11096
11197 // PWM mode configuration
@@ -114,10 +100,10 @@ STATIC void servo_init_channel(pyb_servo_obj_t *s) {
114100 oc_init .Pulse = s -> pulse_cur ; // units of 10us
115101 oc_init .OCPolarity = TIM_OCPOLARITY_HIGH ;
116102 oc_init .OCFastMode = TIM_OCFAST_DISABLE ;
117- HAL_TIM_PWM_ConfigChannel (& TIM2_Handle , & oc_init , channel );
103+ HAL_TIM_PWM_ConfigChannel (& TIM5_Handle , & oc_init , channel );
118104
119105 // start PWM
120- HAL_TIM_PWM_Start (& TIM2_Handle , channel );
106+ HAL_TIM_PWM_Start (& TIM5_Handle , channel );
121107}
122108
123109/******************************************************************************/
@@ -129,10 +115,10 @@ STATIC mp_obj_t pyb_servo_set(mp_obj_t port, mp_obj_t value) {
129115 if (v < 50 ) { v = 50 ; }
130116 if (v > 250 ) { v = 250 ; }
131117 switch (p ) {
132- case 1 : TIM2 -> CCR1 = v ; break ;
133- case 2 : TIM2 -> CCR2 = v ; break ;
134- case 3 : TIM2 -> CCR3 = v ; break ;
135- case 4 : TIM2 -> CCR4 = v ; break ;
118+ case 1 : TIM5 -> CCR1 = v ; break ;
119+ case 2 : TIM5 -> CCR2 = v ; break ;
120+ case 3 : TIM5 -> CCR3 = v ; break ;
121+ case 4 : TIM5 -> CCR4 = v ; break ;
136122 }
137123 return mp_const_none ;
138124}
@@ -142,8 +128,8 @@ MP_DEFINE_CONST_FUN_OBJ_2(pyb_servo_set_obj, pyb_servo_set);
142128STATIC mp_obj_t pyb_pwm_set (mp_obj_t period , mp_obj_t pulse ) {
143129 int pe = mp_obj_get_int (period );
144130 int pu = mp_obj_get_int (pulse );
145- TIM2 -> ARR = pe ;
146- TIM2 -> CCR3 = pu ;
131+ TIM5 -> ARR = pe ;
132+ TIM5 -> CCR3 = pu ;
147133 return mp_const_none ;
148134}
149135
0 commit comments