speed_observer.h
Go to the documentation of this file.
1 //#############################################################################
2 // FILE : Spd_Observer.h
3 // TITLE : Header file to be shared between example and library for CPU data.
4 // Version : 1.0
5 //
6 // Group : C2000
7 // Target Family : F2837x
8 // Created on : Mar 28, 2018
9 // Author : Ramesh Ramamoorthy
10 //#############################################################################
11 // $TI Release: C2000 FCL SFRA $
12 // $Release Date: 11/2017 $
13 // $Copyright: Copyright (C) 2013-2017 Texas Instruments Incorporated -
14 // http://www.ti.com/ ALL RIGHTS RESERVED $
15 //#############################################################################
16 
17 
18 #ifndef SPD_OBSERVER_H
19 #define SPD_OBSERVER_H
20 
21 #include "device.h"
22 
23 typedef struct _SPD_OBSERVER_obj_
24 {
25  float32_t Ref; // Input: reference set-point
26  float32_t Fbk; // Input: feedback
27  float32_t Err; // Error
28  float32_t Out; // Output: controller output
29  float32_t Kp; // Parameter: proportional loop gain
30  float32_t Ki; // Parameter: integral gain
31  float32_t KiT; // Parameter
32  float32_t Umax; // Parameter: upper saturation limit
33  float32_t Umin; // Parameter: lower saturation limit
34  float32_t up; // Data: proportional term
35  float32_t ui; // Data: integral term
36  float32_t IqMax; // Parameter: Max current in Q axis
37  float32_t IqKf; // Parameter: Gain of Iq error current
38  float32_t thetaMax; // Parameter: maximum theta
39 } SPD_OBSERVER;
40 
41 /*-----------------------------------------------------------------------------
42 Default initialization values for the SPD_OBSERVER objects
43 -----------------------------------------------------------------------------*/
44 #define SPD_OBSERVER_DEFAULTS { \
45  0.0f, /* Ref */ \
46  0.0f, /* Fbk */ \
47  0.0f, /* Err */ \
48  0.0f, /* Out */ \
49  0.0f, /* Kp */ \
50  0.0f, /* Ki */ \
51  0.0f, /* KiT */ \
52  1.0f, /* Umax */ \
53  -1.0f, /* Umin */ \
54  0.0f, /* up */ \
55  0.0f, /* ui */ \
56  0.0f, /* IqMax */ \
57  0.1f, /* IqKf */ \
58  0.1f /* thetaMax */ \
59 }
60 
61 // ***************************************
62 // extern functions
63 // ***************************************
65  float32_t theta, float32_t IqErr,
66  float32_t Ts, float32_t thetaMax)
67 {
68  float32_t IqErrFF = __fsat(IqErr, obs->IqMax, -obs->IqMax) * obs->IqKf;
69 
70  obs->Ref = theta;
71 
72  // error cal
73  obs->Err = obs->Ref - obs->Fbk + IqErrFF;
74 
75  // roll in the error
76  obs->Err = (obs->Err > 0.5f) ? (obs->Err - 1.0f) :
77  (obs->Err < -0.5f) ? (obs->Err + 1.0f) : obs->Err;
78 
79  // P and I control
80  obs->up = obs->Kp * obs->Err; // P control
81  obs->ui += obs->Ki * obs->Err * Ts; // I control
82  obs->ui = __fsat(obs->ui, obs->Umax, obs->Umin);
83 
84  // control output
85  obs->Out = obs->up + obs->ui;
86  obs->Out = __fsat(obs->Out, obs->Umax, obs->Umin);
87 
88  // Latest angle feedback estimation --> ( Fbk = integral of speed )
89  obs->Fbk += obs->Out * thetaMax;
90 
91  // roll "Fbk" within -pi to pi
92  obs->Fbk = (obs->Fbk > 1.0f) ? (obs->Fbk - 1.0f) :
93  (obs->Fbk < 0.0f) ? (obs->Fbk + 1.0f) : obs->Fbk;
94 
95  return(obs->Out);
96 }
97 
98 // ***************************************
99 // extern functions
100 // ***************************************
101 static inline float32_t runSpeedObserve(SPD_OBSERVER * obs, float32_t theta)
102 {
103  obs->Ref = theta;
104 
105  // error cal
106  obs->Err = obs->Ref - obs->Fbk;
107 
108  // roll in the error
109  obs->Err = (obs->Err > 0.5) ? (obs->Err - 1.0) :
110  (obs->Err < -0.5) ? (obs->Err + 1.0) : obs->Err;
111 
112  // P and I control
113  obs->up = obs->Kp * obs->Err; // P control
114  obs->ui += obs->Ki * obs->Err; // I control
115  obs->ui = __fsat(obs->ui, obs->Umax, obs->Umin);
116 
117  // control output
118  obs->Out = obs->up + obs->ui;
119  obs->Out = __fsat(obs->Out, obs->Umax, obs->Umin);
120 
121  // Latest angle feedback estimation --> ( Fbk = integral of speed )
122  obs->Fbk += obs->Out * obs->thetaMax;
123 
124  // roll "Fbk" within -pi to pi
125  obs->Fbk = (obs->Fbk > 1.0) ? (obs->Fbk - 1.0) :
126  (obs->Fbk < 0.0) ? (obs->Fbk + 1.0) : obs->Fbk;
127 
128  return(obs->Out);
129 }
130 
131 #endif // end of SPD_OBSERVER_H definition
_SPD_OBSERVER_obj_::Out
float32_t Out
Definition: speed_observer.h:28
_SPD_OBSERVER_obj_::Err
float32_t Err
Definition: speed_observer.h:27
_SPD_OBSERVER_obj_::Kp
float32_t Kp
Definition: speed_observer.h:29
float32_t
float float32_t
Definition: sfra_f32.h:42
_SPD_OBSERVER_obj_::Fbk
float32_t Fbk
Definition: speed_observer.h:26
_SPD_OBSERVER_obj_::up
float32_t up
Definition: speed_observer.h:34
_SPD_OBSERVER_obj_
Definition: speed_observer.h:23
device.h
_SPD_OBSERVER_obj_::KiT
float32_t KiT
Definition: speed_observer.h:31
_SPD_OBSERVER_obj_::Umax
float32_t Umax
Definition: speed_observer.h:32
_SPD_OBSERVER_obj_::thetaMax
float32_t thetaMax
Definition: speed_observer.h:38
runSpeedObserve
static float32_t runSpeedObserve(SPD_OBSERVER *obs, float32_t theta)
Definition: speed_observer.h:101
_SPD_OBSERVER_obj_::Ki
float32_t Ki
Definition: speed_observer.h:30
SPD_OBSERVER_run
static float32_t SPD_OBSERVER_run(SPD_OBSERVER *obs, float32_t theta, float32_t IqErr, float32_t Ts, float32_t thetaMax)
Definition: speed_observer.h:64
_SPD_OBSERVER_obj_::ui
float32_t ui
Definition: speed_observer.h:35
SPD_OBSERVER
struct _SPD_OBSERVER_obj_ SPD_OBSERVER
_SPD_OBSERVER_obj_::IqMax
float32_t IqMax
Definition: speed_observer.h:36
_SPD_OBSERVER_obj_::Ref
float32_t Ref
Definition: speed_observer.h:25
_SPD_OBSERVER_obj_::IqKf
float32_t IqKf
Definition: speed_observer.h:37
_SPD_OBSERVER_obj_::Umin
float32_t Umin
Definition: speed_observer.h:33

Copyright 2023, Texas Instruments Incorporated