added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
64:41a834223ea3
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 15:a81a8d6c1dfe 1 /* mbed Microcontroller Library
mbed_official 15:a81a8d6c1dfe 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 15:a81a8d6c1dfe 3 *
mbed_official 15:a81a8d6c1dfe 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 15:a81a8d6c1dfe 5 * you may not use this file except in compliance with the License.
mbed_official 15:a81a8d6c1dfe 6 * You may obtain a copy of the License at
mbed_official 15:a81a8d6c1dfe 7 *
mbed_official 15:a81a8d6c1dfe 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 15:a81a8d6c1dfe 9 *
mbed_official 15:a81a8d6c1dfe 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 15:a81a8d6c1dfe 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 15:a81a8d6c1dfe 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 15:a81a8d6c1dfe 13 * See the License for the specific language governing permissions and
mbed_official 15:a81a8d6c1dfe 14 * limitations under the License.
mbed_official 15:a81a8d6c1dfe 15 */
mbed_official 15:a81a8d6c1dfe 16 #include "mbed_assert.h"
mbed_official 15:a81a8d6c1dfe 17 #include "pwmout_api.h"
mbed_official 15:a81a8d6c1dfe 18
mbed_official 15:a81a8d6c1dfe 19 #include "cmsis.h"
mbed_official 15:a81a8d6c1dfe 20
mbed_official 15:a81a8d6c1dfe 21 #include "pinmap_function.h"
mbed_official 15:a81a8d6c1dfe 22
mbed_official 15:a81a8d6c1dfe 23 /* Prescaler values for TCC Module */
mbed_official 15:a81a8d6c1dfe 24 const uint32_t tcc_prescaler[] = {
mbed_official 15:a81a8d6c1dfe 25 TCC_CLOCK_PRESCALER_DIV1,
mbed_official 15:a81a8d6c1dfe 26 TCC_CLOCK_PRESCALER_DIV2,
mbed_official 15:a81a8d6c1dfe 27 TCC_CLOCK_PRESCALER_DIV4,
mbed_official 15:a81a8d6c1dfe 28 TCC_CLOCK_PRESCALER_DIV8,
mbed_official 15:a81a8d6c1dfe 29 TCC_CLOCK_PRESCALER_DIV16,
mbed_official 15:a81a8d6c1dfe 30 TCC_CLOCK_PRESCALER_DIV64,
mbed_official 15:a81a8d6c1dfe 31 TCC_CLOCK_PRESCALER_DIV256,
mbed_official 15:a81a8d6c1dfe 32 TCC_CLOCK_PRESCALER_DIV1024
mbed_official 15:a81a8d6c1dfe 33 };
mbed_official 15:a81a8d6c1dfe 34
mbed_official 15:a81a8d6c1dfe 35 /* Max count limits of TCC Modules */
mbed_official 15:a81a8d6c1dfe 36 extern const uint32_t _tcc_maxs[TCC_INST_NUM];
mbed_official 15:a81a8d6c1dfe 37
mbed_official 15:a81a8d6c1dfe 38 /** Set the period of PWM object (will not update the waveform)
mbed_official 15:a81a8d6c1dfe 39 *
mbed_official 15:a81a8d6c1dfe 40 * @param[in] obj The PWM object whose period is to be updated
mbed_official 15:a81a8d6c1dfe 41 * @param[in] period_us Period in microseconds
mbed_official 15:a81a8d6c1dfe 42 * @return void
mbed_official 15:a81a8d6c1dfe 43 */
mbed_official 15:a81a8d6c1dfe 44 static void pwmout_set_period(pwmout_t* obj, int period_us)
mbed_official 15:a81a8d6c1dfe 45 {
mbed_official 15:a81a8d6c1dfe 46 uint8_t i;
mbed_official 15:a81a8d6c1dfe 47 uint32_t freq_hz;
mbed_official 15:a81a8d6c1dfe 48 uint32_t div_freq;
mbed_official 15:a81a8d6c1dfe 49 double us_per_cycle;
mbed_official 15:a81a8d6c1dfe 50 uint64_t max_period = 0;
mbed_official 15:a81a8d6c1dfe 51 uint32_t us_period = period_us;
mbed_official 15:a81a8d6c1dfe 52
mbed_official 15:a81a8d6c1dfe 53 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 54 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 55
mbed_official 15:a81a8d6c1dfe 56 /* TCC instance index */
mbed_official 15:a81a8d6c1dfe 57 uint8_t module_index = _tcc_get_inst_index(obj->tcc.hw);
mbed_official 15:a81a8d6c1dfe 58
mbed_official 15:a81a8d6c1dfe 59 uint32_t count_max = _tcc_maxs[module_index];
mbed_official 15:a81a8d6c1dfe 60
mbed_official 15:a81a8d6c1dfe 61 freq_hz = system_gclk_gen_get_hz(obj->clock_source);
mbed_official 15:a81a8d6c1dfe 62
mbed_official 15:a81a8d6c1dfe 63 for (i=0; i<sizeof(tcc_prescaler); i++) {
mbed_official 15:a81a8d6c1dfe 64 div_freq = freq_hz >> tcc_prescaler[i];
mbed_official 15:a81a8d6c1dfe 65 if (!div_freq) break;
mbed_official 15:a81a8d6c1dfe 66 us_per_cycle = 1000000.00 / div_freq;
mbed_official 15:a81a8d6c1dfe 67 max_period = us_per_cycle * count_max;
mbed_official 15:a81a8d6c1dfe 68 if (max_period >= us_period) {
mbed_official 64:41a834223ea3 69 obj->clock_prescaler = (enum tc_clock_prescaler)tcc_prescaler[i];
mbed_official 15:a81a8d6c1dfe 70 obj->period = us_period / us_per_cycle;
mbed_official 15:a81a8d6c1dfe 71 obj->us_per_cycle = us_per_cycle;
mbed_official 15:a81a8d6c1dfe 72 break;
mbed_official 15:a81a8d6c1dfe 73 }
mbed_official 15:a81a8d6c1dfe 74 }
mbed_official 15:a81a8d6c1dfe 75 }
mbed_official 15:a81a8d6c1dfe 76
mbed_official 15:a81a8d6c1dfe 77 /** Initialize PWM Module with updated values
mbed_official 15:a81a8d6c1dfe 78 *
mbed_official 15:a81a8d6c1dfe 79 * @param[in][out] obj The PWM object to initialize
mbed_official 15:a81a8d6c1dfe 80 * @return non-zero if success
mbed_official 15:a81a8d6c1dfe 81 */
mbed_official 15:a81a8d6c1dfe 82 bool pwmout_init_hw(pwmout_t* obj)
mbed_official 15:a81a8d6c1dfe 83 {
mbed_official 64:41a834223ea3 84 uint32_t mux_func = (uint32_t)NC;
mbed_official 64:41a834223ea3 85 uint32_t pwm = (uint32_t)NC;
mbed_official 15:a81a8d6c1dfe 86 PinName pin;
mbed_official 64:41a834223ea3 87 uint32_t ch_index = (uint32_t)NC;
mbed_official 15:a81a8d6c1dfe 88 struct tcc_config config_tcc;
mbed_official 64:41a834223ea3 89 uint32_t tcc_channel = (uint32_t)NC;
mbed_official 15:a81a8d6c1dfe 90
mbed_official 15:a81a8d6c1dfe 91 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 92 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 93
mbed_official 15:a81a8d6c1dfe 94 pin = obj->pin;
mbed_official 15:a81a8d6c1dfe 95 pwm = pinmap_peripheral(pin, PinMap_PWM);
mbed_official 15:a81a8d6c1dfe 96 if (pwm == (uint32_t)NC) return 0; /* Pin not supported */
mbed_official 15:a81a8d6c1dfe 97
mbed_official 15:a81a8d6c1dfe 98 mux_func = pinmap_function(pin, PinMap_PWM);
mbed_official 64:41a834223ea3 99 ch_index = pinmap_channel_pwm(pin, (PWMName) pwm);
mbed_official 15:a81a8d6c1dfe 100 if ((mux_func == (uint32_t)NC) || (ch_index == (uint32_t)NC)) {
mbed_official 15:a81a8d6c1dfe 101 /* Pin not supported */
mbed_official 15:a81a8d6c1dfe 102 return 0;
mbed_official 15:a81a8d6c1dfe 103 }
mbed_official 15:a81a8d6c1dfe 104 if ((ch_index == 0) || (ch_index == 4)) {
mbed_official 15:a81a8d6c1dfe 105 tcc_channel = 0;
mbed_official 15:a81a8d6c1dfe 106 } else if ((ch_index == 1) || (ch_index == 5)) {
mbed_official 15:a81a8d6c1dfe 107 tcc_channel = 1;
mbed_official 15:a81a8d6c1dfe 108 } else if ((ch_index == 2) || (ch_index == 6)) {
mbed_official 15:a81a8d6c1dfe 109 tcc_channel = 2;
mbed_official 15:a81a8d6c1dfe 110 } else if ((ch_index == 3) || (ch_index == 7)) {
mbed_official 15:a81a8d6c1dfe 111 tcc_channel = 3;
mbed_official 15:a81a8d6c1dfe 112 }
mbed_official 15:a81a8d6c1dfe 113
mbed_official 15:a81a8d6c1dfe 114 tcc_get_config_defaults(&config_tcc, (Tcc*)pwm);
mbed_official 15:a81a8d6c1dfe 115
mbed_official 15:a81a8d6c1dfe 116 config_tcc.counter.clock_source = obj->clock_source;
mbed_official 64:41a834223ea3 117 config_tcc.counter.clock_prescaler = (enum tcc_clock_prescaler)obj->clock_prescaler;
mbed_official 15:a81a8d6c1dfe 118
mbed_official 15:a81a8d6c1dfe 119 config_tcc.counter.period = obj->period;
mbed_official 15:a81a8d6c1dfe 120 config_tcc.compare.wave_generation = TCC_WAVE_GENERATION_SINGLE_SLOPE_PWM;
mbed_official 15:a81a8d6c1dfe 121 config_tcc.compare.match[tcc_channel] = obj->period * obj->duty_cycle;
mbed_official 15:a81a8d6c1dfe 122
mbed_official 15:a81a8d6c1dfe 123 config_tcc.pins.enable_wave_out_pin[ch_index] = true;
mbed_official 15:a81a8d6c1dfe 124 config_tcc.pins.wave_out_pin[ch_index] = pin;
mbed_official 15:a81a8d6c1dfe 125 config_tcc.pins.wave_out_pin_mux[ch_index] = mux_func;
mbed_official 15:a81a8d6c1dfe 126
mbed_official 15:a81a8d6c1dfe 127 return (STATUS_OK == tcc_init(&obj->tcc, (Tcc*)pwm, &config_tcc));
mbed_official 15:a81a8d6c1dfe 128
mbed_official 15:a81a8d6c1dfe 129 }
mbed_official 15:a81a8d6c1dfe 130
mbed_official 15:a81a8d6c1dfe 131 /** Initialize PWM Module
mbed_official 15:a81a8d6c1dfe 132 *
mbed_official 15:a81a8d6c1dfe 133 * @param[in][out] obj The PWM object to initialize
mbed_official 15:a81a8d6c1dfe 134 * @return void
mbed_official 15:a81a8d6c1dfe 135 */
mbed_official 15:a81a8d6c1dfe 136 void pwmout_init(pwmout_t* obj, PinName pin)
mbed_official 15:a81a8d6c1dfe 137 {
mbed_official 15:a81a8d6c1dfe 138 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 139 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 140
mbed_official 15:a81a8d6c1dfe 141 if ((uint32_t)NC == pinmap_peripheral(pin, PinMap_PWM)) {
mbed_official 15:a81a8d6c1dfe 142 /* Pin not supported */
mbed_official 15:a81a8d6c1dfe 143 return;
mbed_official 15:a81a8d6c1dfe 144 }
mbed_official 15:a81a8d6c1dfe 145
mbed_official 15:a81a8d6c1dfe 146 obj->pin = pin;
mbed_official 15:a81a8d6c1dfe 147 obj->period = 0xFFFF;
mbed_official 15:a81a8d6c1dfe 148 obj->duty_cycle = 1;
mbed_official 15:a81a8d6c1dfe 149 obj->clock_source = GCLK_GENERATOR_0; /* 8Mhz input clock */
mbed_official 64:41a834223ea3 150 obj->clock_prescaler = (enum tc_clock_prescaler)TCC_CLOCK_PRESCALER_DIV8; /* Default to 1MHz for 8Mhz input clock */
mbed_official 15:a81a8d6c1dfe 151
mbed_official 15:a81a8d6c1dfe 152 /* Update the changes */
mbed_official 15:a81a8d6c1dfe 153 if (pwmout_init_hw(obj)) {
mbed_official 15:a81a8d6c1dfe 154 /* Enable PWM Module */
mbed_official 15:a81a8d6c1dfe 155 tcc_enable(&obj->tcc);
mbed_official 15:a81a8d6c1dfe 156 }
mbed_official 15:a81a8d6c1dfe 157
mbed_official 15:a81a8d6c1dfe 158 }
mbed_official 15:a81a8d6c1dfe 159
mbed_official 15:a81a8d6c1dfe 160 /** Free the PWM Module
mbed_official 15:a81a8d6c1dfe 161 *
mbed_official 15:a81a8d6c1dfe 162 * @param[in] obj The PWM object to free
mbed_official 15:a81a8d6c1dfe 163 * @return void
mbed_official 15:a81a8d6c1dfe 164 */
mbed_official 15:a81a8d6c1dfe 165 void pwmout_free(pwmout_t* obj)
mbed_official 15:a81a8d6c1dfe 166 {
mbed_official 15:a81a8d6c1dfe 167 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 168 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 169
mbed_official 15:a81a8d6c1dfe 170 tcc_disable(&obj->tcc);
mbed_official 15:a81a8d6c1dfe 171 }
mbed_official 15:a81a8d6c1dfe 172
mbed_official 15:a81a8d6c1dfe 173 /** Set the duty cycle of PWM Waveform
mbed_official 15:a81a8d6c1dfe 174 *
mbed_official 15:a81a8d6c1dfe 175 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 176 * @param[in] value New duty cycle to be set
mbed_official 15:a81a8d6c1dfe 177 * @return void
mbed_official 15:a81a8d6c1dfe 178 */
mbed_official 15:a81a8d6c1dfe 179 void pwmout_write(pwmout_t* obj, float value)
mbed_official 15:a81a8d6c1dfe 180 {
mbed_official 15:a81a8d6c1dfe 181 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 182 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 183
mbed_official 15:a81a8d6c1dfe 184 if (value < 0.0f) {
mbed_official 15:a81a8d6c1dfe 185 value = 0;
mbed_official 15:a81a8d6c1dfe 186 } else if (value > 1.0f) {
mbed_official 15:a81a8d6c1dfe 187 value = 1;
mbed_official 15:a81a8d6c1dfe 188 }
mbed_official 15:a81a8d6c1dfe 189
mbed_official 15:a81a8d6c1dfe 190 /* Modify the pulse width keeping period same */
mbed_official 15:a81a8d6c1dfe 191 obj->duty_cycle = value;
mbed_official 15:a81a8d6c1dfe 192
mbed_official 15:a81a8d6c1dfe 193 /* Disable PWM Module */
mbed_official 15:a81a8d6c1dfe 194 tcc_disable(&obj->tcc);
mbed_official 15:a81a8d6c1dfe 195
mbed_official 15:a81a8d6c1dfe 196 /* Update the changes */
mbed_official 15:a81a8d6c1dfe 197 if (pwmout_init_hw(obj)) {
mbed_official 15:a81a8d6c1dfe 198 /* Enable PWM Module */
mbed_official 15:a81a8d6c1dfe 199 tcc_enable(&obj->tcc);
mbed_official 15:a81a8d6c1dfe 200 }
mbed_official 15:a81a8d6c1dfe 201 }
mbed_official 15:a81a8d6c1dfe 202
mbed_official 15:a81a8d6c1dfe 203 /** Get the duty cycle of PWM Waveform
mbed_official 15:a81a8d6c1dfe 204 *
mbed_official 15:a81a8d6c1dfe 205 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 206 * @return Current duty cycle
mbed_official 15:a81a8d6c1dfe 207 */
mbed_official 15:a81a8d6c1dfe 208 float pwmout_read(pwmout_t* obj)
mbed_official 15:a81a8d6c1dfe 209 {
mbed_official 15:a81a8d6c1dfe 210 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 211 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 212
mbed_official 15:a81a8d6c1dfe 213 return obj->duty_cycle;
mbed_official 15:a81a8d6c1dfe 214 }
mbed_official 15:a81a8d6c1dfe 215
mbed_official 15:a81a8d6c1dfe 216 /** Set the period of PWM Waveform
mbed_official 15:a81a8d6c1dfe 217 *
mbed_official 15:a81a8d6c1dfe 218 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 219 * @param[in] seconds New period in seconds
mbed_official 15:a81a8d6c1dfe 220 * @return void
mbed_official 15:a81a8d6c1dfe 221 */
mbed_official 15:a81a8d6c1dfe 222 void pwmout_period(pwmout_t* obj, float seconds)
mbed_official 15:a81a8d6c1dfe 223 {
mbed_official 15:a81a8d6c1dfe 224 pwmout_period_us(obj, seconds * 1000000.0f);
mbed_official 15:a81a8d6c1dfe 225 }
mbed_official 15:a81a8d6c1dfe 226
mbed_official 15:a81a8d6c1dfe 227 /** Set the period of PWM Waveform
mbed_official 15:a81a8d6c1dfe 228 *
mbed_official 15:a81a8d6c1dfe 229 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 230 * @param[in] value New period in milliseconds
mbed_official 15:a81a8d6c1dfe 231 * @return void
mbed_official 15:a81a8d6c1dfe 232 */
mbed_official 15:a81a8d6c1dfe 233 void pwmout_period_ms(pwmout_t* obj, int ms)
mbed_official 15:a81a8d6c1dfe 234 {
mbed_official 15:a81a8d6c1dfe 235 pwmout_period_us(obj, ms * 1000);
mbed_official 15:a81a8d6c1dfe 236 }
mbed_official 15:a81a8d6c1dfe 237
mbed_official 15:a81a8d6c1dfe 238 /** Set the period of PWM Waveform
mbed_official 15:a81a8d6c1dfe 239 *
mbed_official 15:a81a8d6c1dfe 240 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 241 * @param[in] us New period in microseconds
mbed_official 15:a81a8d6c1dfe 242 * @return void
mbed_official 15:a81a8d6c1dfe 243 */
mbed_official 15:a81a8d6c1dfe 244 void pwmout_period_us(pwmout_t* obj, int us)
mbed_official 15:a81a8d6c1dfe 245 {
mbed_official 15:a81a8d6c1dfe 246 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 247 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 248
mbed_official 15:a81a8d6c1dfe 249 /* Disable PWM Module */
mbed_official 15:a81a8d6c1dfe 250 tcc_disable(&obj->tcc);
mbed_official 15:a81a8d6c1dfe 251
mbed_official 15:a81a8d6c1dfe 252 /* TODO: Find and set the period */
mbed_official 15:a81a8d6c1dfe 253 pwmout_set_period(obj, us);
mbed_official 15:a81a8d6c1dfe 254
mbed_official 15:a81a8d6c1dfe 255 /* Update the changes */
mbed_official 15:a81a8d6c1dfe 256 if (pwmout_init_hw(obj)) {
mbed_official 15:a81a8d6c1dfe 257 /* Enable PWM Module */
mbed_official 15:a81a8d6c1dfe 258 tcc_enable(&obj->tcc);
mbed_official 15:a81a8d6c1dfe 259 }
mbed_official 15:a81a8d6c1dfe 260 }
mbed_official 15:a81a8d6c1dfe 261
mbed_official 15:a81a8d6c1dfe 262 /** Set the pulse width of PWM Waveform
mbed_official 15:a81a8d6c1dfe 263 *
mbed_official 15:a81a8d6c1dfe 264 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 265 * @param[in] seconds New pulse width in seconds
mbed_official 15:a81a8d6c1dfe 266 * @return void
mbed_official 15:a81a8d6c1dfe 267 */
mbed_official 15:a81a8d6c1dfe 268 void pwmout_pulsewidth(pwmout_t* obj, float seconds)
mbed_official 15:a81a8d6c1dfe 269 {
mbed_official 15:a81a8d6c1dfe 270 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
mbed_official 15:a81a8d6c1dfe 271 }
mbed_official 15:a81a8d6c1dfe 272
mbed_official 15:a81a8d6c1dfe 273 /** Set the pulse width of PWM Waveform
mbed_official 15:a81a8d6c1dfe 274 *
mbed_official 15:a81a8d6c1dfe 275 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 276 * @param[in] ms New pulse width in milliseconds
mbed_official 15:a81a8d6c1dfe 277 * @return void
mbed_official 15:a81a8d6c1dfe 278 */
mbed_official 15:a81a8d6c1dfe 279 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms)
mbed_official 15:a81a8d6c1dfe 280 {
mbed_official 15:a81a8d6c1dfe 281 pwmout_pulsewidth_us(obj, ms * 1000);
mbed_official 15:a81a8d6c1dfe 282 }
mbed_official 15:a81a8d6c1dfe 283
mbed_official 15:a81a8d6c1dfe 284 /** Set the pulse width of PWM Waveform
mbed_official 15:a81a8d6c1dfe 285 *
mbed_official 15:a81a8d6c1dfe 286 * @param[in] obj The PWM object
mbed_official 15:a81a8d6c1dfe 287 * @param[in] us New pulse width in microseconds
mbed_official 15:a81a8d6c1dfe 288 * @return void
mbed_official 15:a81a8d6c1dfe 289 */
mbed_official 15:a81a8d6c1dfe 290 void pwmout_pulsewidth_us(pwmout_t* obj, int us)
mbed_official 15:a81a8d6c1dfe 291 {
mbed_official 15:a81a8d6c1dfe 292 /* Sanity check arguments */
mbed_official 15:a81a8d6c1dfe 293 MBED_ASSERT(obj);
mbed_official 15:a81a8d6c1dfe 294
mbed_official 15:a81a8d6c1dfe 295 uint32_t us_pulse = us;
mbed_official 15:a81a8d6c1dfe 296
mbed_official 15:a81a8d6c1dfe 297 /* Find the new duty cycle */
mbed_official 15:a81a8d6c1dfe 298 double duty_cycle = us_pulse / ((double)obj->period * obj->us_per_cycle);
mbed_official 15:a81a8d6c1dfe 299
mbed_official 15:a81a8d6c1dfe 300 /* This call updates pulse width as well as period */
mbed_official 15:a81a8d6c1dfe 301 pwmout_write(obj, duty_cycle);
mbed_official 15:a81a8d6c1dfe 302 }