@@ -60,6 +60,7 @@ typedef struct
60
60
{
61
61
uint32_t period_us ;
62
62
uint32_t duty_us ;
63
+ float duty ;
63
64
} pwm_signal_t ;
64
65
65
66
typedef struct
@@ -98,12 +99,14 @@ void pwmout_init(pwmout_t *obj, PinName pin)
98
99
obj -> pwm_channel = i ;
99
100
100
101
m_pwm [i ].p_pwm_driver = & m_pwm_driver [i ];
101
- m_pwm [i ].signal .period_us = 200000 ; // 0.02 s
102
- m_pwm [i ].signal .duty_us = 100000 ;
102
+ m_pwm [i ].signal .period_us = 100000 ; // 0.02 s
103
+ m_pwm [i ].signal .duty_us = 50000 ;
104
+ m_pwm [i ].signal .duty = (0.5 );
103
105
104
106
obj -> pwm_struct = & m_pwm [i ];
105
107
106
108
internal_pwmout_exe (obj );
109
+
107
110
break ;
108
111
}
109
112
}
@@ -133,6 +136,8 @@ void pwmout_write(pwmout_t *obj, float percent)
133
136
134
137
pwm_signal_t * p_pwm_signal = & (((pwm_t * )obj -> pwm_struct )-> signal );
135
138
139
+ p_pwm_signal -> duty = percent / 100 ;
140
+
136
141
int us = (((int )p_pwm_signal -> period_us ) * percent ) / 100 ;
137
142
138
143
pwmout_pulsewidth_us (obj , us );
@@ -164,6 +169,8 @@ void pwmout_period_us(pwmout_t *obj, int us)
164
169
{
165
170
pwm_signal_t * p_pwm_signal = & (((pwm_t * )obj -> pwm_struct )-> signal );
166
171
172
+ p_pwm_signal -> duty_us = (int )((float )us * p_pwm_signal -> duty );
173
+
167
174
p_pwm_signal -> period_us = us ;
168
175
169
176
internal_pwmout_exe (obj );
@@ -207,7 +214,7 @@ static ret_code_t pulsewidth_us_set_get(int period_us, int duty_us, pulsewidth_s
207
214
208
215
for (div = 1 ; div <= 128 ; div <<= 1 )
209
216
{
210
- if (0xFFFF >= period_us )
217
+ if (0x7FFF >= period_us )
211
218
{
212
219
p_settings -> period = period_us ; // unit [us * div]
213
220
p_settings -> duty = duty_us ; // unit [us * div]
@@ -224,7 +231,7 @@ static ret_code_t pulsewidth_us_set_get(int period_us, int duty_us, pulsewidth_s
224
231
return NRF_ERROR_INVALID_PARAM ;
225
232
}
226
233
227
- static nrf_pwm_values_common_t seq_values [1 ];
234
+ static volatile nrf_pwm_values_common_t seq_values [1 ];
228
235
229
236
static nrf_pwm_sequence_t const seq =
230
237
{
@@ -243,8 +250,8 @@ static void internal_pwmout_exe(pwmout_t *obj)
243
250
244
251
p_pwm_signal = & (((pwm_t * )obj -> pwm_struct )-> signal );
245
252
246
- if (NRF_SUCCESS == pulsewidth_us_set_get (p_pwm_signal -> period_us ,
247
- p_pwm_signal -> duty_us ,
253
+ if (NRF_SUCCESS == pulsewidth_us_set_get (p_pwm_signal -> period_us * 16 ,
254
+ p_pwm_signal -> duty_us * 16 ,
248
255
& pulsewidth_set ))
249
256
{
250
257
//@todo apply pulsewidth_set
@@ -278,7 +285,7 @@ static void internal_pwmout_exe(pwmout_t *obj)
278
285
279
286
seq_values [0 ] = pulsewidth_set .duty ;
280
287
281
- nrf_drv_pwm_simple_playback (p_pwm_driver , & seq , 3 , NRF_DRV_PWM_FLAG_LOOP );
288
+ nrf_drv_pwm_simple_playback (p_pwm_driver , & seq , 0 , NRF_DRV_PWM_FLAG_LOOP );
282
289
283
290
284
291
}
0 commit comments