nucleo-g431rb: add support for IHM16M1

This commit is contained in:
raiden00pl 2021-04-14 15:02:01 +02:00 committed by Xiang Xiao
parent 25240d9114
commit 0ada35faeb
8 changed files with 493 additions and 0 deletions

View File

@ -8,3 +8,62 @@ STATUS
======
2020-06-12: The basic NSH configuration is now functional.
Configurations
==============
ihm16m1_f32 and ihm16m1_b16:
----------------------------
These examples are dedicated for the X-NUCLEO-IHM16M1 expansion board
based on STSPIN830 driver for three-phase brushless DC motors.
X-NUCLEO-IHM16M1 must be configured to work with FOC and 3-shunt
resistors. See ST documentation for details.
Pin configuration for the X-NUCLEO-IHM16M1 (TIM1 configuration):
Board Function Chip Function Chip Pin Number
------------- ---------------- -----------------
Phase U high TIM1_CH1 PA8
Phase U enable GPIO_PB13 PB13
Phase V high TIM1_CH2 PA9
Phase V enable GPIO_PB14 PB14
Phase W high TIM1_CH3 PA10
Phase W enable GPIO_PB15 PB15
EN_FAULT GPIO_PB12 PB12
Current U GPIO_ADC1_IN2 PA1
Current V GPIO_ADC1_IN12 PB1
Current W GPIO_ADC1_IN15 PB0
Temperature ? PC4
VBUS GPIO_ADC1_IN1 PA0
BEMF1 (NU)
BEMF2 (NU)
BEMF3 (NU)
LED
+3V3 (CN7_16)
GND (CN7_20)
GPIO_BEMF (NU)
ENCO_A/HALL_H1
ENCO_B/HALL_H2
ENCO_Z/HALL_H3
GPIO1 (NU)
GPIO2 (NU)
GPIO3 (NU)
CPOUT (NU)
BKIN1 (NU)
POT GPIO_ADC1_IN8 PC2
CURR_REF (NU)
DAC (NU)
Current shunt resistance = 0.33
Current sense gain = -1.53 (inverted current)
Vbus sense gain = 9.31k/(9.31k+169k) = 0.0522124390107
Vbus min = 7V
Vbus max = 45V
Iout max = 1.5A RMS
IPHASE_RATIO = 1/(R_shunt*gain) = -1.98
VBUS_RATIO = 1/VBUS_gain = 16
For now only 3-shunt resistors configuration is supported.

View File

@ -0,0 +1,89 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
CONFIG_ADC=y
CONFIG_ADC_FIFOSIZE=3
CONFIG_ANALOG=y
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="nucleo-g431rb"
CONFIG_ARCH_BOARD_NUCLEO_G431RB=y
CONFIG_ARCH_BUTTONS=y
CONFIG_ARCH_CHIP="stm32"
CONFIG_ARCH_CHIP_STM32=y
CONFIG_ARCH_CHIP_STM32G431R=y
CONFIG_ARCH_INTERRUPTSTACK=1024
CONFIG_ARCH_IRQBUTTONS=y
CONFIG_ARMV7M_LIBM=y
CONFIG_BOARD_LOOPSPERMSEC=8499
CONFIG_BOARD_STM32_COMMON=y
CONFIG_BOARD_STM32_IHM16M1=y
CONFIG_BOARD_STM32_IHM16M1_POT=y
CONFIG_BOARD_STM32_IHM16M1_VBUS=y
CONFIG_BUILTIN=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEFAULT_SMALL=y
CONFIG_DEFAULT_TASK_STACKSIZE=1024
CONFIG_EXAMPLES_FOC=y
CONFIG_EXAMPLES_FOC_ADC_MAX=4095
CONFIG_EXAMPLES_FOC_ADC_VREF=3300
CONFIG_EXAMPLES_FOC_CONTROL_STACKSIZE=2048
CONFIG_EXAMPLES_FOC_FIXED16_INST=1
CONFIG_EXAMPLES_FOC_HAVE_BUTTON=y
CONFIG_EXAMPLES_FOC_IPHASE_ADC=-160
CONFIG_EXAMPLES_FOC_NOTIFIER_FREQ=10000
CONFIG_EXAMPLES_FOC_PWM_FREQ=20000
CONFIG_EXAMPLES_FOC_RAMP_ACC=1000000
CONFIG_EXAMPLES_FOC_RAMP_DEC=1000000
CONFIG_EXAMPLES_FOC_RAMP_THR=10000
CONFIG_EXAMPLES_FOC_VBUS_ADC=y
CONFIG_EXAMPLES_FOC_VBUS_SCALE=16000
CONFIG_EXAMPLES_FOC_VEL_ADC=y
CONFIG_INDUSTRY_FOC=y
CONFIG_INDUSTRY_FOC_FIXED16=y
CONFIG_INPUT=y
CONFIG_INPUT_BUTTONS=y
CONFIG_INPUT_BUTTONS_LOWER=y
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBM=y
CONFIG_MAX_TASKS=4
CONFIG_MOTOR=y
CONFIG_MOTOR_FOC=y
CONFIG_MOTOR_FOC_TRACE=y
CONFIG_MQ_MAXMSGSIZE=5
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAM_SIZE=22528
CONFIG_RAM_START=0x20000000
CONFIG_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_SDCLONE_DISABLE=y
CONFIG_START_DAY=14
CONFIG_START_MONTH=10
CONFIG_START_YEAR=2014
CONFIG_STM32_ADC1_ANIOC_TRIGGER=1
CONFIG_STM32_ADC1_DMA=y
CONFIG_STM32_ADC1_DMA_CFG=1
CONFIG_STM32_ADC1_INJECTED_CHAN=3
CONFIG_STM32_DMA1=y
CONFIG_STM32_DMA2=y
CONFIG_STM32_DMAMUX1=y
CONFIG_STM32_FOC=y
CONFIG_STM32_FOC_FOC0=y
CONFIG_STM32_JTAG_SW_ENABLE=y
CONFIG_STM32_TIM1_CH1MODE=0
CONFIG_STM32_TIM1_CH2MODE=0
CONFIG_STM32_TIM1_CH3MODE=0
CONFIG_STM32_TIM1_MODE=2
CONFIG_STM32_USART2=y
CONFIG_SYSTEM_NSH=y
CONFIG_TASK_NAME_SIZE=0
CONFIG_USART2_SERIAL_CONSOLE=y
CONFIG_USART2_TXDMA=y
CONFIG_USER_ENTRYPOINT="nsh_main"

