Skip to content

Commit 5d5cca9

Browse files
committed
angle conversion works
1 parent a3bfd24 commit 5d5cca9

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

examples/simple.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ int main()
1111

1212
while (1)
1313
{
14-
servo_move_to(2, 250);
14+
servo_move_to(2, 0);
1515
sleep_ms(1000);
16-
servo_move_to(2, 1250);
16+
servo_move_to(2, 180);
1717
sleep_ms(1000);
1818
}
1919
return 0;

src/pico_servo.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99

1010

1111
#define WRAP 10000
12-
#define CLKDIV 250
12+
#define FREQ 50
1313

14-
#define _WRAP_HANDLER(x) pwm##x##_cb
15-
#define WRAP_HANDLER(x) _WRAP_HANDLER(x)
14+
float clkdiv;
15+
uint min;
16+
uint max;
1617

1718
static uint slice_map[30];
1819
static uint slice_active[8];
@@ -95,6 +96,10 @@ int servo_init()
9596
pwm_cb[5] = pwm5_cb;
9697
pwm_cb[6] = pwm6_cb;
9798
pwm_cb[7] = pwm7_cb;
99+
100+
clkdiv = (float)frequency_count_khz(CLOCKS_FC0_SRC_VALUE_PLL_SYS_CLKSRC_PRIMARY) * 1000.f / (FREQ * WRAP);
101+
min = 0.025f * WRAP;
102+
max = 0.125f * WRAP;
98103
}
99104

100105
int servo_attach(uint pin)
@@ -117,7 +122,7 @@ int servo_attach(uint pin)
117122

118123
pwm_config cfg = pwm_get_default_config();
119124
pwm_config_set_wrap(&cfg, WRAP);
120-
pwm_config_set_clkdiv(&cfg, CLKDIV);
125+
pwm_config_set_clkdiv(&cfg, clkdiv);
121126
pwm_init(slice, &cfg, true);
122127
}
123128

@@ -128,8 +133,9 @@ int servo_attach(uint pin)
128133

129134
int servo_move_to(uint pin, uint angle)
130135
{
136+
uint val = (float)angle / 180.f * (max - min) + min;
131137
uint pos = slice_map[pin] + (pin % 2);
132-
servo_pos[16 * servo_pos_buf[pos] + pos] = angle;
138+
servo_pos[16 * servo_pos_buf[pos] + pos] = val;
133139
servo_pos_buf[pos] = (servo_pos_buf[pos] + 1) % 2;
134140
return 0;
135141
}

0 commit comments

Comments
 (0)