Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
targets/hal/TARGET_Atmel/TARGET_SAM_CortexM0P/pwmout_api.c@64:41a834223ea3, 2016-02-15 (annotated)
- Committer:
- mbed_official
- Date:
- Mon Feb 15 10:00:10 2016 +0000
- Revision:
- 64:41a834223ea3
- Parent:
- 15:a81a8d6c1dfe
Synchronized with git revision e641fd47cf2a6bafdbe87c743a39772f73edcbe7
Full URL: https://github.com/mbedmicro/mbed/commit/e641fd47cf2a6bafdbe87c743a39772f73edcbe7/
Fixed GCC Compiler warnings
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |
