File tree Expand file tree Collapse file tree 2 files changed +13
-7
lines changed Expand file tree Collapse file tree 2 files changed +13
-7
lines changed Original file line number Diff line number Diff line change @@ -11,9 +11,9 @@ int main()
11
11
12
12
while (1 )
13
13
{
14
- servo_move_to (2 , 250 );
14
+ servo_move_to (2 , 0 );
15
15
sleep_ms (1000 );
16
- servo_move_to (2 , 1250 );
16
+ servo_move_to (2 , 180 );
17
17
sleep_ms (1000 );
18
18
}
19
19
return 0 ;
Original file line number Diff line number Diff line change 9
9
10
10
11
11
#define WRAP 10000
12
- #define CLKDIV 250
12
+ #define FREQ 50
13
13
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 ;
16
17
17
18
static uint slice_map [30 ];
18
19
static uint slice_active [8 ];
@@ -95,6 +96,10 @@ int servo_init()
95
96
pwm_cb [5 ] = pwm5_cb ;
96
97
pwm_cb [6 ] = pwm6_cb ;
97
98
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 ;
98
103
}
99
104
100
105
int servo_attach (uint pin )
@@ -117,7 +122,7 @@ int servo_attach(uint pin)
117
122
118
123
pwm_config cfg = pwm_get_default_config ();
119
124
pwm_config_set_wrap (& cfg , WRAP );
120
- pwm_config_set_clkdiv (& cfg , CLKDIV );
125
+ pwm_config_set_clkdiv (& cfg , clkdiv );
121
126
pwm_init (slice , & cfg , true);
122
127
}
123
128
@@ -128,8 +133,9 @@ int servo_attach(uint pin)
128
133
129
134
int servo_move_to (uint pin , uint angle )
130
135
{
136
+ uint val = (float )angle / 180.f * (max - min ) + min ;
131
137
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 ;
133
139
servo_pos_buf [pos ] = (servo_pos_buf [pos ] + 1 ) % 2 ;
134
140
return 0 ;
135
141
}
You can’t perform that action at this time.
0 commit comments