Subversion Repositories dashGPS

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /* ----------------------------------------------------------------------
  2.  * Project:      CMSIS DSP Library
  3.  * Title:        arm_pid_init_q31.c
  4.  * Description:  Q31 PID Control initialization function
  5.  *
  6.  * $Date:        27. January 2017
  7.  * $Revision:    V.1.5.1
  8.  *
  9.  * Target Processor: Cortex-M cores
  10.  * -------------------------------------------------------------------- */
  11. /*
  12.  * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.
  13.  *
  14.  * SPDX-License-Identifier: Apache-2.0
  15.  *
  16.  * Licensed under the Apache License, Version 2.0 (the License); you may
  17.  * not use this file except in compliance with the License.
  18.  * You may obtain a copy of the License at
  19.  *
  20.  * www.apache.org/licenses/LICENSE-2.0
  21.  *
  22.  * Unless required by applicable law or agreed to in writing, software
  23.  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  24.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  25.  * See the License for the specific language governing permissions and
  26.  * limitations under the License.
  27.  */
  28.  
  29. #include "arm_math.h"
  30.  
  31.  /**
  32.  * @addtogroup PID
  33.  * @{
  34.  */
  35.  
  36. /**
  37.  * @brief  Initialization function for the Q31 PID Control.
  38.  * @param[in,out] *S points to an instance of the Q31 PID structure.
  39.  * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.
  40.  * @return none.
  41.  * \par Description:
  42.  * \par
  43.  * The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n
  44.  * The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>
  45.  * using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)
  46.  * also sets the state variables to all zeros.
  47.  */
  48.  
  49. void arm_pid_init_q31(
  50.   arm_pid_instance_q31 * S,
  51.   int32_t resetStateFlag)
  52. {
  53.  
  54. #if defined (ARM_MATH_DSP)
  55.  
  56.   /* Run the below code for Cortex-M4 and Cortex-M3 */
  57.  
  58.   /* Derived coefficient A0 */
  59.   S->A0 = __QADD(__QADD(S->Kp, S->Ki), S->Kd);
  60.  
  61.   /* Derived coefficient A1 */
  62.   S->A1 = -__QADD(__QADD(S->Kd, S->Kd), S->Kp);
  63.  
  64.  
  65. #else
  66.  
  67.   /* Run the below code for Cortex-M0 */
  68.  
  69.   q31_t temp;
  70.  
  71.   /* Derived coefficient A0 */
  72.   temp = clip_q63_to_q31((q63_t) S->Kp + S->Ki);
  73.   S->A0 = clip_q63_to_q31((q63_t) temp + S->Kd);
  74.  
  75.   /* Derived coefficient A1 */
  76.   temp = clip_q63_to_q31((q63_t) S->Kd + S->Kd);
  77.   S->A1 = -clip_q63_to_q31((q63_t) temp + S->Kp);
  78.  
  79. #endif /* #if defined (ARM_MATH_DSP) */
  80.  
  81.   /* Derived coefficient A2 */
  82.   S->A2 = S->Kd;
  83.  
  84.   /* Check whether state needs reset or not */
  85.   if (resetStateFlag)
  86.   {
  87.     /* Clear the state buffer.  The size will be always 3 samples */
  88.     memset(S->state, 0, 3U * sizeof(q31_t));
  89.   }
  90.  
  91. }
  92.  
  93. /**
  94.  * @} end of PID group
  95.  */
  96.