View File

@ -0,0 +1,89 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
CONFIG_ADC=y
CONFIG_ADC_FIFOSIZE=3
CONFIG_ANALOG=y
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="nucleo-g431rb"
CONFIG_ARCH_BOARD_NUCLEO_G431RB=y
CONFIG_ARCH_BUTTONS=y
CONFIG_ARCH_CHIP="stm32"
CONFIG_ARCH_CHIP_STM32=y
CONFIG_ARCH_CHIP_STM32G431R=y
CONFIG_ARCH_INTERRUPTSTACK=1024
CONFIG_ARCH_IRQBUTTONS=y
CONFIG_ARMV7M_LIBM=y
CONFIG_BOARD_LOOPSPERMSEC=8499
CONFIG_BOARD_STM32_COMMON=y
CONFIG_BOARD_STM32_IHM16M1=y
CONFIG_BOARD_STM32_IHM16M1_POT=y
CONFIG_BOARD_STM32_IHM16M1_VBUS=y
CONFIG_BUILTIN=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEFAULT_SMALL=y
CONFIG_DEFAULT_TASK_STACKSIZE=1024
CONFIG_EXAMPLES_FOC=y
CONFIG_EXAMPLES_FOC_ADC_MAX=4095
CONFIG_EXAMPLES_FOC_ADC_VREF=3300
CONFIG_EXAMPLES_FOC_CONTROL_STACKSIZE=2048
CONFIG_EXAMPLES_FOC_FLOAT_INST=1
CONFIG_EXAMPLES_FOC_HAVE_BUTTON=y
CONFIG_EXAMPLES_FOC_IPHASE_ADC=-160
CONFIG_EXAMPLES_FOC_NOTIFIER_FREQ=10000
CONFIG_EXAMPLES_FOC_PWM_FREQ=20000
CONFIG_EXAMPLES_FOC_RAMP_ACC=1000000
CONFIG_EXAMPLES_FOC_RAMP_DEC=1000000
CONFIG_EXAMPLES_FOC_RAMP_THR=10000
CONFIG_EXAMPLES_FOC_VBUS_ADC=y
CONFIG_EXAMPLES_FOC_VBUS_SCALE=16000
CONFIG_EXAMPLES_FOC_VEL_ADC=y
CONFIG_INDUSTRY_FOC=y
CONFIG_INDUSTRY_FOC_FLOAT=y
CONFIG_INPUT=y
CONFIG_INPUT_BUTTONS=y
CONFIG_INPUT_BUTTONS_LOWER=y
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBM=y
CONFIG_MAX_TASKS=4
CONFIG_MOTOR=y
CONFIG_MOTOR_FOC=y
CONFIG_MOTOR_FOC_TRACE=y
CONFIG_MQ_MAXMSGSIZE=5
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAM_SIZE=22528
CONFIG_RAM_START=0x20000000
CONFIG_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_SDCLONE_DISABLE=y
CONFIG_START_DAY=14
CONFIG_START_MONTH=10
CONFIG_START_YEAR=2014
CONFIG_STM32_ADC1_ANIOC_TRIGGER=1
CONFIG_STM32_ADC1_DMA=y
CONFIG_STM32_ADC1_DMA_CFG=1
CONFIG_STM32_ADC1_INJECTED_CHAN=3
CONFIG_STM32_DMA1=y
CONFIG_STM32_DMA2=y
CONFIG_STM32_DMAMUX1=y
CONFIG_STM32_FOC=y
CONFIG_STM32_FOC_FOC0=y
CONFIG_STM32_JTAG_SW_ENABLE=y
CONFIG_STM32_TIM1_CH1MODE=0
CONFIG_STM32_TIM1_CH2MODE=0
CONFIG_STM32_TIM1_CH3MODE=0
CONFIG_STM32_TIM1_MODE=2
CONFIG_STM32_USART2=y
CONFIG_SYSTEM_NSH=y
CONFIG_TASK_NAME_SIZE=0
CONFIG_USART2_SERIAL_CONSOLE=y
CONFIG_USART2_TXDMA=y
CONFIG_USER_ENTRYPOINT="nsh_main"

