examples/foc: add Hall sensor support
This commit is contained in:
parent
c771942d8e
commit
5ee9572531
@ -88,6 +88,26 @@ config EXAMPLES_FOC_SENSORED
|
|||||||
|
|
||||||
endchoice #
|
endchoice #
|
||||||
|
|
||||||
|
if EXAMPLES_FOC_SENSORED
|
||||||
|
|
||||||
|
config EXAMPLES_FOC_HAVE_HALL
|
||||||
|
bool "FOC example Hall sensor support"
|
||||||
|
select INDUSTRY_FOC_ANGLE_HALL
|
||||||
|
default n
|
||||||
|
|
||||||
|
if EXAMPLES_FOC_HAVE_HALL
|
||||||
|
|
||||||
|
config EXAMPLES_FOC_HALL_DEVPATH
|
||||||
|
string "FOC example Hall sensor path prefix"
|
||||||
|
default "/dev/hall"
|
||||||
|
---help---
|
||||||
|
The default path to the Hall device without the device minor number.
|
||||||
|
Default: /dev/hall
|
||||||
|
|
||||||
|
endif # EXAMPLES_FOC_HAVE_HALL
|
||||||
|
|
||||||
|
endif # EXAMPLES_FOC_SENSORED
|
||||||
|
|
||||||
config EXAMPLES_FOC_HAVE_OPENLOOP
|
config EXAMPLES_FOC_HAVE_OPENLOOP
|
||||||
bool "FOC example have open-loop controller"
|
bool "FOC example have open-loop controller"
|
||||||
select INDUSTRY_FOC_ANGLE_OPENLOOP
|
select INDUSTRY_FOC_ANGLE_OPENLOOP
|
||||||
|
@ -31,10 +31,12 @@
|
|||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* For now only open-loop supported */
|
/* For now only torque mode supported for sensored */
|
||||||
|
|
||||||
#ifndef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
# error For now only open-loop supported
|
# ifndef CONFIG_EXAMPLES_FOC_HAVE_TORQ
|
||||||
|
# error
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For now only sensorless velocity control supported */
|
/* For now only sensorless velocity control supported */
|
||||||
|
@ -566,21 +566,19 @@ static int foc_motor_run(FAR struct foc_motor_b16_s *motor)
|
|||||||
DEBUGASSERT(motor);
|
DEBUGASSERT(motor);
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
||||||
# ifdef CONFIG_EXAMPLES_FOC_HAVE_VEL
|
|
||||||
/* Open-loop works only in velocity control mode */
|
/* Open-loop works only in velocity control mode */
|
||||||
|
|
||||||
if (motor->openloop_now == true)
|
if (motor->openloop_now == true)
|
||||||
{
|
{
|
||||||
|
# ifdef CONFIG_EXAMPLES_FOC_HAVE_VEL
|
||||||
if (motor->envp->mmode != FOC_MMODE_VEL)
|
if (motor->envp->mmode != FOC_MMODE_VEL)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
PRINTF("ERROR: open-loop only with FOC_MMODE_VEL\n");
|
PRINTF("ERROR: open-loop only with FOC_MMODE_VEL\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# else
|
|
||||||
# error
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Get previous DQ */
|
/* Get previous DQ */
|
||||||
@ -670,6 +668,9 @@ int foc_motor_init(FAR struct foc_motor_b16_s *motor,
|
|||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
||||||
struct foc_openloop_cfg_b16_s ol_cfg;
|
struct foc_openloop_cfg_b16_s ol_cfg;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
struct foc_hall_cfg_b16_s hl_cfg;
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
||||||
struct foc_routine_align_cfg_b16_s align_cfg;
|
struct foc_routine_align_cfg_b16_s align_cfg;
|
||||||
#endif
|
#endif
|
||||||
@ -703,6 +704,37 @@ int foc_motor_init(FAR struct foc_motor_b16_s *motor,
|
|||||||
foc_angle_cfg_b16(&motor->openloop, &ol_cfg);
|
foc_angle_cfg_b16(&motor->openloop, &ol_cfg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
/* Initialize hall angle handler */
|
||||||
|
|
||||||
|
ret = foc_angle_init_b16(&motor->hall,
|
||||||
|
&g_foc_angle_hl_b16);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
PRINTFV("ERROR: foc_angle_init_b16 failed %d!\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get hall devpath */
|
||||||
|
|
||||||
|
sprintf(motor->hldpath,
|
||||||
|
"%s%d",
|
||||||
|
CONFIG_EXAMPLES_FOC_HALL_DEVPATH,
|
||||||
|
motor->envp->id);
|
||||||
|
|
||||||
|
/* Configure hall angle handler */
|
||||||
|
|
||||||
|
hl_cfg.devpath = motor->hldpath;
|
||||||
|
hl_cfg.per = motor->per;
|
||||||
|
|
||||||
|
ret = foc_angle_cfg_b16(&motor->hall, &hl_cfg);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
PRINTFV("ERROR: foc_angle_cfg_b16 failed %d!\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
||||||
/* Initialize motor alignment routine */
|
/* Initialize motor alignment routine */
|
||||||
|
|
||||||
@ -724,9 +756,11 @@ int foc_motor_init(FAR struct foc_motor_b16_s *motor,
|
|||||||
align_cfg.cb.zero = foc_align_zero_cb;
|
align_cfg.cb.zero = foc_align_zero_cb;
|
||||||
align_cfg.cb.dir = foc_align_dir_cb;
|
align_cfg.cb.dir = foc_align_dir_cb;
|
||||||
|
|
||||||
/* TODO: Connect align callbacks private data */
|
/* Connect align callbacks private data */
|
||||||
|
|
||||||
align_cfg.cb.priv = NULL;
|
# ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
align_cfg.cb.priv = &motor->hall;
|
||||||
|
# endif
|
||||||
|
|
||||||
ret = foc_routine_cfg_b16(&motor->align, &align_cfg);
|
ret = foc_routine_cfg_b16(&motor->align, &align_cfg);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -740,7 +774,9 @@ int foc_motor_init(FAR struct foc_motor_b16_s *motor,
|
|||||||
|
|
||||||
motor->ctrl_state = FOC_CTRL_STATE_INIT;
|
motor->ctrl_state = FOC_CTRL_STATE_INIT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
errout:
|
errout:
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -810,6 +846,15 @@ int foc_motor_get(FAR struct foc_motor_b16_s *motor)
|
|||||||
motor->angle_ol = aout.angle;
|
motor->angle_ol = aout.angle;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
ret = foc_angle_run_b16(&motor->hall, &ain, &aout);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
PRINTF("ERROR: foc_angle_run failed %d\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
/* Handle angle from sensor */
|
/* Handle angle from sensor */
|
||||||
|
|
||||||
@ -861,7 +906,9 @@ int foc_motor_get(FAR struct foc_motor_b16_s *motor)
|
|||||||
/* TODO: velocity observer or sensor */
|
/* TODO: velocity observer or sensor */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
errout:
|
errout:
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +70,10 @@ struct foc_motor_b16_s
|
|||||||
bool openloop_now; /* Open-loop now */
|
bool openloop_now; /* Open-loop now */
|
||||||
b16_t angle_ol; /* Phase angle open-loop */
|
b16_t angle_ol; /* Phase angle open-loop */
|
||||||
foc_angle_b16_t openloop; /* Open-loop angle handler */
|
foc_angle_b16_t openloop; /* Open-loop angle handler */
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
char hldpath[32]; /* Hall devpath */
|
||||||
|
foc_angle_b16_t hall; /* Hall angle handler */
|
||||||
#endif
|
#endif
|
||||||
int foc_mode; /* FOC mode */
|
int foc_mode; /* FOC mode */
|
||||||
int ctrl_state; /* Controller state */
|
int ctrl_state; /* Controller state */
|
||||||
|
@ -552,21 +552,19 @@ static int foc_motor_run(FAR struct foc_motor_f32_s *motor)
|
|||||||
DEBUGASSERT(motor);
|
DEBUGASSERT(motor);
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
||||||
# ifdef CONFIG_EXAMPLES_FOC_HAVE_VEL
|
|
||||||
/* Open-loop works only in velocity control mode */
|
/* Open-loop works only in velocity control mode */
|
||||||
|
|
||||||
if (motor->openloop_now == true)
|
if (motor->openloop_now == true)
|
||||||
{
|
{
|
||||||
|
# ifdef CONFIG_EXAMPLES_FOC_HAVE_VEL
|
||||||
if (motor->envp->mmode != FOC_MMODE_VEL)
|
if (motor->envp->mmode != FOC_MMODE_VEL)
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
PRINTF("ERROR: open-loop only with FOC_MMODE_VEL\n");
|
PRINTF("ERROR: open-loop only with FOC_MMODE_VEL\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# else
|
|
||||||
# error
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Get previous DQ */
|
/* Get previous DQ */
|
||||||
@ -656,6 +654,9 @@ int foc_motor_init(FAR struct foc_motor_f32_s *motor,
|
|||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_OPENLOOP
|
||||||
struct foc_openloop_cfg_f32_s ol_cfg;
|
struct foc_openloop_cfg_f32_s ol_cfg;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
struct foc_hall_cfg_f32_s hl_cfg;
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
||||||
struct foc_routine_align_cfg_f32_s align_cfg;
|
struct foc_routine_align_cfg_f32_s align_cfg;
|
||||||
#endif
|
#endif
|
||||||
@ -689,6 +690,37 @@ int foc_motor_init(FAR struct foc_motor_f32_s *motor,
|
|||||||
foc_angle_cfg_f32(&motor->openloop, &ol_cfg);
|
foc_angle_cfg_f32(&motor->openloop, &ol_cfg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
/* Initialize hall angle handler */
|
||||||
|
|
||||||
|
ret = foc_angle_init_f32(&motor->hall,
|
||||||
|
&g_foc_angle_hl_f32);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
PRINTFV("ERROR: foc_angle_init_f32 failed %d!\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get hall devpath */
|
||||||
|
|
||||||
|
sprintf(motor->hldpath,
|
||||||
|
"%s%d",
|
||||||
|
CONFIG_EXAMPLES_FOC_HALL_DEVPATH,
|
||||||
|
motor->envp->id);
|
||||||
|
|
||||||
|
/* Configure hall angle handler */
|
||||||
|
|
||||||
|
hl_cfg.devpath = motor->hldpath;
|
||||||
|
hl_cfg.per = motor->per;
|
||||||
|
|
||||||
|
ret = foc_angle_cfg_f32(&motor->hall, &hl_cfg);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
PRINTFV("ERROR: foc_angle_cfg_f32 failed %d!\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_ALIGN
|
||||||
/* Initialize motor alignment routine */
|
/* Initialize motor alignment routine */
|
||||||
|
|
||||||
@ -710,9 +742,11 @@ int foc_motor_init(FAR struct foc_motor_f32_s *motor,
|
|||||||
align_cfg.cb.zero = foc_align_zero_cb;
|
align_cfg.cb.zero = foc_align_zero_cb;
|
||||||
align_cfg.cb.dir = foc_align_dir_cb;
|
align_cfg.cb.dir = foc_align_dir_cb;
|
||||||
|
|
||||||
/* TODO: Connect align callbacks private data */
|
/* Connect align callbacks private data */
|
||||||
|
|
||||||
align_cfg.cb.priv = NULL;
|
# ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
align_cfg.cb.priv = &motor->hall;
|
||||||
|
# endif
|
||||||
|
|
||||||
ret = foc_routine_cfg_f32(&motor->align, &align_cfg);
|
ret = foc_routine_cfg_f32(&motor->align, &align_cfg);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -726,7 +760,9 @@ int foc_motor_init(FAR struct foc_motor_f32_s *motor,
|
|||||||
|
|
||||||
motor->ctrl_state = FOC_CTRL_STATE_INIT;
|
motor->ctrl_state = FOC_CTRL_STATE_INIT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
errout:
|
errout:
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -807,6 +843,15 @@ int foc_motor_get(FAR struct foc_motor_f32_s *motor)
|
|||||||
motor->angle_ol = aout.angle;
|
motor->angle_ol = aout.angle;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
ret = foc_angle_run_f32(&motor->hall, &ain, &aout);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
PRINTF("ERROR: foc_angle_run failed %d\n", ret);
|
||||||
|
goto errout;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
/* Handle angle from sensor */
|
/* Handle angle from sensor */
|
||||||
|
|
||||||
@ -858,7 +903,9 @@ int foc_motor_get(FAR struct foc_motor_f32_s *motor)
|
|||||||
/* TODO: velocity observer or sensor */
|
/* TODO: velocity observer or sensor */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_SENSORED
|
||||||
errout:
|
errout:
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +70,10 @@ struct foc_motor_f32_s
|
|||||||
bool openloop_now; /* Open-loop now */
|
bool openloop_now; /* Open-loop now */
|
||||||
float angle_ol; /* Phase angle open-loop */
|
float angle_ol; /* Phase angle open-loop */
|
||||||
foc_angle_f32_t openloop; /* Open-loop angle handler */
|
foc_angle_f32_t openloop; /* Open-loop angle handler */
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_EXAMPLES_FOC_HAVE_HALL
|
||||||
|
char hldpath[32]; /* Hall devpath */
|
||||||
|
foc_angle_f32_t hall; /* Hall angle handler */
|
||||||
#endif
|
#endif
|
||||||
int foc_mode; /* FOC mode */
|
int foc_mode; /* FOC mode */
|
||||||
int ctrl_state; /* Controller state */
|
int ctrl_state; /* Controller state */
|
||||||
|
Loading…
Reference in New Issue
Block a user