Skip to content

Commit 7798651

Browse files
committed
nRF52 PwmOut implementation debug
1 parent 07ce12f commit 7798651

File tree

1 file changed

+14
-7
lines changed
  • hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832

1 file changed

+14
-7
lines changed

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/pwmout_api.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ typedef struct
6060
{
6161
uint32_t period_us;
6262
uint32_t duty_us;
63+
float duty;
6364
} pwm_signal_t;
6465

6566
typedef struct
@@ -98,12 +99,14 @@ void pwmout_init(pwmout_t *obj, PinName pin)
9899
obj->pwm_channel = i;
99100

100101
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);
103105

104106
obj->pwm_struct = &m_pwm[i];
105107

106108
internal_pwmout_exe(obj);
109+
107110
break;
108111
}
109112
}
@@ -133,6 +136,8 @@ void pwmout_write(pwmout_t *obj, float percent)
133136

134137
pwm_signal_t * p_pwm_signal = &(((pwm_t*)obj->pwm_struct)->signal);
135138

139+
p_pwm_signal->duty = percent / 100;
140+
136141
int us = (((int)p_pwm_signal->period_us) * percent) / 100;
137142

138143
pwmout_pulsewidth_us(obj, us);
@@ -164,6 +169,8 @@ void pwmout_period_us(pwmout_t *obj, int us)
164169
{
165170
pwm_signal_t * p_pwm_signal = &(((pwm_t*)obj->pwm_struct)->signal);
166171

172+
p_pwm_signal->duty_us = (int)((float)us * p_pwm_signal->duty);
173+
167174
p_pwm_signal->period_us = us;
168175

169176
internal_pwmout_exe(obj);
@@ -207,7 +214,7 @@ static ret_code_t pulsewidth_us_set_get(int period_us, int duty_us, pulsewidth_s
207214

208215
for(div = 1; div <= 128 ; div <<= 1)
209216
{
210-
if (0xFFFF >= period_us)
217+
if (0x7FFF >= period_us)
211218
{
212219
p_settings->period = period_us; // unit [us * div]
213220
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
224231
return NRF_ERROR_INVALID_PARAM;
225232
}
226233

227-
static nrf_pwm_values_common_t seq_values[1];
234+
static volatile nrf_pwm_values_common_t seq_values[1];
228235

229236
static nrf_pwm_sequence_t const seq =
230237
{
@@ -243,8 +250,8 @@ static void internal_pwmout_exe(pwmout_t *obj)
243250

244251
p_pwm_signal = &(((pwm_t*)obj->pwm_struct)->signal);
245252

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,
248255
&pulsewidth_set))
249256
{
250257
//@todo apply pulsewidth_set
@@ -278,7 +285,7 @@ static void internal_pwmout_exe(pwmout_t *obj)
278285

279286
seq_values[0] = pulsewidth_set.duty;
280287

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);
282289

283290

284291
}

0 commit comments

Comments
 (0)