![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
CQ_KIT_Ver1_5
Dependencies: mbed RateLimiter BLDCmotorDriverCQ_KIT_Ver1_5
X_NUCLEO_IHM07M1/SPN7Driver.cpp@2:4ae769d0b112, 2016-10-12 (annotated)
- Committer:
- avilei
- Date:
- Wed Oct 12 13:15:03 2016 +0000
- Revision:
- 2:4ae769d0b112
- Child:
- 3:4c71d3475814
Initial release of the HelloWorld_IHM07M1 example application
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
avilei | 2:4ae769d0b112 | 1 | /* mbed Microcontroller Library |
avilei | 2:4ae769d0b112 | 2 | * Copyright (c) 2006-2016 ARM Limited |
avilei | 2:4ae769d0b112 | 3 | * |
avilei | 2:4ae769d0b112 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
avilei | 2:4ae769d0b112 | 5 | * you may not use this file except in compliance with the License. |
avilei | 2:4ae769d0b112 | 6 | * You may obtain a copy of the License at |
avilei | 2:4ae769d0b112 | 7 | * |
avilei | 2:4ae769d0b112 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
avilei | 2:4ae769d0b112 | 9 | * |
avilei | 2:4ae769d0b112 | 10 | * Unless required by applicable law or agreed to in writing, software |
avilei | 2:4ae769d0b112 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
avilei | 2:4ae769d0b112 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
avilei | 2:4ae769d0b112 | 13 | * See the License for the specific language governing permissions and |
avilei | 2:4ae769d0b112 | 14 | * limitations under the License. |
avilei | 2:4ae769d0b112 | 15 | */ |
avilei | 2:4ae769d0b112 | 16 | |
avilei | 2:4ae769d0b112 | 17 | /** |
avilei | 2:4ae769d0b112 | 18 | ****************************************************************************** |
avilei | 2:4ae769d0b112 | 19 | * @file SPN7Driver.cpp |
avilei | 2:4ae769d0b112 | 20 | * @author STMicroelectronics |
avilei | 2:4ae769d0b112 | 21 | * @brief Implementation of SPN7Driver class |
avilei | 2:4ae769d0b112 | 22 | ****************************************************************************** |
avilei | 2:4ae769d0b112 | 23 | * @copy |
avilei | 2:4ae769d0b112 | 24 | * |
avilei | 2:4ae769d0b112 | 25 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS |
avilei | 2:4ae769d0b112 | 26 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE |
avilei | 2:4ae769d0b112 | 27 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY |
avilei | 2:4ae769d0b112 | 28 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING |
avilei | 2:4ae769d0b112 | 29 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE |
avilei | 2:4ae769d0b112 | 30 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. |
avilei | 2:4ae769d0b112 | 31 | * |
avilei | 2:4ae769d0b112 | 32 | * <h2><center>© COPYRIGHT 2016 STMicroelectronics</center></h2> |
avilei | 2:4ae769d0b112 | 33 | */ |
avilei | 2:4ae769d0b112 | 34 | |
avilei | 2:4ae769d0b112 | 35 | #include "mbed.h" |
avilei | 2:4ae769d0b112 | 36 | #include "SPN7Driver.h" |
avilei | 2:4ae769d0b112 | 37 | |
avilei | 2:4ae769d0b112 | 38 | // FIXME: add doxygen |
avilei | 2:4ae769d0b112 | 39 | |
avilei | 2:4ae769d0b112 | 40 | SPN7Driver::SPN7Driver(PinName pIN1, PinName pIN2, PinName pIN3, |
avilei | 2:4ae769d0b112 | 41 | PinName pEN1, PinName pEN2, PinName pEN3, |
avilei | 2:4ae769d0b112 | 42 | PinName pH1, PinName pH2, PinName pH3, |
avilei | 2:4ae769d0b112 | 43 | PinName pFault) : |
avilei | 2:4ae769d0b112 | 44 | BLDCmotorDriver(pIN1, pIN2, pIN3, |
avilei | 2:4ae769d0b112 | 45 | pEN1, pEN2, pEN3, |
avilei | 2:4ae769d0b112 | 46 | pH1, pH2, pH3, |
avilei | 2:4ae769d0b112 | 47 | pFault) |
avilei | 2:4ae769d0b112 | 48 | { |
avilei | 2:4ae769d0b112 | 49 | // The BLDCmotorDriver class was implemented for half-bridge drivers |
avilei | 2:4ae769d0b112 | 50 | // so the pin names may be misleading when referring to the L6230 chip. |
avilei | 2:4ae769d0b112 | 51 | // Get a reference of each input pin and call them INx (logic input) |
avilei | 2:4ae769d0b112 | 52 | // to be consistent with the terminology used in the L6230 documentation. |
avilei | 2:4ae769d0b112 | 53 | PwmOut& IN1 = GH_A; |
avilei | 2:4ae769d0b112 | 54 | PwmOut& IN2 = GH_B; |
avilei | 2:4ae769d0b112 | 55 | PwmOut& IN3 = GH_C; |
avilei | 2:4ae769d0b112 | 56 | |
avilei | 2:4ae769d0b112 | 57 | // Set the switching period of the INx logic input pins (PWM driven) |
avilei | 2:4ae769d0b112 | 58 | IN1.period(switchingPeriod); |
avilei | 2:4ae769d0b112 | 59 | IN2.period(switchingPeriod); |
avilei | 2:4ae769d0b112 | 60 | IN3.period(switchingPeriod); |
avilei | 2:4ae769d0b112 | 61 | |
avilei | 2:4ae769d0b112 | 62 | // Set the step commutation function (triggered by the Hall sensors) |
avilei | 2:4ae769d0b112 | 63 | H1.rise(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 64 | H2.rise(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 65 | H3.rise(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 66 | H1.fall(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 67 | H2.fall(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 68 | H3.fall(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 69 | } |
avilei | 2:4ae769d0b112 | 70 | |
avilei | 2:4ae769d0b112 | 71 | // 6-step phase commutation |
avilei | 2:4ae769d0b112 | 72 | // |
avilei | 2:4ae769d0b112 | 73 | // Positive dutycycle: |
avilei | 2:4ae769d0b112 | 74 | // 1--X--0--0--X--1 |
avilei | 2:4ae769d0b112 | 75 | // X--1--1--X--0--0 |
avilei | 2:4ae769d0b112 | 76 | // 0--0--X--1--1--X |
avilei | 2:4ae769d0b112 | 77 | // |
avilei | 2:4ae769d0b112 | 78 | // Negative dutycycle: |
avilei | 2:4ae769d0b112 | 79 | // 1--1--X--0--0--X |
avilei | 2:4ae769d0b112 | 80 | // 0--X--1--1--X--0 |
avilei | 2:4ae769d0b112 | 81 | // X--0--0--X--1--1 |
avilei | 2:4ae769d0b112 | 82 | void SPN7Driver::commutation() |
avilei | 2:4ae769d0b112 | 83 | { |
avilei | 2:4ae769d0b112 | 84 | // The BLDCmotorDriver class was implemented for half-bridge drivers |
avilei | 2:4ae769d0b112 | 85 | // so the pin names may be misleading when referring to the L6230 chip. |
avilei | 2:4ae769d0b112 | 86 | |
avilei | 2:4ae769d0b112 | 87 | // Get a reference of each input pin and call them INx (logic input) |
avilei | 2:4ae769d0b112 | 88 | // to be consistent with the terminology used in the L6230 documentation. |
avilei | 2:4ae769d0b112 | 89 | PwmOut& IN1 = GH_A; |
avilei | 2:4ae769d0b112 | 90 | PwmOut& IN2 = GH_B; |
avilei | 2:4ae769d0b112 | 91 | PwmOut& IN3 = GH_C; |
avilei | 2:4ae769d0b112 | 92 | // Get a reference of each enable pin and call them ENx (enable channel) |
avilei | 2:4ae769d0b112 | 93 | // to be consistent with the terminology used in the L6230 documentation. |
avilei | 2:4ae769d0b112 | 94 | DigitalOut& EN1 = GL_A; |
avilei | 2:4ae769d0b112 | 95 | DigitalOut& EN2 = GL_B; |
avilei | 2:4ae769d0b112 | 96 | DigitalOut& EN3 = GL_C; |
avilei | 2:4ae769d0b112 | 97 | |
avilei | 2:4ae769d0b112 | 98 | dutyCycle = rl.out(tempDutyCycle); |
avilei | 2:4ae769d0b112 | 99 | currentSector = getSector(); |
avilei | 2:4ae769d0b112 | 100 | |
avilei | 2:4ae769d0b112 | 101 | if (dutyCycle > 0 ) { |
avilei | 2:4ae769d0b112 | 102 | // Positive dutycycle |
avilei | 2:4ae769d0b112 | 103 | currentSector++; |
avilei | 2:4ae769d0b112 | 104 | |
avilei | 2:4ae769d0b112 | 105 | if(currentSector > 5) currentSector = 0; |
avilei | 2:4ae769d0b112 | 106 | |
avilei | 2:4ae769d0b112 | 107 | switch(currentSector) { |
avilei | 2:4ae769d0b112 | 108 | case 0: |
avilei | 2:4ae769d0b112 | 109 | EN1 = 1; IN1 = dutyCycle; |
avilei | 2:4ae769d0b112 | 110 | EN2 = 0; IN2 = 0; |
avilei | 2:4ae769d0b112 | 111 | EN3 = 1; IN3 = 0; |
avilei | 2:4ae769d0b112 | 112 | break; |
avilei | 2:4ae769d0b112 | 113 | case 1: |
avilei | 2:4ae769d0b112 | 114 | EN1 = 0; IN1= 0; |
avilei | 2:4ae769d0b112 | 115 | EN2 = 1; IN2 = dutyCycle; |
avilei | 2:4ae769d0b112 | 116 | EN3 = 1; IN3 = 0; |
avilei | 2:4ae769d0b112 | 117 | break; |
avilei | 2:4ae769d0b112 | 118 | case 2: |
avilei | 2:4ae769d0b112 | 119 | EN1 = 1; IN1 = 0; |
avilei | 2:4ae769d0b112 | 120 | EN2 = 1; IN2 = dutyCycle; |
avilei | 2:4ae769d0b112 | 121 | EN3 = 0; IN3 = 0; |
avilei | 2:4ae769d0b112 | 122 | break; |
avilei | 2:4ae769d0b112 | 123 | case 3: |
avilei | 2:4ae769d0b112 | 124 | EN1 = 1; IN1 = 0; |
avilei | 2:4ae769d0b112 | 125 | EN2 = 0; IN2 = 0; |
avilei | 2:4ae769d0b112 | 126 | EN3 = 1; IN3 = dutyCycle; |
avilei | 2:4ae769d0b112 | 127 | break; |
avilei | 2:4ae769d0b112 | 128 | case 4: |
avilei | 2:4ae769d0b112 | 129 | EN1 = 0; IN1 = 0; |
avilei | 2:4ae769d0b112 | 130 | EN2 = 1; IN2 = 0; |
avilei | 2:4ae769d0b112 | 131 | EN3 = 1; IN3 = dutyCycle; |
avilei | 2:4ae769d0b112 | 132 | break; |
avilei | 2:4ae769d0b112 | 133 | case 5: |
avilei | 2:4ae769d0b112 | 134 | EN1 = 1; IN1 = dutyCycle; |
avilei | 2:4ae769d0b112 | 135 | EN2 = 1; IN2 = 0; |
avilei | 2:4ae769d0b112 | 136 | EN3 = 0; IN3 = 0; |
avilei | 2:4ae769d0b112 | 137 | break; |
avilei | 2:4ae769d0b112 | 138 | } |
avilei | 2:4ae769d0b112 | 139 | } else if (dutyCycle < 0) { |
avilei | 2:4ae769d0b112 | 140 | // Negative dutycycle |
avilei | 2:4ae769d0b112 | 141 | currentSector--; |
avilei | 2:4ae769d0b112 | 142 | |
avilei | 2:4ae769d0b112 | 143 | if(currentSector < 0) currentSector = 5; |
avilei | 2:4ae769d0b112 | 144 | |
avilei | 2:4ae769d0b112 | 145 | switch(currentSector) { |
avilei | 2:4ae769d0b112 | 146 | case 0: |
avilei | 2:4ae769d0b112 | 147 | EN1 = 1; IN1 = 0; |
avilei | 2:4ae769d0b112 | 148 | EN2 = 0; IN2=0; |
avilei | 2:4ae769d0b112 | 149 | EN3 = 1; IN3 = -dutyCycle; |
avilei | 2:4ae769d0b112 | 150 | break; |
avilei | 2:4ae769d0b112 | 151 | case 1: |
avilei | 2:4ae769d0b112 | 152 | EN1 = 0; IN1=0; |
avilei | 2:4ae769d0b112 | 153 | EN2 = 1; IN2 = 0; |
avilei | 2:4ae769d0b112 | 154 | EN3 = 1; IN3 = -dutyCycle; |
avilei | 2:4ae769d0b112 | 155 | break; |
avilei | 2:4ae769d0b112 | 156 | case 2: |
avilei | 2:4ae769d0b112 | 157 | EN1 = 1; IN1 = -dutyCycle; |
avilei | 2:4ae769d0b112 | 158 | EN2 = 1; IN2 = 0; |
avilei | 2:4ae769d0b112 | 159 | EN3 = 0; IN3= 0; |
avilei | 2:4ae769d0b112 | 160 | break; |
avilei | 2:4ae769d0b112 | 161 | case 3: |
avilei | 2:4ae769d0b112 | 162 | EN1 = 1; IN1 = -dutyCycle; |
avilei | 2:4ae769d0b112 | 163 | EN2 = 0; IN2 = 0; |
avilei | 2:4ae769d0b112 | 164 | EN3 = 1; IN3 = 0; |
avilei | 2:4ae769d0b112 | 165 | break; |
avilei | 2:4ae769d0b112 | 166 | case 4: |
avilei | 2:4ae769d0b112 | 167 | EN1 = 0; IN1= 0; |
avilei | 2:4ae769d0b112 | 168 | EN2 = 1; IN2 = -dutyCycle; |
avilei | 2:4ae769d0b112 | 169 | EN3 = 1; IN3 = 0; |
avilei | 2:4ae769d0b112 | 170 | break; |
avilei | 2:4ae769d0b112 | 171 | case 5: |
avilei | 2:4ae769d0b112 | 172 | EN1 = 1; IN1 = 0; |
avilei | 2:4ae769d0b112 | 173 | EN2 = 1; IN2 = -dutyCycle; |
avilei | 2:4ae769d0b112 | 174 | EN3 = 0; IN3=0; |
avilei | 2:4ae769d0b112 | 175 | break; |
avilei | 2:4ae769d0b112 | 176 | } |
avilei | 2:4ae769d0b112 | 177 | |
avilei | 2:4ae769d0b112 | 178 | } else { |
avilei | 2:4ae769d0b112 | 179 | coast(); |
avilei | 2:4ae769d0b112 | 180 | } |
avilei | 2:4ae769d0b112 | 181 | |
avilei | 2:4ae769d0b112 | 182 | } |