Subversion Repositories AFRtranscoder

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* ----------------------------------------------------------------------
  2.  * Project:      CMSIS DSP Library
  3.  * Title:        arm_pid_init_q15.c
  4.  * Description:  Q15 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.  * @details
  38.  * @param[in,out] *S points to an instance of the Q15 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_q15(
  50.   arm_pid_instance_q15 * 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 = __QADD16(__QADD16(S->Kp, S->Ki), S->Kd);
  60.  
  61.   /* Derived coefficients and pack into A1 */
  62.  
  63. #ifndef  ARM_MATH_BIG_ENDIAN
  64.  
  65.   S->A1 = __PKHBT(-__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), S->Kd, 16);
  66.  
  67. #else
  68.  
  69.   S->A1 = __PKHBT(S->Kd, -__QADD16(__QADD16(S->Kd, S->Kd), S->Kp), 16);
  70.  
  71. #endif /*      #ifndef  ARM_MATH_BIG_ENDIAN    */
  72.  
  73.   /* Check whether state needs reset or not */
  74.   if (resetStateFlag)
  75.   {
  76.     /* Clear the state buffer.  The size will be always 3 samples */
  77.     memset(S->state, 0, 3U * sizeof(q15_t));
  78.   }
  79.  
  80. #else
  81.  
  82.   /* Run the below code for Cortex-M0 */
  83.  
  84.   q31_t temp;                                    /*to store the sum */
  85.  
  86.   /* Derived coefficient A0 */
  87.   temp = S->Kp + S->Ki + S->Kd;
  88.   S->A0 = (q15_t) __SSAT(temp, 16);
  89.  
  90.   /* Derived coefficients and pack into A1 */
  91.   temp = -(S->Kd + S->Kd + S->Kp);
  92.   S->A1 = (q15_t) __SSAT(temp, 16);
  93.   S->A2 = S->Kd;
  94.  
  95.  
  96.  
  97.   /* Check whether state needs reset or not */
  98.   if (resetStateFlag)
  99.   {
  100.     /* Clear the state buffer.  The size will be always 3 samples */
  101.     memset(S->state, 0, 3U * sizeof(q15_t));
  102.   }
  103.  
  104. #endif /* #if defined (ARM_MATH_DSP) */
  105.  
  106. }
  107.  
  108. /**
  109.  * @} end of PID group
  110.  */
  111.