@@ -44,19 +44,21 @@ Servo::Servo()
44
44
uint8_t Servo::attach (int pin)
45
45
{
46
46
47
- return this ->attach (pin, 0 , 2500 );
47
+ return this ->attach (pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH );
48
48
}
49
49
50
50
51
51
uint8_t Servo::attach (int pin, int min, int max)
52
52
{
53
- int servo_min, servo_max;
54
53
if (this ->servoIndex < MAX_SERVOS) {
55
54
pinMode (pin, OUTPUT); // set servo pin to output
56
55
servos[this ->servoIndex ].Pin .nbr = pin;
57
56
58
- if (min < servo_min) min = servo_min;
59
- if (max > servo_max) max = servo_max;
57
+ if (min < MIN_PULSE_WIDTH) min = MIN_PULSE_WIDTH;
58
+ if (max > MAX_PULSE_WIDTH) max = MAX_PULSE_WIDTH;
59
+ // fix min if conversion to pulse cycle value is too low
60
+ if ((min/DUTY_CYCLE_RESOLUTION)*DUTY_CYCLE_RESOLUTION<min) min+=DUTY_CYCLE_RESOLUTION;
61
+
60
62
this ->min = min;
61
63
this ->max = max;
62
64
@@ -67,9 +69,8 @@ uint8_t Servo::attach(int pin, int min, int max)
67
69
{
68
70
if ( HwPWMx[i]->addPin (pin) )
69
71
{
70
- // 20ms - 50Hz
71
- HwPWMx[i]->setMaxValue (2500 );
72
- HwPWMx[i]->setClockDiv (PWM_PRESCALER_PRESCALER_DIV_128);
72
+ HwPWMx[i]->setMaxValue (MAXVALUE);
73
+ HwPWMx[i]->setClockDiv (CLOCKDIV);
73
74
74
75
break ;
75
76
}
@@ -93,7 +94,7 @@ void Servo::write(int value)
93
94
value = 0 ;
94
95
else if (value > 180 )
95
96
value = 180 ;
96
- value = map (value, 0 , 180 , MIN_PULSE, MAX_PULSE );
97
+ value = map (value, 0 , 180 , this -> min , this -> max );
97
98
98
99
writeMicroseconds (value);
99
100
}
@@ -127,17 +128,17 @@ void Servo::writeMicroseconds(int value)
127
128
nrf_pwm_task_trigger(PWMInstance, NRF_PWM_TASK_SEQSTART0);
128
129
#else
129
130
uint8_t pin = servos[this ->servoIndex ].Pin .nbr ;
130
-
131
+
131
132
for (int i=0 ; i<HWPWM_MODULE_NUM; i++)
132
133
{
133
- if ( HwPWMx[i]->writePin (pin, value) ) break ;
134
+ if ( HwPWMx[i]->writePin (pin, value/DUTY_CYCLE_RESOLUTION ) ) break ;
134
135
}
135
136
#endif
136
137
}
137
138
138
139
int Servo::read () // return the value as degrees
139
140
{
140
- return map (readMicroseconds (), MIN_PULSE, MAX_PULSE , 0 , 180 );
141
+ return map (readMicroseconds (), this -> min , this -> max , 0 , 180 );
141
142
}
142
143
143
144
int Servo::readMicroseconds ()
@@ -156,7 +157,7 @@ int Servo::readMicroseconds()
156
157
{
157
158
if ( HwPWMx[i]->checkPin (pin) )
158
159
{
159
- return HwPWMx[i]->readPin (pin);
160
+ return HwPWMx[i]->readPin (pin)*DUTY_CYCLE_RESOLUTION ;
160
161
}
161
162
}
162
163
0 commit comments