mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 16:59:28 +08:00
drivers/foc: add support for FOC power-stage driver
There are ICs available on the market that integrate various power inverter features. The driver for such a device must be tightly coupled to a FOC device as using it as a separate device doesn't make sense.
This commit is contained in:
@@ -28,6 +28,8 @@ Files supporting FOC can be found in the following locations:
|
|||||||
"Lower-half" FOC interface.
|
"Lower-half" FOC interface.
|
||||||
- ``drivers/motor/foc/foc_dev.c``.
|
- ``drivers/motor/foc/foc_dev.c``.
|
||||||
The generic "upper half" FOC driver.
|
The generic "upper half" FOC driver.
|
||||||
|
- ``drivers/motor/foc/foc_pwr.c``.
|
||||||
|
The generic power stage for FOC.
|
||||||
|
|
||||||
The majority of the functionality available to the application
|
The majority of the functionality available to the application
|
||||||
is implemented in driver ioctl calls. Supported ioctl commands:
|
is implemented in driver ioctl calls. Supported ioctl commands:
|
||||||
@@ -46,3 +48,8 @@ is implemented in driver ioctl calls. Supported ioctl commands:
|
|||||||
arg: ``struct foc_cfg_s`` pointer.
|
arg: ``struct foc_cfg_s`` pointer.
|
||||||
- ``MTRIOC_GET_INFO`` - Get the FOC device info,
|
- ``MTRIOC_GET_INFO`` - Get the FOC device info,
|
||||||
arg: ``struct foc_info_s`` pointer.
|
arg: ``struct foc_info_s`` pointer.
|
||||||
|
|
||||||
|
Additionally, board logic can implement:
|
||||||
|
|
||||||
|
- ``MTRIOC_SET_BOARDCFG`` - which returns the board specific FOC configuration
|
||||||
|
- ``MTRIOC_GET_BOARDCFG`` - which sets the board-specific FOC configuration
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ if(CONFIG_MOTOR_FOC)
|
|||||||
list(APPEND SRCS foc_dummy.c)
|
list(APPEND SRCS foc_dummy.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_MOTOR_FOC_FOCPWR)
|
||||||
|
list(APPEND SRCS foc_pwr.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
target_include_directories(drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(drivers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
target_sources(drivers PRIVATE ${SRCS})
|
target_sources(drivers PRIVATE ${SRCS})
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -38,4 +38,7 @@ config MOTOR_FOC_DUMMY
|
|||||||
---help---
|
---help---
|
||||||
Build a simulated lower-half FOC device
|
Build a simulated lower-half FOC device
|
||||||
|
|
||||||
|
config MOTOR_FOC_FOCPWR
|
||||||
|
bool
|
||||||
|
|
||||||
endif #MOTOR_FOC
|
endif #MOTOR_FOC
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ ifeq ($(CONFIG_MOTOR_FOC_DUMMY),y)
|
|||||||
CSRCS += foc_dummy.c
|
CSRCS += foc_dummy.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_MOTOR_FOC_FOCPWR),y)
|
||||||
|
CSRCS += foc_pwr.c
|
||||||
|
endif
|
||||||
|
|
||||||
# Include FOC driver build support
|
# Include FOC driver build support
|
||||||
|
|
||||||
DEPPATH += --dep-path motor$(DELIM)foc
|
DEPPATH += --dep-path motor$(DELIM)foc
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* drivers/motor/foc/foc_pwr.c
|
||||||
|
* Power-stage FOC logic
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <nuttx/motor/foc/foc_pwr.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: focpwr_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize the FOC common power-stage data
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* pwr - An instance of the FOC power-stage device
|
||||||
|
* devno - An instance number
|
||||||
|
* dev - An instance of the FOC device
|
||||||
|
* ops - power stage ops
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int focpwr_initialize(FAR struct focpwr_dev_s *pwr,
|
||||||
|
int devno,
|
||||||
|
FAR struct foc_dev_s *dev,
|
||||||
|
FAR struct focpwr_ops_s *ops)
|
||||||
|
{
|
||||||
|
DEBUGASSERT(ops->setup);
|
||||||
|
DEBUGASSERT(ops->shutdown);
|
||||||
|
DEBUGASSERT(ops->calibration);
|
||||||
|
DEBUGASSERT(ops->ioctl);
|
||||||
|
|
||||||
|
pwr->dev = dev;
|
||||||
|
pwr->devno = devno;
|
||||||
|
pwr->ops = ops;
|
||||||
|
|
||||||
|
/* Connet to FOC device */
|
||||||
|
|
||||||
|
dev->pwr = pwr;
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
@@ -30,6 +30,8 @@
|
|||||||
#include <nuttx/mutex.h>
|
#include <nuttx/mutex.h>
|
||||||
#include <nuttx/semaphore.h>
|
#include <nuttx/semaphore.h>
|
||||||
|
|
||||||
|
#include <nuttx/motor/foc/foc_pwr.h>
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <fixedmath.h>
|
#include <fixedmath.h>
|
||||||
@@ -46,6 +48,8 @@
|
|||||||
#define FOCDUTY_TO_FLOAT(d) (b16tof(d))
|
#define FOCDUTY_TO_FLOAT(d) (b16tof(d))
|
||||||
#define FOCDUTY_TO_FIXED16(d) (d)
|
#define FOCDUTY_TO_FIXED16(d) (d)
|
||||||
|
|
||||||
|
#define FOC_BOARDCFG_GAINLIST_LEN 4
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -133,6 +137,19 @@ struct foc_info_s
|
|||||||
struct foc_info_hw_s hw_cfg; /* Hardware specific informations */
|
struct foc_info_hw_s hw_cfg; /* Hardware specific informations */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* FOC board-specific configuration */
|
||||||
|
|
||||||
|
struct foc_set_boardcfg_s
|
||||||
|
{
|
||||||
|
int gain;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foc_get_boardcfg_s
|
||||||
|
{
|
||||||
|
int gain;
|
||||||
|
int gain_list[FOC_BOARDCFG_GAINLIST_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
/* FOC device upper-half */
|
/* FOC device upper-half */
|
||||||
|
|
||||||
struct foc_lower_s;
|
struct foc_lower_s;
|
||||||
@@ -160,6 +177,10 @@ struct foc_dev_s
|
|||||||
/* FOC device input/output data *******************************************/
|
/* FOC device input/output data *******************************************/
|
||||||
|
|
||||||
struct foc_state_s state; /* FOC device state */
|
struct foc_state_s state; /* FOC device state */
|
||||||
|
|
||||||
|
/* (Optional) FOC power-stage driver *************************************/
|
||||||
|
|
||||||
|
FAR struct focpwr_dev_s *pwr; /* FOC power-stage driver */
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* include/nuttx/motor/foc/foc_pwr.h
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __INCLUDE_NUTTX_MOTOR_FOC_FOC_PWR_H
|
||||||
|
#define __INCLUDE_NUTTX_MOTOR_FOC_FOC_PWR_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <nuttx/motor/foc/foc.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* FOC power-stage driver operations */
|
||||||
|
|
||||||
|
struct focpwr_dev_s;
|
||||||
|
struct focpwr_ops_s
|
||||||
|
{
|
||||||
|
CODE int (*setup)(FAR struct focpwr_dev_s *dev);
|
||||||
|
CODE int (*shutdown)(FAR struct focpwr_dev_s *dev);
|
||||||
|
CODE int (*calibration)(FAR struct focpwr_dev_s *dev, bool state);
|
||||||
|
CODE int (*ioctl)(FAR struct focpwr_dev_s *dev, int cmd,
|
||||||
|
unsigned long arg);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* FOC power-stage driver */
|
||||||
|
|
||||||
|
struct focpwr_dev_s
|
||||||
|
{
|
||||||
|
FAR struct foc_dev_s *dev;
|
||||||
|
FAR struct focpwr_ops_s *ops;
|
||||||
|
int devno;
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int focpwr_initialize(FAR struct focpwr_dev_s *pwr,
|
||||||
|
int devno,
|
||||||
|
FAR struct foc_dev_s *dev,
|
||||||
|
FAR struct focpwr_ops_s *ops);
|
||||||
|
|
||||||
|
#endif /* __INCLUDE_NUTTX_MOTOR_FOC_FOC_PWR_H */
|
||||||
@@ -53,5 +53,7 @@
|
|||||||
#define MTRIOC_CALIBRATE _MTRIOC(13)
|
#define MTRIOC_CALIBRATE _MTRIOC(13)
|
||||||
#define MTRIOC_SELFTEST _MTRIOC(14)
|
#define MTRIOC_SELFTEST _MTRIOC(14)
|
||||||
#define MTRIOC_SET_CALIBDATA _MTRIOC(15)
|
#define MTRIOC_SET_CALIBDATA _MTRIOC(15)
|
||||||
|
#define MTRIOC_SET_BOARDCFG _MTRIOC(16)
|
||||||
|
#define MTRIOC_GET_BOARDCFG _MTRIOC(17)
|
||||||
|
|
||||||
#endif /* __INCLUDE_NUTTX_MOTOR_MOTOR_IOCTL_H */
|
#endif /* __INCLUDE_NUTTX_MOTOR_MOTOR_IOCTL_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user