CQ_KIT_Ver1_5
Dependencies: mbed RateLimiter BLDCmotorDriverCQ_KIT_Ver1_5
X_NUCLEO_IHM07M1/SPN7Driver.cpp@3:4c71d3475814, 2016-10-13 (annotated)
- Committer:
- avilei
- Date:
- Thu Oct 13 15:48:50 2016 +0000
- Revision:
- 3:4c71d3475814
- Parent:
- 2:4ae769d0b112
- Child:
- 4:3f63eed73ad1
Improve commutation method
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 | 3:4c71d3475814 | 38 | typedef enum { |
avilei | 3:4c71d3475814 | 39 | ST_BLDC_LOW = 0, |
avilei | 3:4c71d3475814 | 40 | ST_BLDC_HIGH, |
avilei | 3:4c71d3475814 | 41 | ST_BLDC_OFF |
avilei | 3:4c71d3475814 | 42 | } st_bldc_status_t; |
avilei | 3:4c71d3475814 | 43 | |
avilei | 2:4ae769d0b112 | 44 | // FIXME: add doxygen |
avilei | 2:4ae769d0b112 | 45 | |
avilei | 2:4ae769d0b112 | 46 | SPN7Driver::SPN7Driver(PinName pIN1, PinName pIN2, PinName pIN3, |
avilei | 2:4ae769d0b112 | 47 | PinName pEN1, PinName pEN2, PinName pEN3, |
avilei | 2:4ae769d0b112 | 48 | PinName pH1, PinName pH2, PinName pH3, |
avilei | 2:4ae769d0b112 | 49 | PinName pFault) : |
avilei | 2:4ae769d0b112 | 50 | BLDCmotorDriver(pIN1, pIN2, pIN3, |
avilei | 2:4ae769d0b112 | 51 | pEN1, pEN2, pEN3, |
avilei | 2:4ae769d0b112 | 52 | pH1, pH2, pH3, |
avilei | 2:4ae769d0b112 | 53 | pFault) |
avilei | 2:4ae769d0b112 | 54 | { |
avilei | 2:4ae769d0b112 | 55 | // The BLDCmotorDriver class was implemented for half-bridge drivers |
avilei | 2:4ae769d0b112 | 56 | // so the pin names may be misleading when referring to the L6230 chip. |
avilei | 3:4c71d3475814 | 57 | // Get pointers to each input pin and call them IN[x] (logic input) |
avilei | 2:4ae769d0b112 | 58 | // to be consistent with the terminology used in the L6230 documentation. |
avilei | 3:4c71d3475814 | 59 | PwmOut* IN[3] = {&GH_A, &GH_B, &GH_C}; |
avilei | 3:4c71d3475814 | 60 | |
avilei | 2:4ae769d0b112 | 61 | // Set the switching period of the INx logic input pins (PWM driven) |
avilei | 3:4c71d3475814 | 62 | for (int i = 0; i < 3; i++) { |
avilei | 3:4c71d3475814 | 63 | IN[i]->period(switchingPeriod); |
avilei | 3:4c71d3475814 | 64 | } |
avilei | 2:4ae769d0b112 | 65 | |
avilei | 2:4ae769d0b112 | 66 | // Set the step commutation function (triggered by the Hall sensors) |
avilei | 2:4ae769d0b112 | 67 | H1.rise(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 68 | H2.rise(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 69 | H3.rise(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 70 | H1.fall(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 71 | H2.fall(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 72 | H3.fall(this, &SPN7Driver::commutation); |
avilei | 2:4ae769d0b112 | 73 | } |
avilei | 2:4ae769d0b112 | 74 | |
avilei | 2:4ae769d0b112 | 75 | // 6-step phase commutation |
avilei | 3:4c71d3475814 | 76 | void SPN7Driver::commutation() |
avilei | 3:4c71d3475814 | 77 | { |
avilei | 3:4c71d3475814 | 78 | // The BLDCmotorDriver class was implemented for half-bridge drivers |
avilei | 3:4c71d3475814 | 79 | // so the pin names may be misleading when referring to the L6230 chip. |
avilei | 3:4c71d3475814 | 80 | // Get pointers to each input pin and call them IN[x] (logic input) |
avilei | 3:4c71d3475814 | 81 | // to be consistent with the terminology used in the L6230 documentation. |
avilei | 3:4c71d3475814 | 82 | PwmOut* IN[3] = {&GH_A, &GH_B, &GH_C}; |
avilei | 3:4c71d3475814 | 83 | // Get pointers to each enable pin and call them ENx (enable channel) |
avilei | 3:4c71d3475814 | 84 | // to be consistent with the terminology used in the L6230 documentation. |
avilei | 3:4c71d3475814 | 85 | DigitalOut* EN[3] = {&GL_A, &GL_B, &GL_C}; |
avilei | 3:4c71d3475814 | 86 | |
avilei | 2:4ae769d0b112 | 87 | // 1--X--0--0--X--1 |
avilei | 2:4ae769d0b112 | 88 | // X--1--1--X--0--0 |
avilei | 3:4c71d3475814 | 89 | // 0--0--X--1--1--X |
avilei | 3:4c71d3475814 | 90 | st_bldc_status_t tab[6][3] = { |
avilei | 3:4c71d3475814 | 91 | {ST_BLDC_HIGH, ST_BLDC_OFF, ST_BLDC_LOW}, |
avilei | 3:4c71d3475814 | 92 | {ST_BLDC_OFF, ST_BLDC_HIGH, ST_BLDC_LOW}, |
avilei | 3:4c71d3475814 | 93 | {ST_BLDC_LOW, ST_BLDC_HIGH, ST_BLDC_OFF}, |
avilei | 3:4c71d3475814 | 94 | {ST_BLDC_LOW, ST_BLDC_OFF, ST_BLDC_HIGH}, |
avilei | 3:4c71d3475814 | 95 | {ST_BLDC_OFF, ST_BLDC_LOW, ST_BLDC_HIGH}, |
avilei | 3:4c71d3475814 | 96 | {ST_BLDC_HIGH, ST_BLDC_LOW, ST_BLDC_OFF}, |
avilei | 3:4c71d3475814 | 97 | }; |
avilei | 2:4ae769d0b112 | 98 | |
avilei | 2:4ae769d0b112 | 99 | dutyCycle = rl.out(tempDutyCycle); |
avilei | 2:4ae769d0b112 | 100 | currentSector = getSector(); |
avilei | 2:4ae769d0b112 | 101 | |
avilei | 3:4c71d3475814 | 102 | if (dutyCycle == 0) { |
avilei | 3:4c71d3475814 | 103 | // Stop the motor |
avilei | 2:4ae769d0b112 | 104 | coast(); |
avilei | 3:4c71d3475814 | 105 | return; |
avilei | 2:4ae769d0b112 | 106 | } |
avilei | 2:4ae769d0b112 | 107 | |
avilei | 3:4c71d3475814 | 108 | // Move to next sector (i.e. commute phase) |
avilei | 3:4c71d3475814 | 109 | if (dutyCycle > 0 ) { |
avilei | 3:4c71d3475814 | 110 | // Move forward |
avilei | 3:4c71d3475814 | 111 | currentSector++; |
avilei | 3:4c71d3475814 | 112 | if(currentSector > 5) currentSector = 0; |
avilei | 3:4c71d3475814 | 113 | } else { |
avilei | 3:4c71d3475814 | 114 | // Move backward |
avilei | 3:4c71d3475814 | 115 | currentSector--; |
avilei | 3:4c71d3475814 | 116 | if(currentSector < 0) currentSector = 5; |
avilei | 3:4c71d3475814 | 117 | } |
avilei | 3:4c71d3475814 | 118 | |
avilei | 3:4c71d3475814 | 119 | // Get the absolute value of the duty cycle for the PWM |
avilei | 3:4c71d3475814 | 120 | float d = (dutyCycle > 0) ? dutyCycle : -dutyCycle; |
avilei | 3:4c71d3475814 | 121 | |
avilei | 3:4c71d3475814 | 122 | // Update the logic inputs and the enable pins |
avilei | 3:4c71d3475814 | 123 | //printf("Commutation sector %d\n\r", currentSector); |
avilei | 3:4c71d3475814 | 124 | for (int i = 0; i < 3; i++) { |
avilei | 3:4c71d3475814 | 125 | *EN[i] = (tab[currentSector][i] == ST_BLDC_OFF) ? 0 : 1; |
avilei | 3:4c71d3475814 | 126 | *IN[i] = (tab[currentSector][i] == ST_BLDC_HIGH) ? d : 0; |
avilei | 3:4c71d3475814 | 127 | /* |
avilei | 3:4c71d3475814 | 128 | int ena = (tab[currentSector][i] == ST_BLDC_OFF) ? 0 : 1; |
avilei | 3:4c71d3475814 | 129 | float inp = (tab[currentSector][i] == ST_BLDC_HIGH) ? d : 0; |
avilei | 3:4c71d3475814 | 130 | printf("EN[%d] = %d, IN[%d] = %f\n\r", i, ena, i, inp); |
avilei | 3:4c71d3475814 | 131 | */ |
avilei | 3:4c71d3475814 | 132 | } |
avilei | 2:4ae769d0b112 | 133 | } |