CQ_KIT_Ver1_5
Dependencies: mbed RateLimiter BLDCmotorDriverCQ_KIT_Ver1_5
X_NUCLEO_IHM07M1/SPN7Driver.cpp
- Committer:
- avilei
- Date:
- 2016-10-12
- Revision:
- 2:4ae769d0b112
- Child:
- 3:4c71d3475814
File content as of revision 2:4ae769d0b112:
/* mbed Microcontroller Library * Copyright (c) 2006-2016 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** ****************************************************************************** * @file SPN7Driver.cpp * @author STMicroelectronics * @brief Implementation of SPN7Driver class ****************************************************************************** * @copy * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * <h2><center>© COPYRIGHT 2016 STMicroelectronics</center></h2> */ #include "mbed.h" #include "SPN7Driver.h" // FIXME: add doxygen SPN7Driver::SPN7Driver(PinName pIN1, PinName pIN2, PinName pIN3, PinName pEN1, PinName pEN2, PinName pEN3, PinName pH1, PinName pH2, PinName pH3, PinName pFault) : BLDCmotorDriver(pIN1, pIN2, pIN3, pEN1, pEN2, pEN3, pH1, pH2, pH3, pFault) { // The BLDCmotorDriver class was implemented for half-bridge drivers // so the pin names may be misleading when referring to the L6230 chip. // Get a reference of each input pin and call them INx (logic input) // to be consistent with the terminology used in the L6230 documentation. PwmOut& IN1 = GH_A; PwmOut& IN2 = GH_B; PwmOut& IN3 = GH_C; // Set the switching period of the INx logic input pins (PWM driven) IN1.period(switchingPeriod); IN2.period(switchingPeriod); IN3.period(switchingPeriod); // Set the step commutation function (triggered by the Hall sensors) H1.rise(this, &SPN7Driver::commutation); H2.rise(this, &SPN7Driver::commutation); H3.rise(this, &SPN7Driver::commutation); H1.fall(this, &SPN7Driver::commutation); H2.fall(this, &SPN7Driver::commutation); H3.fall(this, &SPN7Driver::commutation); } // 6-step phase commutation // // Positive dutycycle: // 1--X--0--0--X--1 // X--1--1--X--0--0 // 0--0--X--1--1--X // // Negative dutycycle: // 1--1--X--0--0--X // 0--X--1--1--X--0 // X--0--0--X--1--1 void SPN7Driver::commutation() { // The BLDCmotorDriver class was implemented for half-bridge drivers // so the pin names may be misleading when referring to the L6230 chip. // Get a reference of each input pin and call them INx (logic input) // to be consistent with the terminology used in the L6230 documentation. PwmOut& IN1 = GH_A; PwmOut& IN2 = GH_B; PwmOut& IN3 = GH_C; // Get a reference of each enable pin and call them ENx (enable channel) // to be consistent with the terminology used in the L6230 documentation. DigitalOut& EN1 = GL_A; DigitalOut& EN2 = GL_B; DigitalOut& EN3 = GL_C; dutyCycle = rl.out(tempDutyCycle); currentSector = getSector(); if (dutyCycle > 0 ) { // Positive dutycycle currentSector++; if(currentSector > 5) currentSector = 0; switch(currentSector) { case 0: EN1 = 1; IN1 = dutyCycle; EN2 = 0; IN2 = 0; EN3 = 1; IN3 = 0; break; case 1: EN1 = 0; IN1= 0; EN2 = 1; IN2 = dutyCycle; EN3 = 1; IN3 = 0; break; case 2: EN1 = 1; IN1 = 0; EN2 = 1; IN2 = dutyCycle; EN3 = 0; IN3 = 0; break; case 3: EN1 = 1; IN1 = 0; EN2 = 0; IN2 = 0; EN3 = 1; IN3 = dutyCycle; break; case 4: EN1 = 0; IN1 = 0; EN2 = 1; IN2 = 0; EN3 = 1; IN3 = dutyCycle; break; case 5: EN1 = 1; IN1 = dutyCycle; EN2 = 1; IN2 = 0; EN3 = 0; IN3 = 0; break; } } else if (dutyCycle < 0) { // Negative dutycycle currentSector--; if(currentSector < 0) currentSector = 5; switch(currentSector) { case 0: EN1 = 1; IN1 = 0; EN2 = 0; IN2=0; EN3 = 1; IN3 = -dutyCycle; break; case 1: EN1 = 0; IN1=0; EN2 = 1; IN2 = 0; EN3 = 1; IN3 = -dutyCycle; break; case 2: EN1 = 1; IN1 = -dutyCycle; EN2 = 1; IN2 = 0; EN3 = 0; IN3= 0; break; case 3: EN1 = 1; IN1 = -dutyCycle; EN2 = 0; IN2 = 0; EN3 = 1; IN3 = 0; break; case 4: EN1 = 0; IN1= 0; EN2 = 1; IN2 = -dutyCycle; EN3 = 1; IN3 = 0; break; case 5: EN1 = 1; IN1 = 0; EN2 = 1; IN2 = -dutyCycle; EN3 = 0; IN3=0; break; } } else { coast(); } }