Nathan Yonkee / Mbed 2 deprecated Nucleo_sinewave_output_copy

Dependencies:   mbed

Committer:
Nathan Yonkee
Date:
Fri Mar 02 07:16:49 2018 -0700
Revision:
10:46a4cf51ee38
Parent:
9:d58e77ebd769
remove mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nathan Yonkee 9:d58e77ebd769 1 /* mbed Microcontroller Library
Nathan Yonkee 9:d58e77ebd769 2 * Copyright (c) 2006-2013 ARM Limited
Nathan Yonkee 9:d58e77ebd769 3 *
Nathan Yonkee 9:d58e77ebd769 4 * Licensed under the Apache License, Version 2.0 (the "License");
Nathan Yonkee 9:d58e77ebd769 5 * you may not use this file except in compliance with the License.
Nathan Yonkee 9:d58e77ebd769 6 * You may obtain a copy of the License at
Nathan Yonkee 9:d58e77ebd769 7 *
Nathan Yonkee 9:d58e77ebd769 8 * http://www.apache.org/licenses/LICENSE-2.0
Nathan Yonkee 9:d58e77ebd769 9 *
Nathan Yonkee 9:d58e77ebd769 10 * Unless required by applicable law or agreed to in writing, software
Nathan Yonkee 9:d58e77ebd769 11 * distributed under the License is distributed on an "AS IS" BASIS,
Nathan Yonkee 9:d58e77ebd769 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Nathan Yonkee 9:d58e77ebd769 13 * See the License for the specific language governing permissions and
Nathan Yonkee 9:d58e77ebd769 14 * limitations under the License.
Nathan Yonkee 9:d58e77ebd769 15 */
Nathan Yonkee 9:d58e77ebd769 16 #include "mbed_assert.h"
Nathan Yonkee 9:d58e77ebd769 17 #include "pwmout_api.h"
Nathan Yonkee 9:d58e77ebd769 18 #include "cmsis.h"
Nathan Yonkee 9:d58e77ebd769 19 #include "PeripheralPins.h"
Nathan Yonkee 9:d58e77ebd769 20 #include "RZ_A1_Init.h"
Nathan Yonkee 9:d58e77ebd769 21 #include "iodefine.h"
Nathan Yonkee 9:d58e77ebd769 22 #include "gpio_addrdefine.h"
Nathan Yonkee 9:d58e77ebd769 23 #include "mbed_drv_cfg.h"
Nathan Yonkee 9:d58e77ebd769 24
Nathan Yonkee 9:d58e77ebd769 25 #define MTU2_PWM_OFFSET 0x20
Nathan Yonkee 9:d58e77ebd769 26
Nathan Yonkee 9:d58e77ebd769 27 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 28 typedef enum {
Nathan Yonkee 9:d58e77ebd769 29 PWM1A = 0,
Nathan Yonkee 9:d58e77ebd769 30 PWM1B,
Nathan Yonkee 9:d58e77ebd769 31 PWM1C,
Nathan Yonkee 9:d58e77ebd769 32 PWM1D,
Nathan Yonkee 9:d58e77ebd769 33 PWM1E,
Nathan Yonkee 9:d58e77ebd769 34 PWM1F,
Nathan Yonkee 9:d58e77ebd769 35 PWM1G,
Nathan Yonkee 9:d58e77ebd769 36 PWM1H,
Nathan Yonkee 9:d58e77ebd769 37 PWM2A = 0x10,
Nathan Yonkee 9:d58e77ebd769 38 PWM2B,
Nathan Yonkee 9:d58e77ebd769 39 PWM2C,
Nathan Yonkee 9:d58e77ebd769 40 PWM2D,
Nathan Yonkee 9:d58e77ebd769 41 PWM2E,
Nathan Yonkee 9:d58e77ebd769 42 PWM2F,
Nathan Yonkee 9:d58e77ebd769 43 PWM2G,
Nathan Yonkee 9:d58e77ebd769 44 PWM2H,
Nathan Yonkee 9:d58e77ebd769 45 } PWMType;
Nathan Yonkee 9:d58e77ebd769 46
Nathan Yonkee 9:d58e77ebd769 47 static const PWMType PORT[] = {
Nathan Yonkee 9:d58e77ebd769 48 PWM1A, // PWM_PWM1A
Nathan Yonkee 9:d58e77ebd769 49 PWM1B, // PWM_PWM1B
Nathan Yonkee 9:d58e77ebd769 50 PWM1C, // PWM_PWM1C
Nathan Yonkee 9:d58e77ebd769 51 PWM1D, // PWM_PWM1D
Nathan Yonkee 9:d58e77ebd769 52 PWM1E, // PWM_PWM1E
Nathan Yonkee 9:d58e77ebd769 53 PWM1F, // PWM_PWM1F
Nathan Yonkee 9:d58e77ebd769 54 PWM1G, // PWM_PWM1G
Nathan Yonkee 9:d58e77ebd769 55 PWM1H, // PWM_PWM1H
Nathan Yonkee 9:d58e77ebd769 56 PWM2A, // PWM_PWM2A
Nathan Yonkee 9:d58e77ebd769 57 PWM2B, // PWM_PWM2B
Nathan Yonkee 9:d58e77ebd769 58 PWM2C, // PWM_PWM2C
Nathan Yonkee 9:d58e77ebd769 59 PWM2D, // PWM_PWM2D
Nathan Yonkee 9:d58e77ebd769 60 PWM2E, // PWM_PWM2E
Nathan Yonkee 9:d58e77ebd769 61 PWM2F, // PWM_PWM2F
Nathan Yonkee 9:d58e77ebd769 62 PWM2G, // PWM_PWM2G
Nathan Yonkee 9:d58e77ebd769 63 PWM2H, // PWM_PWM2H
Nathan Yonkee 9:d58e77ebd769 64 };
Nathan Yonkee 9:d58e77ebd769 65
Nathan Yonkee 9:d58e77ebd769 66 static __IO uint16_t *PWM_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 67 &PWMPWBFR_1A, // PWM_PWM1A
Nathan Yonkee 9:d58e77ebd769 68 &PWMPWBFR_1A, // PWM_PWM1B
Nathan Yonkee 9:d58e77ebd769 69 &PWMPWBFR_1C, // PWM_PWM1C
Nathan Yonkee 9:d58e77ebd769 70 &PWMPWBFR_1C, // PWM_PWM1D
Nathan Yonkee 9:d58e77ebd769 71 &PWMPWBFR_1E, // PWM_PWM1E
Nathan Yonkee 9:d58e77ebd769 72 &PWMPWBFR_1E, // PWM_PWM1F
Nathan Yonkee 9:d58e77ebd769 73 &PWMPWBFR_1G, // PWM_PWM1G
Nathan Yonkee 9:d58e77ebd769 74 &PWMPWBFR_1G, // PWM_PWM1H
Nathan Yonkee 9:d58e77ebd769 75 &PWMPWBFR_2A, // PWM_PWM2A
Nathan Yonkee 9:d58e77ebd769 76 &PWMPWBFR_2A, // PWM_PWM2B
Nathan Yonkee 9:d58e77ebd769 77 &PWMPWBFR_2C, // PWM_PWM2C
Nathan Yonkee 9:d58e77ebd769 78 &PWMPWBFR_2C, // PWM_PWM2D
Nathan Yonkee 9:d58e77ebd769 79 &PWMPWBFR_2E, // PWM_PWM2E
Nathan Yonkee 9:d58e77ebd769 80 &PWMPWBFR_2E, // PWM_PWM2F
Nathan Yonkee 9:d58e77ebd769 81 &PWMPWBFR_2G, // PWM_PWM2G
Nathan Yonkee 9:d58e77ebd769 82 &PWMPWBFR_2G, // PWM_PWM2H
Nathan Yonkee 9:d58e77ebd769 83 };
Nathan Yonkee 9:d58e77ebd769 84
Nathan Yonkee 9:d58e77ebd769 85 static uint16_t init_period_ch1 = 0;
Nathan Yonkee 9:d58e77ebd769 86 static uint16_t init_period_ch2 = 0;
Nathan Yonkee 9:d58e77ebd769 87 static int32_t period_ch1 = 1;
Nathan Yonkee 9:d58e77ebd769 88 static int32_t period_ch2 = 1;
Nathan Yonkee 9:d58e77ebd769 89 #endif
Nathan Yonkee 9:d58e77ebd769 90
Nathan Yonkee 9:d58e77ebd769 91 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 92 #define MTU2_PWM_SIGNAL 2
Nathan Yonkee 9:d58e77ebd769 93
Nathan Yonkee 9:d58e77ebd769 94 typedef enum {
Nathan Yonkee 9:d58e77ebd769 95 TIOC0A = 0,
Nathan Yonkee 9:d58e77ebd769 96 TIOC0B,
Nathan Yonkee 9:d58e77ebd769 97 TIOC0C,
Nathan Yonkee 9:d58e77ebd769 98 TIOC0D,
Nathan Yonkee 9:d58e77ebd769 99 TIOC1A = 0x10,
Nathan Yonkee 9:d58e77ebd769 100 TIOC1B,
Nathan Yonkee 9:d58e77ebd769 101 TIOC2A = 0x20,
Nathan Yonkee 9:d58e77ebd769 102 TIOC2B,
Nathan Yonkee 9:d58e77ebd769 103 TIOC3A = 0x30,
Nathan Yonkee 9:d58e77ebd769 104 TIOC3B,
Nathan Yonkee 9:d58e77ebd769 105 TIOC3C,
Nathan Yonkee 9:d58e77ebd769 106 TIOC3D,
Nathan Yonkee 9:d58e77ebd769 107 TIOC4A = 0x40,
Nathan Yonkee 9:d58e77ebd769 108 TIOC4B,
Nathan Yonkee 9:d58e77ebd769 109 TIOC4C,
Nathan Yonkee 9:d58e77ebd769 110 TIOC4D,
Nathan Yonkee 9:d58e77ebd769 111 } MTU2_PWMType;
Nathan Yonkee 9:d58e77ebd769 112
Nathan Yonkee 9:d58e77ebd769 113 static const MTU2_PWMType MTU2_PORT[] = {
Nathan Yonkee 9:d58e77ebd769 114 TIOC0A, // PWM_TIOC0A
Nathan Yonkee 9:d58e77ebd769 115 TIOC0C, // PWM_TIOC0C
Nathan Yonkee 9:d58e77ebd769 116 TIOC1A, // PWM_TIOC1A
Nathan Yonkee 9:d58e77ebd769 117 TIOC2A, // PWM_TIOC2A
Nathan Yonkee 9:d58e77ebd769 118 TIOC3A, // PWM_TIOC3A
Nathan Yonkee 9:d58e77ebd769 119 TIOC3C, // PWM_TIOC3C
Nathan Yonkee 9:d58e77ebd769 120 TIOC4A, // PWM_TIOC4A
Nathan Yonkee 9:d58e77ebd769 121 TIOC4C, // PWM_TIOC4C
Nathan Yonkee 9:d58e77ebd769 122 };
Nathan Yonkee 9:d58e77ebd769 123
Nathan Yonkee 9:d58e77ebd769 124 static __IO uint16_t *MTU2_PWM_MATCH[][MTU2_PWM_SIGNAL] = {
Nathan Yonkee 9:d58e77ebd769 125 { &MTU2TGRA_0, &MTU2TGRB_0 }, // PWM_TIOC0A
Nathan Yonkee 9:d58e77ebd769 126 { &MTU2TGRC_0, &MTU2TGRD_0 }, // PWM_TIOC0C
Nathan Yonkee 9:d58e77ebd769 127 { &MTU2TGRA_1, &MTU2TGRB_1 }, // PWM_TIOC1A
Nathan Yonkee 9:d58e77ebd769 128 { &MTU2TGRA_2, &MTU2TGRB_2 }, // PWM_TIOC2A
Nathan Yonkee 9:d58e77ebd769 129 { &MTU2TGRA_3, &MTU2TGRB_3 }, // PWM_TIOC3A
Nathan Yonkee 9:d58e77ebd769 130 { &MTU2TGRC_3, &MTU2TGRD_3 }, // PWM_TIOC3C
Nathan Yonkee 9:d58e77ebd769 131 { &MTU2TGRA_4, &MTU2TGRB_4 }, // PWM_TIOC4A
Nathan Yonkee 9:d58e77ebd769 132 { &MTU2TGRC_4, &MTU2TGRD_4 }, // PWM_TIOC4C
Nathan Yonkee 9:d58e77ebd769 133 };
Nathan Yonkee 9:d58e77ebd769 134
Nathan Yonkee 9:d58e77ebd769 135 static __IO uint8_t *TCR_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 136 &MTU2TCR_0,
Nathan Yonkee 9:d58e77ebd769 137 &MTU2TCR_1,
Nathan Yonkee 9:d58e77ebd769 138 &MTU2TCR_2,
Nathan Yonkee 9:d58e77ebd769 139 &MTU2TCR_3,
Nathan Yonkee 9:d58e77ebd769 140 &MTU2TCR_4,
Nathan Yonkee 9:d58e77ebd769 141 };
Nathan Yonkee 9:d58e77ebd769 142
Nathan Yonkee 9:d58e77ebd769 143 static __IO uint8_t *TIORH_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 144 &MTU2TIORH_0,
Nathan Yonkee 9:d58e77ebd769 145 &MTU2TIOR_1,
Nathan Yonkee 9:d58e77ebd769 146 &MTU2TIOR_2,
Nathan Yonkee 9:d58e77ebd769 147 &MTU2TIORH_3,
Nathan Yonkee 9:d58e77ebd769 148 &MTU2TIORH_4,
Nathan Yonkee 9:d58e77ebd769 149 };
Nathan Yonkee 9:d58e77ebd769 150
Nathan Yonkee 9:d58e77ebd769 151 static __IO uint8_t *TIORL_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 152 &MTU2TIORL_0,
Nathan Yonkee 9:d58e77ebd769 153 NULL,
Nathan Yonkee 9:d58e77ebd769 154 NULL,
Nathan Yonkee 9:d58e77ebd769 155 &MTU2TIORL_3,
Nathan Yonkee 9:d58e77ebd769 156 &MTU2TIORL_4,
Nathan Yonkee 9:d58e77ebd769 157 };
Nathan Yonkee 9:d58e77ebd769 158
Nathan Yonkee 9:d58e77ebd769 159 static __IO uint16_t *TGRA_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 160 &MTU2TGRA_0,
Nathan Yonkee 9:d58e77ebd769 161 &MTU2TGRA_1,
Nathan Yonkee 9:d58e77ebd769 162 &MTU2TGRA_2,
Nathan Yonkee 9:d58e77ebd769 163 &MTU2TGRA_3,
Nathan Yonkee 9:d58e77ebd769 164 &MTU2TGRA_4,
Nathan Yonkee 9:d58e77ebd769 165 };
Nathan Yonkee 9:d58e77ebd769 166
Nathan Yonkee 9:d58e77ebd769 167 static __IO uint16_t *TGRC_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 168 &MTU2TGRC_0,
Nathan Yonkee 9:d58e77ebd769 169 NULL,
Nathan Yonkee 9:d58e77ebd769 170 NULL,
Nathan Yonkee 9:d58e77ebd769 171 &MTU2TGRC_3,
Nathan Yonkee 9:d58e77ebd769 172 &MTU2TGRC_4,
Nathan Yonkee 9:d58e77ebd769 173 };
Nathan Yonkee 9:d58e77ebd769 174
Nathan Yonkee 9:d58e77ebd769 175 static __IO uint8_t *TMDR_MATCH[] = {
Nathan Yonkee 9:d58e77ebd769 176 &MTU2TMDR_0,
Nathan Yonkee 9:d58e77ebd769 177 &MTU2TMDR_1,
Nathan Yonkee 9:d58e77ebd769 178 &MTU2TMDR_2,
Nathan Yonkee 9:d58e77ebd769 179 &MTU2TMDR_3,
Nathan Yonkee 9:d58e77ebd769 180 &MTU2TMDR_4,
Nathan Yonkee 9:d58e77ebd769 181 };
Nathan Yonkee 9:d58e77ebd769 182
Nathan Yonkee 9:d58e77ebd769 183 static int MAX_PERIOD[] = {
Nathan Yonkee 9:d58e77ebd769 184 125000,
Nathan Yonkee 9:d58e77ebd769 185 503000,
Nathan Yonkee 9:d58e77ebd769 186 2000000,
Nathan Yonkee 9:d58e77ebd769 187 2000000,
Nathan Yonkee 9:d58e77ebd769 188 2000000,
Nathan Yonkee 9:d58e77ebd769 189 };
Nathan Yonkee 9:d58e77ebd769 190
Nathan Yonkee 9:d58e77ebd769 191 typedef enum {
Nathan Yonkee 9:d58e77ebd769 192 MTU2_PULSE = 0,
Nathan Yonkee 9:d58e77ebd769 193 MTU2_PERIOD
Nathan Yonkee 9:d58e77ebd769 194 } MTU2Signal;
Nathan Yonkee 9:d58e77ebd769 195
Nathan Yonkee 9:d58e77ebd769 196 static uint16_t init_mtu2_period_ch[5] = {0};
Nathan Yonkee 9:d58e77ebd769 197 static int32_t mtu2_period_ch[5] = {1, 1, 1, 1, 1};
Nathan Yonkee 9:d58e77ebd769 198 #endif
Nathan Yonkee 9:d58e77ebd769 199
Nathan Yonkee 9:d58e77ebd769 200 void pwmout_init(pwmout_t* obj, PinName pin) {
Nathan Yonkee 9:d58e77ebd769 201 // determine the channel
Nathan Yonkee 9:d58e77ebd769 202 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
Nathan Yonkee 9:d58e77ebd769 203 MBED_ASSERT(pwm != (PWMName)NC);
Nathan Yonkee 9:d58e77ebd769 204
Nathan Yonkee 9:d58e77ebd769 205 if (pwm >= MTU2_PWM_OFFSET) {
Nathan Yonkee 9:d58e77ebd769 206 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 207 /* PWM by MTU2 */
Nathan Yonkee 9:d58e77ebd769 208 int tmp_pwm;
Nathan Yonkee 9:d58e77ebd769 209
Nathan Yonkee 9:d58e77ebd769 210 // power on
Nathan Yonkee 9:d58e77ebd769 211 CPGSTBCR3 &= ~(CPG_STBCR3_BIT_MSTP33);
Nathan Yonkee 9:d58e77ebd769 212
Nathan Yonkee 9:d58e77ebd769 213 obj->pwm = pwm;
Nathan Yonkee 9:d58e77ebd769 214 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
Nathan Yonkee 9:d58e77ebd769 215 if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000040) == 0x00000040) {
Nathan Yonkee 9:d58e77ebd769 216 obj->ch = 4;
Nathan Yonkee 9:d58e77ebd769 217 MTU2TOER |= 0x36;
Nathan Yonkee 9:d58e77ebd769 218 } else if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000030) == 0x00000030) {
Nathan Yonkee 9:d58e77ebd769 219 obj->ch = 3;
Nathan Yonkee 9:d58e77ebd769 220 MTU2TOER |= 0x09;
Nathan Yonkee 9:d58e77ebd769 221 } else if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000020) == 0x00000020) {
Nathan Yonkee 9:d58e77ebd769 222 obj->ch = 2;
Nathan Yonkee 9:d58e77ebd769 223 } else if (((uint32_t)MTU2_PORT[tmp_pwm] & 0x00000010) == 0x00000010) {
Nathan Yonkee 9:d58e77ebd769 224 obj->ch = 1;
Nathan Yonkee 9:d58e77ebd769 225 } else {
Nathan Yonkee 9:d58e77ebd769 226 obj->ch = 0;
Nathan Yonkee 9:d58e77ebd769 227 }
Nathan Yonkee 9:d58e77ebd769 228 // Wire pinout
Nathan Yonkee 9:d58e77ebd769 229 pinmap_pinout(pin, PinMap_PWM);
Nathan Yonkee 9:d58e77ebd769 230
Nathan Yonkee 9:d58e77ebd769 231 int bitmask = 1 << (pin & 0xf);
Nathan Yonkee 9:d58e77ebd769 232
Nathan Yonkee 9:d58e77ebd769 233 *PMSR(PINGROUP(pin)) = (bitmask << 16) | 0;
Nathan Yonkee 9:d58e77ebd769 234
Nathan Yonkee 9:d58e77ebd769 235 // default duty 0.0f
Nathan Yonkee 9:d58e77ebd769 236 pwmout_write(obj, 0);
Nathan Yonkee 9:d58e77ebd769 237 if (init_mtu2_period_ch[obj->ch] == 0) {
Nathan Yonkee 9:d58e77ebd769 238 // default period 1ms
Nathan Yonkee 9:d58e77ebd769 239 pwmout_period_us(obj, 1000);
Nathan Yonkee 9:d58e77ebd769 240 init_mtu2_period_ch[obj->ch] = 1;
Nathan Yonkee 9:d58e77ebd769 241 }
Nathan Yonkee 9:d58e77ebd769 242 #endif
Nathan Yonkee 9:d58e77ebd769 243 } else {
Nathan Yonkee 9:d58e77ebd769 244 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 245 /* PWM */
Nathan Yonkee 9:d58e77ebd769 246 // power on
Nathan Yonkee 9:d58e77ebd769 247 CPGSTBCR3 &= ~(CPG_STBCR3_BIT_MSTP30);
Nathan Yonkee 9:d58e77ebd769 248
Nathan Yonkee 9:d58e77ebd769 249 obj->pwm = pwm;
Nathan Yonkee 9:d58e77ebd769 250 if (((uint32_t)PORT[obj->pwm] & 0x00000010) == 0x00000010) {
Nathan Yonkee 9:d58e77ebd769 251 obj->ch = 2;
Nathan Yonkee 9:d58e77ebd769 252 PWMPWPR_2 = 0x00;
Nathan Yonkee 9:d58e77ebd769 253 } else {
Nathan Yonkee 9:d58e77ebd769 254 obj->ch = 1;
Nathan Yonkee 9:d58e77ebd769 255 PWMPWPR_1 = 0x00;
Nathan Yonkee 9:d58e77ebd769 256 }
Nathan Yonkee 9:d58e77ebd769 257
Nathan Yonkee 9:d58e77ebd769 258 // Wire pinout
Nathan Yonkee 9:d58e77ebd769 259 pinmap_pinout(pin, PinMap_PWM);
Nathan Yonkee 9:d58e77ebd769 260
Nathan Yonkee 9:d58e77ebd769 261 // default to 491us: standard for servos, and fine for e.g. brightness control
Nathan Yonkee 9:d58e77ebd769 262 pwmout_write(obj, 0);
Nathan Yonkee 9:d58e77ebd769 263 if ((obj->ch == 2) && (init_period_ch2 == 0)) {
Nathan Yonkee 9:d58e77ebd769 264 pwmout_period_us(obj, 491);
Nathan Yonkee 9:d58e77ebd769 265 init_period_ch2 = 1;
Nathan Yonkee 9:d58e77ebd769 266 }
Nathan Yonkee 9:d58e77ebd769 267 if ((obj->ch == 1) && (init_period_ch1 == 0)) {
Nathan Yonkee 9:d58e77ebd769 268 pwmout_period_us(obj, 491);
Nathan Yonkee 9:d58e77ebd769 269 init_period_ch1 = 1;
Nathan Yonkee 9:d58e77ebd769 270 }
Nathan Yonkee 9:d58e77ebd769 271 #endif
Nathan Yonkee 9:d58e77ebd769 272 }
Nathan Yonkee 9:d58e77ebd769 273 }
Nathan Yonkee 9:d58e77ebd769 274
Nathan Yonkee 9:d58e77ebd769 275 void pwmout_free(pwmout_t* obj) {
Nathan Yonkee 9:d58e77ebd769 276 pwmout_write(obj, 0);
Nathan Yonkee 9:d58e77ebd769 277 }
Nathan Yonkee 9:d58e77ebd769 278
Nathan Yonkee 9:d58e77ebd769 279 void pwmout_write(pwmout_t* obj, float value) {
Nathan Yonkee 9:d58e77ebd769 280 uint32_t wk_cycle;
Nathan Yonkee 9:d58e77ebd769 281
Nathan Yonkee 9:d58e77ebd769 282 if (obj->pwm >= MTU2_PWM_OFFSET) {
Nathan Yonkee 9:d58e77ebd769 283 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 284 /* PWM by MTU2 */
Nathan Yonkee 9:d58e77ebd769 285 int tmp_pwm;
Nathan Yonkee 9:d58e77ebd769 286
Nathan Yonkee 9:d58e77ebd769 287 if (value < 0.0f) {
Nathan Yonkee 9:d58e77ebd769 288 value = 0.0f;
Nathan Yonkee 9:d58e77ebd769 289 } else if (value > 1.0f) {
Nathan Yonkee 9:d58e77ebd769 290 value = 1.0f;
Nathan Yonkee 9:d58e77ebd769 291 } else {
Nathan Yonkee 9:d58e77ebd769 292 // Do Nothing
Nathan Yonkee 9:d58e77ebd769 293 }
Nathan Yonkee 9:d58e77ebd769 294 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
Nathan Yonkee 9:d58e77ebd769 295 wk_cycle = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] & 0xffff;
Nathan Yonkee 9:d58e77ebd769 296 // set channel match to percentage
Nathan Yonkee 9:d58e77ebd769 297 if (value == 1.0f) {
Nathan Yonkee 9:d58e77ebd769 298 *MTU2_PWM_MATCH[tmp_pwm][MTU2_PULSE] = (uint16_t)(wk_cycle - 1);
Nathan Yonkee 9:d58e77ebd769 299 } else {
Nathan Yonkee 9:d58e77ebd769 300 *MTU2_PWM_MATCH[tmp_pwm][MTU2_PULSE] = (uint16_t)((float)wk_cycle * value);
Nathan Yonkee 9:d58e77ebd769 301 }
Nathan Yonkee 9:d58e77ebd769 302 #endif
Nathan Yonkee 9:d58e77ebd769 303 } else {
Nathan Yonkee 9:d58e77ebd769 304 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 305 uint16_t v;
Nathan Yonkee 9:d58e77ebd769 306
Nathan Yonkee 9:d58e77ebd769 307 /* PWM */
Nathan Yonkee 9:d58e77ebd769 308 if (value < 0.0f) {
Nathan Yonkee 9:d58e77ebd769 309 value = 0.0f;
Nathan Yonkee 9:d58e77ebd769 310 } else if (value > 1.0f) {
Nathan Yonkee 9:d58e77ebd769 311 value = 1.0f;
Nathan Yonkee 9:d58e77ebd769 312 } else {
Nathan Yonkee 9:d58e77ebd769 313 // Do Nothing
Nathan Yonkee 9:d58e77ebd769 314 }
Nathan Yonkee 9:d58e77ebd769 315
Nathan Yonkee 9:d58e77ebd769 316 if (obj->ch == 2) {
Nathan Yonkee 9:d58e77ebd769 317 wk_cycle = PWMPWCYR_2 & 0x03ff;
Nathan Yonkee 9:d58e77ebd769 318 } else {
Nathan Yonkee 9:d58e77ebd769 319 wk_cycle = PWMPWCYR_1 & 0x03ff;
Nathan Yonkee 9:d58e77ebd769 320 }
Nathan Yonkee 9:d58e77ebd769 321
Nathan Yonkee 9:d58e77ebd769 322 // set channel match to percentage
Nathan Yonkee 9:d58e77ebd769 323 v = (uint16_t)((float)wk_cycle * value);
Nathan Yonkee 9:d58e77ebd769 324 *PWM_MATCH[obj->pwm] = (v | ((PORT[obj->pwm] & 1) << 12));
Nathan Yonkee 9:d58e77ebd769 325 #endif
Nathan Yonkee 9:d58e77ebd769 326 }
Nathan Yonkee 9:d58e77ebd769 327 }
Nathan Yonkee 9:d58e77ebd769 328
Nathan Yonkee 9:d58e77ebd769 329 float pwmout_read(pwmout_t* obj) {
Nathan Yonkee 9:d58e77ebd769 330 uint32_t wk_cycle;
Nathan Yonkee 9:d58e77ebd769 331 float value;
Nathan Yonkee 9:d58e77ebd769 332
Nathan Yonkee 9:d58e77ebd769 333 if (obj->pwm >= MTU2_PWM_OFFSET) {
Nathan Yonkee 9:d58e77ebd769 334 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 335 /* PWM by MTU2 */
Nathan Yonkee 9:d58e77ebd769 336 uint32_t wk_pulse;
Nathan Yonkee 9:d58e77ebd769 337 int tmp_pwm;
Nathan Yonkee 9:d58e77ebd769 338
Nathan Yonkee 9:d58e77ebd769 339 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
Nathan Yonkee 9:d58e77ebd769 340 wk_cycle = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] & 0xffff;
Nathan Yonkee 9:d58e77ebd769 341 wk_pulse = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PULSE] & 0xffff;
Nathan Yonkee 9:d58e77ebd769 342 value = ((float)wk_pulse / (float)wk_cycle);
Nathan Yonkee 9:d58e77ebd769 343 #endif
Nathan Yonkee 9:d58e77ebd769 344 } else {
Nathan Yonkee 9:d58e77ebd769 345 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 346 /* PWM */
Nathan Yonkee 9:d58e77ebd769 347 if (obj->ch == 2) {
Nathan Yonkee 9:d58e77ebd769 348 wk_cycle = PWMPWCYR_2 & 0x03ff;
Nathan Yonkee 9:d58e77ebd769 349 } else {
Nathan Yonkee 9:d58e77ebd769 350 wk_cycle = PWMPWCYR_1 & 0x03ff;
Nathan Yonkee 9:d58e77ebd769 351 }
Nathan Yonkee 9:d58e77ebd769 352 value = ((float)(*PWM_MATCH[obj->pwm] & 0x03ff) / (float)wk_cycle);
Nathan Yonkee 9:d58e77ebd769 353 #endif
Nathan Yonkee 9:d58e77ebd769 354 }
Nathan Yonkee 9:d58e77ebd769 355
Nathan Yonkee 9:d58e77ebd769 356 return (value > 1.0f) ? (1.0f) : (value);
Nathan Yonkee 9:d58e77ebd769 357 }
Nathan Yonkee 9:d58e77ebd769 358
Nathan Yonkee 9:d58e77ebd769 359 void pwmout_period(pwmout_t* obj, float seconds) {
Nathan Yonkee 9:d58e77ebd769 360 pwmout_period_us(obj, seconds * 1000000.0f);
Nathan Yonkee 9:d58e77ebd769 361 }
Nathan Yonkee 9:d58e77ebd769 362
Nathan Yonkee 9:d58e77ebd769 363 void pwmout_period_ms(pwmout_t* obj, int ms) {
Nathan Yonkee 9:d58e77ebd769 364 pwmout_period_us(obj, ms * 1000);
Nathan Yonkee 9:d58e77ebd769 365 }
Nathan Yonkee 9:d58e77ebd769 366
Nathan Yonkee 9:d58e77ebd769 367 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 368 static void set_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16_t new_cycle){
Nathan Yonkee 9:d58e77ebd769 369 uint16_t wk_pwmpbfr;
Nathan Yonkee 9:d58e77ebd769 370 float value;
Nathan Yonkee 9:d58e77ebd769 371 uint16_t v;
Nathan Yonkee 9:d58e77ebd769 372
Nathan Yonkee 9:d58e77ebd769 373 wk_pwmpbfr = *p_pwmpbfr;
Nathan Yonkee 9:d58e77ebd769 374 value = ((float)(wk_pwmpbfr & 0x03ff) / (float)last_cycle);
Nathan Yonkee 9:d58e77ebd769 375 v = (uint16_t)((float)new_cycle * value);
Nathan Yonkee 9:d58e77ebd769 376 *p_pwmpbfr = (v | (wk_pwmpbfr & 0x1000));
Nathan Yonkee 9:d58e77ebd769 377 }
Nathan Yonkee 9:d58e77ebd769 378 #endif
Nathan Yonkee 9:d58e77ebd769 379
Nathan Yonkee 9:d58e77ebd769 380 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 381 static void set_mtu2_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16_t new_cycle){
Nathan Yonkee 9:d58e77ebd769 382 uint16_t wk_pwmpbfr;
Nathan Yonkee 9:d58e77ebd769 383 float value;
Nathan Yonkee 9:d58e77ebd769 384
Nathan Yonkee 9:d58e77ebd769 385 wk_pwmpbfr = *p_pwmpbfr;
Nathan Yonkee 9:d58e77ebd769 386 value = ((float)(wk_pwmpbfr & 0xffff) / (float)last_cycle);
Nathan Yonkee 9:d58e77ebd769 387 *p_pwmpbfr = (uint16_t)((float)new_cycle * value);
Nathan Yonkee 9:d58e77ebd769 388 }
Nathan Yonkee 9:d58e77ebd769 389 #endif
Nathan Yonkee 9:d58e77ebd769 390
Nathan Yonkee 9:d58e77ebd769 391 // Set the PWM period, keeping the duty cycle the same.
Nathan Yonkee 9:d58e77ebd769 392 void pwmout_period_us(pwmout_t* obj, int us) {
Nathan Yonkee 9:d58e77ebd769 393 uint32_t pclk_base;
Nathan Yonkee 9:d58e77ebd769 394 uint32_t wk_cycle;
Nathan Yonkee 9:d58e77ebd769 395 uint32_t wk_cks = 0;
Nathan Yonkee 9:d58e77ebd769 396 uint16_t wk_last_cycle;
Nathan Yonkee 9:d58e77ebd769 397
Nathan Yonkee 9:d58e77ebd769 398 if (obj->pwm >= MTU2_PWM_OFFSET) {
Nathan Yonkee 9:d58e77ebd769 399 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 400 uint64_t wk_cycle_mtu2;
Nathan Yonkee 9:d58e77ebd769 401 int max_us = 0;
Nathan Yonkee 9:d58e77ebd769 402
Nathan Yonkee 9:d58e77ebd769 403 /* PWM by MTU2 */
Nathan Yonkee 9:d58e77ebd769 404 int tmp_pwm;
Nathan Yonkee 9:d58e77ebd769 405 uint8_t tmp_tcr_up;
Nathan Yonkee 9:d58e77ebd769 406 uint8_t tmp_tstr_sp;
Nathan Yonkee 9:d58e77ebd769 407 uint8_t tmp_tstr_st;
Nathan Yonkee 9:d58e77ebd769 408
Nathan Yonkee 9:d58e77ebd769 409 max_us = MAX_PERIOD[obj->ch];
Nathan Yonkee 9:d58e77ebd769 410 if (us > max_us) {
Nathan Yonkee 9:d58e77ebd769 411 us = max_us;
Nathan Yonkee 9:d58e77ebd769 412 } else if (us < 1) {
Nathan Yonkee 9:d58e77ebd769 413 us = 1;
Nathan Yonkee 9:d58e77ebd769 414 } else {
Nathan Yonkee 9:d58e77ebd769 415 // Do Nothing
Nathan Yonkee 9:d58e77ebd769 416 }
Nathan Yonkee 9:d58e77ebd769 417
Nathan Yonkee 9:d58e77ebd769 418 if (RZ_A1_IsClockMode0() == false) {
Nathan Yonkee 9:d58e77ebd769 419 pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK;
Nathan Yonkee 9:d58e77ebd769 420 } else {
Nathan Yonkee 9:d58e77ebd769 421 pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK;
Nathan Yonkee 9:d58e77ebd769 422 }
Nathan Yonkee 9:d58e77ebd769 423
Nathan Yonkee 9:d58e77ebd769 424 wk_cycle_mtu2 = (uint64_t)pclk_base * us;
Nathan Yonkee 9:d58e77ebd769 425 while (wk_cycle_mtu2 >= 65535000000) {
Nathan Yonkee 9:d58e77ebd769 426 if ((obj->ch == 1) && (wk_cks == 3)) {
Nathan Yonkee 9:d58e77ebd769 427 wk_cks+=2;
Nathan Yonkee 9:d58e77ebd769 428 } else if ((obj->ch == 2) && (wk_cks == 3)) {
Nathan Yonkee 9:d58e77ebd769 429 wk_cycle_mtu2 >>= 2;
Nathan Yonkee 9:d58e77ebd769 430 wk_cks+=3;
Nathan Yonkee 9:d58e77ebd769 431 }
Nathan Yonkee 9:d58e77ebd769 432 wk_cycle_mtu2 >>= 2;
Nathan Yonkee 9:d58e77ebd769 433 wk_cks++;
Nathan Yonkee 9:d58e77ebd769 434 }
Nathan Yonkee 9:d58e77ebd769 435 wk_cycle = (uint32_t)(wk_cycle_mtu2 / 1000000);
Nathan Yonkee 9:d58e77ebd769 436
Nathan Yonkee 9:d58e77ebd769 437 tmp_pwm = (int)(obj->pwm - MTU2_PWM_OFFSET);
Nathan Yonkee 9:d58e77ebd769 438 if (((uint8_t)MTU2_PORT[tmp_pwm] & 0x02) == 0x02) {
Nathan Yonkee 9:d58e77ebd769 439 tmp_tcr_up = 0xC0;
Nathan Yonkee 9:d58e77ebd769 440 } else {
Nathan Yonkee 9:d58e77ebd769 441 tmp_tcr_up = 0x40;
Nathan Yonkee 9:d58e77ebd769 442 }
Nathan Yonkee 9:d58e77ebd769 443 if ((obj->ch == 4) || (obj->ch == 3)) {
Nathan Yonkee 9:d58e77ebd769 444 tmp_tstr_sp = ~(0x38 | (1 << (obj->ch + 3)));
Nathan Yonkee 9:d58e77ebd769 445 tmp_tstr_st = (1 << (obj->ch + 3));
Nathan Yonkee 9:d58e77ebd769 446 } else {
Nathan Yonkee 9:d58e77ebd769 447 tmp_tstr_sp = ~(0x38 | (1 << obj->ch));
Nathan Yonkee 9:d58e77ebd769 448 tmp_tstr_st = (1 << obj->ch);
Nathan Yonkee 9:d58e77ebd769 449 }
Nathan Yonkee 9:d58e77ebd769 450 // Counter Stop
Nathan Yonkee 9:d58e77ebd769 451 MTU2TSTR &= tmp_tstr_sp;
Nathan Yonkee 9:d58e77ebd769 452 wk_last_cycle = *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] & 0xffff;
Nathan Yonkee 9:d58e77ebd769 453 *TCR_MATCH[obj->ch] = tmp_tcr_up | wk_cks;
Nathan Yonkee 9:d58e77ebd769 454 *TIORH_MATCH[obj->ch] = 0x21;
Nathan Yonkee 9:d58e77ebd769 455 if ((obj->ch == 0) || (obj->ch == 3) || (obj->ch == 4)) {
Nathan Yonkee 9:d58e77ebd769 456 *TIORL_MATCH[obj->ch] = 0x21;
Nathan Yonkee 9:d58e77ebd769 457 }
Nathan Yonkee 9:d58e77ebd769 458 *MTU2_PWM_MATCH[tmp_pwm][MTU2_PERIOD] = (uint16_t)wk_cycle; // Set period
Nathan Yonkee 9:d58e77ebd769 459
Nathan Yonkee 9:d58e77ebd769 460 // Set duty again(TGRA)
Nathan Yonkee 9:d58e77ebd769 461 set_mtu2_duty_again(TGRA_MATCH[obj->ch], wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 462 if ((obj->ch == 0) || (obj->ch == 3) || (obj->ch == 4)) {
Nathan Yonkee 9:d58e77ebd769 463 // Set duty again(TGRC)
Nathan Yonkee 9:d58e77ebd769 464 set_mtu2_duty_again(TGRC_MATCH[obj->ch], wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 465 }
Nathan Yonkee 9:d58e77ebd769 466 *TMDR_MATCH[obj->ch] = 0x02; // PWM mode 1
Nathan Yonkee 9:d58e77ebd769 467
Nathan Yonkee 9:d58e77ebd769 468 // Counter Start
Nathan Yonkee 9:d58e77ebd769 469 MTU2TSTR |= tmp_tstr_st;
Nathan Yonkee 9:d58e77ebd769 470 // Save for future use
Nathan Yonkee 9:d58e77ebd769 471 mtu2_period_ch[obj->ch] = us;
Nathan Yonkee 9:d58e77ebd769 472 #endif
Nathan Yonkee 9:d58e77ebd769 473 } else {
Nathan Yonkee 9:d58e77ebd769 474 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 475 /* PWM */
Nathan Yonkee 9:d58e77ebd769 476 if (us > 491) {
Nathan Yonkee 9:d58e77ebd769 477 us = 491;
Nathan Yonkee 9:d58e77ebd769 478 } else if (us < 1) {
Nathan Yonkee 9:d58e77ebd769 479 us = 1;
Nathan Yonkee 9:d58e77ebd769 480 } else {
Nathan Yonkee 9:d58e77ebd769 481 // Do Nothing
Nathan Yonkee 9:d58e77ebd769 482 }
Nathan Yonkee 9:d58e77ebd769 483
Nathan Yonkee 9:d58e77ebd769 484 if (RZ_A1_IsClockMode0() == false) {
Nathan Yonkee 9:d58e77ebd769 485 pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK / 10000;
Nathan Yonkee 9:d58e77ebd769 486 } else {
Nathan Yonkee 9:d58e77ebd769 487 pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK / 10000;
Nathan Yonkee 9:d58e77ebd769 488 }
Nathan Yonkee 9:d58e77ebd769 489
Nathan Yonkee 9:d58e77ebd769 490 wk_cycle = pclk_base * us;
Nathan Yonkee 9:d58e77ebd769 491 while (wk_cycle >= 102350) {
Nathan Yonkee 9:d58e77ebd769 492 wk_cycle >>= 1;
Nathan Yonkee 9:d58e77ebd769 493 wk_cks++;
Nathan Yonkee 9:d58e77ebd769 494 }
Nathan Yonkee 9:d58e77ebd769 495 wk_cycle = (wk_cycle + 50) / 100;
Nathan Yonkee 9:d58e77ebd769 496
Nathan Yonkee 9:d58e77ebd769 497 if (obj->ch == 2) {
Nathan Yonkee 9:d58e77ebd769 498 wk_last_cycle = PWMPWCYR_2 & 0x03ff;
Nathan Yonkee 9:d58e77ebd769 499 PWMPWCR_2 = 0xc0 | wk_cks;
Nathan Yonkee 9:d58e77ebd769 500 PWMPWCYR_2 = (uint16_t)wk_cycle;
Nathan Yonkee 9:d58e77ebd769 501
Nathan Yonkee 9:d58e77ebd769 502 // Set duty again
Nathan Yonkee 9:d58e77ebd769 503 set_duty_again(&PWMPWBFR_2A, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 504 set_duty_again(&PWMPWBFR_2C, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 505 set_duty_again(&PWMPWBFR_2E, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 506 set_duty_again(&PWMPWBFR_2G, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 507
Nathan Yonkee 9:d58e77ebd769 508 // Counter Start
Nathan Yonkee 9:d58e77ebd769 509 PWMPWCR_2 |= 0x08;
Nathan Yonkee 9:d58e77ebd769 510
Nathan Yonkee 9:d58e77ebd769 511 // Save for future use
Nathan Yonkee 9:d58e77ebd769 512 period_ch2 = us;
Nathan Yonkee 9:d58e77ebd769 513 } else {
Nathan Yonkee 9:d58e77ebd769 514 wk_last_cycle = PWMPWCYR_1 & 0x03ff;
Nathan Yonkee 9:d58e77ebd769 515 PWMPWCR_1 = 0xc0 | wk_cks;
Nathan Yonkee 9:d58e77ebd769 516 PWMPWCYR_1 = (uint16_t)wk_cycle;
Nathan Yonkee 9:d58e77ebd769 517
Nathan Yonkee 9:d58e77ebd769 518 // Set duty again
Nathan Yonkee 9:d58e77ebd769 519 set_duty_again(&PWMPWBFR_1A, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 520 set_duty_again(&PWMPWBFR_1C, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 521 set_duty_again(&PWMPWBFR_1E, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 522 set_duty_again(&PWMPWBFR_1G, wk_last_cycle, wk_cycle);
Nathan Yonkee 9:d58e77ebd769 523
Nathan Yonkee 9:d58e77ebd769 524 // Counter Start
Nathan Yonkee 9:d58e77ebd769 525 PWMPWCR_1 |= 0x08;
Nathan Yonkee 9:d58e77ebd769 526
Nathan Yonkee 9:d58e77ebd769 527 // Save for future use
Nathan Yonkee 9:d58e77ebd769 528 period_ch1 = us;
Nathan Yonkee 9:d58e77ebd769 529 }
Nathan Yonkee 9:d58e77ebd769 530 #endif
Nathan Yonkee 9:d58e77ebd769 531 }
Nathan Yonkee 9:d58e77ebd769 532 }
Nathan Yonkee 9:d58e77ebd769 533
Nathan Yonkee 9:d58e77ebd769 534 void pwmout_pulsewidth(pwmout_t* obj, float seconds) {
Nathan Yonkee 9:d58e77ebd769 535 pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
Nathan Yonkee 9:d58e77ebd769 536 }
Nathan Yonkee 9:d58e77ebd769 537
Nathan Yonkee 9:d58e77ebd769 538 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
Nathan Yonkee 9:d58e77ebd769 539 pwmout_pulsewidth_us(obj, ms * 1000);
Nathan Yonkee 9:d58e77ebd769 540 }
Nathan Yonkee 9:d58e77ebd769 541
Nathan Yonkee 9:d58e77ebd769 542 void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
Nathan Yonkee 9:d58e77ebd769 543 float value = 0;
Nathan Yonkee 9:d58e77ebd769 544
Nathan Yonkee 9:d58e77ebd769 545 if (obj->pwm >= MTU2_PWM_OFFSET) {
Nathan Yonkee 9:d58e77ebd769 546 #ifdef FUMC_MTU2_PWM
Nathan Yonkee 9:d58e77ebd769 547 /* PWM by MTU2 */
Nathan Yonkee 9:d58e77ebd769 548 if (mtu2_period_ch[obj->ch] != 0) {
Nathan Yonkee 9:d58e77ebd769 549 value = (float)us / (float)mtu2_period_ch[obj->ch];
Nathan Yonkee 9:d58e77ebd769 550 }
Nathan Yonkee 9:d58e77ebd769 551 #endif
Nathan Yonkee 9:d58e77ebd769 552 } else {
Nathan Yonkee 9:d58e77ebd769 553 #ifdef FUNC_MOTOR_CTL_PWM
Nathan Yonkee 9:d58e77ebd769 554 /* PWM */
Nathan Yonkee 9:d58e77ebd769 555 if (obj->ch == 2) {
Nathan Yonkee 9:d58e77ebd769 556 if (period_ch2 != 0) {
Nathan Yonkee 9:d58e77ebd769 557 value = (float)us / (float)period_ch2;
Nathan Yonkee 9:d58e77ebd769 558 }
Nathan Yonkee 9:d58e77ebd769 559 } else {
Nathan Yonkee 9:d58e77ebd769 560 if (period_ch1 != 0) {
Nathan Yonkee 9:d58e77ebd769 561 value = (float)us / (float)period_ch1;
Nathan Yonkee 9:d58e77ebd769 562 }
Nathan Yonkee 9:d58e77ebd769 563 }
Nathan Yonkee 9:d58e77ebd769 564 #endif
Nathan Yonkee 9:d58e77ebd769 565 }
Nathan Yonkee 9:d58e77ebd769 566 pwmout_write(obj, value);
Nathan Yonkee 9:d58e77ebd769 567 }