CQ_KIT_Ver1_5

Dependencies:   mbed RateLimiter BLDCmotorDriverCQ_KIT_Ver1_5

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?

UserRevisionLine numberNew 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>&copy; 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 }