View File

@ -242,4 +242,49 @@
#define ADC1_DMA_CHAN DMAMAP_DMA12_ADC1_0 /* DMA1 */
/* USART2 */
#define DMACHAN_USART2_TX DMAMAP_DMA12_USART2TX_0 /* DMA1 */
#define DMACHAN_USART2_RX DMAMAP_DMA12_USART2RX_0 /* DMA1 */
#ifdef CONFIG_BOARD_STM32_IHM16M1
/* Configuration specific for the X-NUCLEO-IHM16M1 expansion board with
* the STSPIN830 driver.
*/
/* TIM1 configuration *******************************************************/
# define GPIO_TIM1_CH1OUT GPIO_TIM1_CH1OUT_1 /* TIM1 CH1 - PA8 - U high */
# define GPIO_TIM1_CH2OUT GPIO_TIM1_CH2OUT_1 /* TIM1 CH2 - PA9 - V high */
# define GPIO_TIM1_CH3OUT GPIO_TIM1_CH3OUT_1 /* TIM1 CH3 - PA10 - W high */
# define GPIO_TIM1_CH4OUT 0 /* not used as output */
/* UVW ENABLE */
# define GPIO_FOC_EN_U (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN13)
# define GPIO_FOC_EN_V (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN14)
# define GPIO_FOC_EN_W (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN15)
/* EN_FAULT */
# define GPIO_FOC_ENFAULT (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN12)
/* Debug pins */
# define GPIO_FOC_DEBUG0 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN8)
# define GPIO_FOC_DEBUG1 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9)
# define GPIO_FOC_DEBUG2 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN6)
# define GPIO_FOC_DEBUG3 (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz| \
GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN12)
#endif /* CONFIG_BOARD_STM32_IHM16M1 */
#endif /* __BOARDS_ARM_STM32_NUCLEO_G431RB_INCLUDE_BOARD_H */

View File

@ -37,6 +37,7 @@ ifeq ($(CONFIG_LIB_BOARDCTL),y)
CSRCS += stm32_appinit.c
endif
ifneq ($(CONFIG_STM32_FOC),y)
ifeq ($(CONFIG_PWM),y)
CSRCS += stm32_pwm.c
endif
@ -44,6 +45,11 @@ endif
ifeq ($(CONFIG_ADC),y)
CSRCS += stm32_adc.c
endif
endif
ifeq ($(CONFIG_BOARD_STM32_IHM16M1),y)
CSRCS += stm32_foc_ihm16m1.c
endif
DEPPATH += --dep-path board
VPATH += :board

View File

@ -131,4 +131,16 @@ int stm32_pwm_setup(void);
int stm32_adc_setup(void);
#endif
/****************************************************************************
* Name: stm32_foc_setup
*
* Description:
* Initialize FOC peripheral for the board.
*
****************************************************************************/
#ifdef CONFIG_STM32_FOC
int stm32_foc_setup(void);
#endif
#endif /* __BOARDS_ARM_STM32_NUCLEO_G431RB_SRC_NUCLEO_G431RB_H */

View File

@ -102,6 +102,16 @@ int stm32_bringup(void)
}
#endif
#ifdef CONFIG_STM32_FOC
/* Initialize and register the FOC device - must be before ADC setup */
ret = stm32_foc_setup();
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: stm32_foc_setup failed: %d\n", ret);
}
#endif
#ifdef CONFIG_ADC
/* Initialize ADC and register the ADC driver. */

View File

