打印
[DemoCode下载]

M480利用内核DSP库函数实现PID功能

[复制链接]
1210|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
598330983|  楼主 | 2022-12-20 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* @brief
*           Display how to use M4 DSP PID Controller
*           compare with calcultion time without DSP
* @note
* Copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "NuMicro.h"
#include "arm_math.h"

/*---------------------------------------------------------------------------*/
/* Global variables                                                          */
/*---------------------------------------------------------------------------*/
#define USE_DSP

uint32_t u32CalTime;
arm_pid_instance_f32 PIDS;
float32_t doutput[100], derr;
float fA0, fA1, fA2, afstate[3], fKp = 0.4, fKi = 0.4, fKd = 0, ftarget, fival;

/*---------------------------------------------------------------------------*/
/* Functions                                                                 */
/*---------------------------------------------------------------------------*/
float PID(float fin)
{
    float fout;

    fA0 = fKp + fKi;
    fA1 = -fKp - (2 * fKd);
    fA2 = fKd;
    /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]  */
    fout = (fA0 * fin) + (fA1 * afstate[0]) + (fA2 * afstate[1]) + (afstate[2]);

    /* Update state */
    afstate[1] = afstate[0];
    afstate[0] = fin;
    afstate[2] = fout;

    /* return to application */
    return (fout);
}

void SYS_Init(void)
{
    /*---------------------------------------------------------------------------*/
    /* Init System Clock                                                         */
    /*---------------------------------------------------------------------------*/
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

    /* Enable External XTAL (4~24 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(FREQ_192MHZ);

    /* Set both PCLK0 and PCLK1 as HCLK/2 */
    CLK->PCLKDIV = CLK_PCLKDIV_PCLK0DIV2 | CLK_PCLKDIV_PCLK1DIV2;

    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(TMR0_MODULE);

    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));
    CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();


    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk);
    SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

    /* Lock protected registers */
    SYS_LockReg();

}

void UART_Init(void)
{
    /* Configure UART0 and set UART0 Baudrate */
    UART_Open(UART0, 115200);
}

int32_t main(void)
{
    uint32_t i;

    /* Set PID parameters */
    PIDS.Kp = 0.4;
    PIDS.Ki = 0.4;
    PIDS.Kd = 0;

    /* Target value*/
    ftarget = 500;
    /* Inital value */
    fival = 0;
    /* Initial value and target value error */
    derr = ftarget - fival;

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();

    /* Init UART for printf */
    UART_Init();

    /*
        This sample code is used to show how to use ARM Cortex-M4 DSP library.
        And displays function calculation time.
    */

    printf("\n\n");
    printf("+----------------------------------------+\n");
    printf("|      M480_M4_DSP_PID Sample Code       |\n");
    printf("+----------------------------------------+\n");

    TIMER_Open(TIMER0, TIMER_CONTINUOUS_MODE, 1);
    TIMER_Start(TIMER0);

#ifdef USE_DSP
    /* Initial DSP PID controller function */
    arm_pid_init_f32(&PIDS, 0);

    /* Calculate PID controller function 100 times */
    for (i = 1; i < 100; i++)
    {
        doutput[i] = arm_pid_f32(&PIDS, derr);
        //printf("%0.2f\n",doutput[i]);
        /* Update error */
        derr = ftarget - doutput[i - 1];
    }

#else

    for (i = 1; i < 100; i++)
    {
        doutput[i] = PID(derr);
        derr = ftarget - doutput[i - 1];
    }

#endif

    TIMER_Close(TIMER0);
    u32CalTime = TIMER_GetCounter(TIMER0);

    /* Display function calculation time */
    printf("Calculation time is %d \n", u32CalTime);

    while (1);
}


使用特权

评论回复
沙发
598330983|  楼主 | 2022-12-20 20:59 | 只看该作者
EC_M480_M4_DSP_PID_V1.00.zip (6.74 MB)
奉上代码

使用特权

评论回复
板凳
稳稳の幸福| | 2022-12-21 10:31 | 只看该作者
  typedef struct
  {
    float32_t A0;          /**< The derived gain, A0 = Kp + Ki + Kd . */
    float32_t A1;          /**< The derived gain, A1 = -Kp - 2Kd. */
    float32_t A2;          /**< The derived gain, A2 = Kd . */
    float32_t state[3];    /**< The state array of length 3. */
    float32_t Kp;          /**< The proportional gain. */
    float32_t Ki;          /**< The integral gain. */
    float32_t Kd;          /**< The derivative gain. */
  } arm_pid_instance_f32;

使用特权

评论回复
地板
稳稳の幸福| | 2022-12-21 10:31 | 只看该作者
下载了,看了一下,使用好方便啊

使用特权

评论回复
5
稳稳の幸福| | 2022-12-21 10:34 | 只看该作者
只需要自己定义好PID三个参数的值,然后设定目标值,每次传递误差进去,返回值继续做差。666,好简单。

使用特权

评论回复
6
phoenixwhite| | 2023-2-2 11:02 | 只看该作者
如何用c语言实现PID算法的参数计算

使用特权

评论回复
7
ingramward| | 2023-2-2 12:51 | 只看该作者
已知传递函数怎么进行pid参数整定

使用特权

评论回复
8
iyoum| | 2023-2-2 16:29 | 只看该作者
PID控制器是如何实现的               

使用特权

评论回复
9
dspmana| | 2023-2-4 16:03 | 只看该作者
如何使用DSP库进行FFT              

使用特权

评论回复
10
robertesth| | 2023-2-4 17:45 | 只看该作者
库函数的说明文档在哪儿               

使用特权

评论回复
11
elsaflower| | 2023-2-4 23:20 | 只看该作者
单神经元PID双闭环调速如何实现

使用特权

评论回复
12
bartonalfred| | 2023-2-5 13:41 | 只看该作者
这个代码是自整定参数吗?              

使用特权

评论回复
13
juliestephen| | 2023-2-6 13:40 | 只看该作者
如何编写进程PID查找函数               

使用特权

评论回复
14
hilahope| | 2023-2-7 20:37 | 只看该作者
如何在DSP中添加现成的函数库

使用特权

评论回复
15
OKAKAKO| | 2023-2-9 09:23 | 只看该作者
dsp库做FFT运算的具体讲解有吗?

使用特权

评论回复
16
usysm| | 2023-4-18 19:45 | 只看该作者
在实际应用中,还需要考虑PID控制器的稳定性、响应时间、抗干扰能力等因素。

使用特权

评论回复
17
1988020566| | 2023-4-18 20:08 | 只看该作者
可以使用 Keil 内核 DSP 库函数来实现 PID 控制算法。

使用特权

评论回复
18
timfordlare| | 2023-4-18 21:29 | 只看该作者
M480 是一种基于 Arm Cortex-M4 内核的高性能单片机,配备了丰富的外设和内置 DSP 功能模块。

使用特权

评论回复
19
Jacquetry| | 2023-4-18 22:52 | 只看该作者
可以实现自动调节PID吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

246

主题

5384

帖子

22

粉丝