189 lines
5.0 KiB
C
189 lines
5.0 KiB
C
/****************************************************************************
|
|
* boards/arm/stm32/nucleo-f446re/src/stm32_foc_ihm08m1.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_ihm08m1.h"
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
#define CURRENT_SAMPLE_TIME ADC_SMPR_15
|
|
#define VBUS_SAMPLE_TIME ADC_SMPR_15
|
|
#define POT_SAMPLE_TIME ADC_SMPR_15
|
|
|
|
/* ADC1 channels used in this example */
|
|
|
|
#define ADC1_INJECTED (CONFIG_MOTOR_FOC_SHUNTS)
|
|
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_VBUS
|
|
# define IHM08M1_VBUS 1
|
|
#else
|
|
# define IHM08M1_VBUS 0
|
|
#endif
|
|
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_POT
|
|
# define IHM08M1_POT 1
|
|
#else
|
|
# define IHM08M1_POT 0
|
|
#endif
|
|
|
|
#define ADC1_REGULAR (IHM08M1_VBUS + IHM08M1_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_IN0 (PA0)
|
|
* - Current Phase U -> ADC1 INJ2 -> ADC1_IN11 (PC1)
|
|
* - Current Phase W -> ADC1 INJ3 -> ADC1_IN10 (PC0)
|
|
* optional:
|
|
* - VBUS -> ADC1 REG -> ADC1_IN1 (PA1)
|
|
* - POT -> ADC1 REG -> ADC1_IN4 (PA4)
|
|
*
|
|
* TIM1 PWM configuration:
|
|
* - Phase U high -> TIM1_CH1 (PA8)
|
|
* - Phase U low -> TIM1_CH1N (PA7)
|
|
* - Phase V high -> TIM1_CH2 (PA9)
|
|
* - Phase V low -> TIM1_CH2N (PB0)
|
|
* - Phase W high -> TIM1_CH3 (PA10)
|
|
* - Phase W low -> TIM1_CH3N (PB1)
|
|
*
|
|
*/
|
|
|
|
static uint8_t g_adc1_chan[] =
|
|
{
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_VBUS
|
|
1, /* ADC1 REG1 - VBUS */
|
|
#endif
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_POT
|
|
4, /* ADC1 REG - POT */
|
|
#endif
|
|
0, /* ADC1 INJ1 - PHASE 1 */
|
|
#if CONFIG_MOTOR_FOC_SHUNTS > 1
|
|
11, /* ADC1 INJ2 - PHASE 2 */
|
|
#endif
|
|
#if CONFIG_MOTOR_FOC_SHUNTS > 2
|
|
10, /* ADC1 INJ3 - PHASE 3 */
|
|
#endif
|
|
};
|
|
|
|
static uint32_t g_adc1_pins[] =
|
|
{
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_VBUS
|
|
GPIO_ADC1_IN1,
|
|
#endif
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_POT
|
|
GPIO_ADC1_IN4,
|
|
#endif
|
|
GPIO_ADC1_IN0,
|
|
#if CONFIG_MOTOR_FOC_SHUNTS > 1
|
|
GPIO_ADC1_IN11,
|
|
#endif
|
|
#if CONFIG_MOTOR_FOC_SHUNTS > 2
|
|
GPIO_ADC1_IN10
|
|
#endif
|
|
};
|
|
|
|
/* ADC1 sample time configuration */
|
|
|
|
static adc_channel_t g_adc1_stime[] =
|
|
{
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_VBUS
|
|
{
|
|
.channel = 1,
|
|
.sample_time = VBUS_SAMPLE_TIME
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_BOARD_STM32_IHM08M1_POT
|
|
{
|
|
.channel = 4,
|
|
.sample_time = POT_SAMPLE_TIME
|
|
},
|
|
#endif
|
|
{
|
|
.channel = 0,
|
|
.sample_time = CURRENT_SAMPLE_TIME
|
|
},
|
|
#if CONFIG_MOTOR_FOC_SHUNTS > 1
|
|
{
|
|
.channel = 11,
|
|
.sample_time = CURRENT_SAMPLE_TIME
|
|
},
|
|
#endif
|
|
#if CONFIG_MOTOR_FOC_SHUNTS > 2
|
|
{
|
|
.channel = 10,
|
|
.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_ihm08m1_initialize(&g_adc_cfg);
|
|
}
|