@ -0,0 +1,183 @@
/****************************************************************************
* boards/arm/stm32/nucleo-g431rb/src/stm32_foc_ihm16m1.c
*
* 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 "stm32_ihm16m1.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define CURRENT_SAMPLE_TIME ADC_SMPR_24p5
#define VBUS_SAMPLE_TIME ADC_SMPR_640p5
#define POT_SAMPLE_TIME ADC_SMPR_640p5
/* ADC1 channels used in this example */
#define ADC1_INJECTED (CONFIG_MOTOR_FOC_SHUNTS)
#ifdef CONFIG_BOARD_STM32_IHM16M1_VBUS
# define IHM16M1_VBUS 1
#else
# define IHM16M1_VBUS 0
#endif
#ifdef CONFIG_BOARD_STM32_IHM16M1_POT
# define IHM16M1_POT 1
#else
# define IHM16M1_POT 0
#endif
#define ADC1_REGULAR (IHM16M1_VBUS + IHM16M1_POT)
#define ADC1_NCHANNELS (ADC1_INJECTED + ADC1_REGULAR)
/* Check ADC1 configuration */
#if ADC1_INJECTED != CONFIG_STM32_ADC1_INJECTED_CHAN
# error
#endif
#if CONFIG_STM32_ADC1_RESOLUTION != 0
# error
#endif
/****************************************************************************
* Private Data
****************************************************************************/
/* FOC ADC configration:
* - Current Phase V -> ADC1 INJ1 -> ADC1_IN2 (PA1)
* - Current Phase U -> ADC1 INJ2 -> ADC1_IN12 (PB1)
* - Current Phase W -> ADC1 INJ3 -> ADC1_IN15 (PB0)
* optional:
* - VBUS -> ADC1 REG -> ADC1_IN1 (PA0)
* - POT -> ADC1 REG -> ADC1_IN8 (PC2)
*
* TIM1 PWM configuration:
* - Phase U high -> TIM1_CH1 (PA8)
* - Phase V high -> TIM1_CH2 (PA9)
* - Phase W high -> TIM1_CH3 (PA10)
*
*/
static uint8_t g_adc1_chan[] =
{
#ifdef CONFIG_BOARD_STM32_IHM16M1_VBUS
1, /* ADC1 REG - VBUS */
#endif
#ifdef CONFIG_BOARD_STM32_IHM16M1_POT
8, /* ADC1 REG - POT */
#endif
2, /* ADC1 INJ1 - PHASE 1 */
#if CONFIG_MOTOR_FOC_SHUNTS == 3
12, /* ADC1 INJ2 - PHASE 2 */
15, /* ADC1 INJ3 - PHASE 3 */
#endif
};
static uint32_t g_adc1_pins[] =
{
#ifdef CONFIG_BOARD_STM32_IHM16M1_VBUS
GPIO_ADC1_IN1,
#endif
#ifdef CONFIG_BOARD_STM32_IHM16M1_POT
GPIO_ADC1_IN8,
#endif
GPIO_ADC1_IN2,
#if CONFIG_MOTOR_FOC_SHUNTS > 1
GPIO_ADC1_IN12,
#endif
#if CONFIG_MOTOR_FOC_SHUNTS > 2
GPIO_ADC1_IN15,
#endif
};
/* ADC1 sample time configuration */
static adc_channel_t g_adc1_stime[] =
{
#ifdef CONFIG_BOARD_STM32_IHM16M1_VBUS
{
.channel = 1,
.sample_time = VBUS_SAMPLE_TIME
},
#endif
#ifdef CONFIG_BOARD_STM32_IHM16M1_POT
{
.channel = 8,
.sample_time = POT_SAMPLE_TIME
},
#endif
{
.channel = 2,
.sample_time = CURRENT_SAMPLE_TIME
},
#if CONFIG_MOTOR_FOC_SHUNTS > 1
{
.channel = 12,
.sample_time = CURRENT_SAMPLE_TIME
},
#endif
#if CONFIG_MOTOR_FOC_SHUNTS > 2
{
.channel = 15,
.sample_time = CURRENT_SAMPLE_TIME
},
#endif
};
/* Board specific ADC configuration for FOC */
static struct stm32_foc_adc_s g_adc_cfg =
{
.chan = g_adc1_chan,
.pins = g_adc1_pins,
.stime = g_adc1_stime,
.nchan = ADC1_NCHANNELS,
.regch = ADC1_REGULAR,
.intf = 1
};
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: stm32_foc_setup
*
* Description:
* Initialize FOC driver.
*
* This function should be call by board_app_initialize().
*
* Returned Value:
* 0 on success, a negated errno value on failure
*
****************************************************************************/
int stm32_foc_setup(void)
{
return board_ihm16m1_initialize(&g_adc_cfg);
}