zoukankan      html  css  js  c++  java
  • 【STM32F429的DSP教程】第18章 DSP控制函数-更好用的SIN,COS计算

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

    第18章       DSP控制函数-更好用的SIN,COS计算

    本期教程主要讲解控制函数中的cos和sin函数数值的获取,这里使用的函数比起第13章中使用的sin和cos函数数值的获取要方便很多。

    18.1 初学者重要提示

    18.2 DSP基础运算指令

    18.3 浮点数SIN和COS

    18.4 定点数SIN和COS

    18.5 Clark正变换和逆变换

    18.6 Park正变换和逆变换

    18.7 实验例程说明(MDK)

    18.8 实验例程说明(IAR)

    18.9 总结

    18.1 初学者重要提示

    1.   Matlab2018a手动加载数据的方法在第13章的13.6章节进行了说明。

    如果要看Matlab2012,参考第1版DSP教程:http://www.armbbs.cn/forum.php?mod=viewthread&tid=3886

    18.2 DSP基础运算指令

    本章用到的DSP指令在前面章节都已经讲解过。

    18.3 浮点数SIN和COS

    使用表查找法和线性插值方式来计算正弦和余弦值。

    18.3.1 函数arm_sin_cos_f32

    函数原型:

    void arm_sin_cos_f32(

         float32_t theta,

         float32_t * pSinVal,

         float32_t * pCosVal)

    函数描述:

    这个函数用于浮点方式计算正弦和余弦值。

    函数参数:

    •   第1个参数参数是角度。这里输入角度-180到179就能得到一个周期的正弦或者余弦数值。
    •   第2个参数是转换后求出的sin值。
    •   第3个参数是转换后求出的cos值。

    18.3.2 使用举例

    程序设计:

    /*
    *********************************************************************************************************
    *    函 数 名: DSP_SIN_COS
    *    功能说明: 浮点数cos和sin计算
    *    形    参: 无
    *    返 回 值: 无
    *********************************************************************************************************
    */
    static void DSP_SIN_COS(void)
    {
        int16_t i;
        float32_t pSinVal;
        float32_t pCosVal;
    
        for(i = -180; i < 180; i++)
        {
            arm_sin_cos_f32(i, &pSinVal, &pCosVal);                                                      
            printf("i = %d pSinVal = %f pCosVal = %f
    ", i, pSinVal, pCosVal);
        }
    }

    实验现象:

     

    • 通过matlab绘制sin函数的输出数据的曲线(绘制方法见第10章的10.4小节)

     

    • 通过matlab绘制cos函数的输出数据的曲线(绘制方法见第10章的10.4小节)

     

    参数theta的单位是角度。这里输入角度 -2^31 ~ 2^31-1 就能得到一个周期的正弦或者余弦数值

    18.4 定点数SIN和COS

    使用表查找法和线性插值方式来计算正弦和余弦值。

    18.4.1 函数arm_sin_cos_q31

    函数原型:

    void arm_sin_cos_f32(

         float32_t theta,

         float32_t * pSinVal,

         float32_t * pCosVal)

    函数描述:

    这个函数用于定点方式计算正弦和余弦值。

    函数参数:

    •   第1个参数参数是角度。这里输入角度 -2^31 ~ 2^31-1 就能得到一个周期的正弦或者余弦数值。
    •   第2个参数是转换后求出的sin值。
    •   第3个参数是转换后求出的cos值。

    18.4.2 使用举例

    程序设计:

    /*
    *********************************************************************************************************
    *    函 数 名: DSP_SIN_COS
    *    功能说明: 浮点数cos和sin计算
    *    形    参: 无
    *    返 回 值: 无
    *********************************************************************************************************
    */
    static void DSP_SIN_COS(void)
    {
        int16_t i;
        float32_t pSinVal;
        float32_t pCosVal;
    
        for(i = -180; i < 180; i++)
        {
            arm_sin_cos_f32(i, &pSinVal, &pCosVal);                                                      
            printf("i = %d pSinVal = %f pCosVal = %f
    ", i, pSinVal, pCosVal);
        }
    }

    实验现象:

     

    • 通过matlab绘制sin函数的输出数据的曲线(绘制方法见第13章的13.6小节)

     

    • 通过matlab绘制cos函数的输出数据的曲线(绘制方法见第13章的13.6小节)

     

    18.5 Clarke 正变换和逆变换

    暂时没有研究。

    18.6 Park 正变换和逆变换

    暂时没有研究。

    18.7 实验例程说明(MDK)

    配套例子:

    V6-213_DSP控制函数(三角函数)

    实验目的:

    1. 学习DSP控制函数(三角函数)

    实验内容:

    1. 启动一个自动重装软件定时器,每100ms翻转一次LED2。
    2. 按下按键K1,浮点数格式求sin和cos值。
    3. 按下按键K2, 定点数格式求sin和cos值。

    使用AC6注意事项

    特别注意附件章节C的问题

    上电后串口打印的信息:

    波特率 115200,数据位 8,奇偶校验位无,停止位 1。

    详见本章的3.4  4.4,5.4小节。

    程序设计:

      系统栈大小分配:

     

      硬件外设初始化

    硬件外设的初始化是在 bsp.c 文件实现:

    /*
    *********************************************************************************************************
    *    函 数 名: bsp_Init
    *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    *    形    参:无
    *    返 回 值: 无
    *********************************************************************************************************
    */
    void bsp_Init(void)
    {
        /* 
           STM32F407 HAL 库初始化,此时系统用的还是F407自带的16MHz,HSI时钟:
           - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
           - 设置NVIV优先级分组为4。
         */
        HAL_Init();
    
        /* 
           配置系统时钟到168MHz
           - 切换使用HSE。
           - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
        */
        SystemClock_Config();
    
        /* 
           Event Recorder:
           - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
           - 默认不开启,如果要使能此选项,务必看V5开发板用户手册第8章
        */    
    #if Enable_EventRecorder == 1  
        /* 初始化EventRecorder并开启 */
        EventRecorderInitialize(EventRecordAll, 1U);
        EventRecorderStart();
    #endif
        
        bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
        bsp_InitTimer();      /* 初始化滴答定时器 */
        bsp_InitUart();    /* 初始化串口 */
        bsp_InitExtIO();   /* 初始化扩展IO */
        bsp_InitLed();        /* 初始化LED */        
    }

      主功能:

    主程序实现如下操作:

    •   启动一个自动重装软件定时器,每100ms翻转一次LED2。
    •   按下按键K1,浮点数格式求sin和cos值。
    •   按下按键K2, 定点数格式求sin和cos值。
    /*
    *********************************************************************************************************
    *    函 数 名: main
    *    功能说明: c程序入口
    *    形    参: 无
    *    返 回 值: 错误代码(无需处理)
    *********************************************************************************************************
    */
    int main(void)
    {
        uint8_t ucKeyCode;        /* 按键代码 */
        
    
        bsp_Init();        /* 硬件初始化 */
        PrintfLogo();    /* 打印例程信息到串口1 */
    
        PrintfHelp();    /* 打印操作提示信息 */
        
    
        bsp_StartAutoTimer(0, 100);    /* 启动1个100ms的自动重装的定时器 */
    
        /* 进入主程序循环体 */
        while (1)
        {
            bsp_Idle();        /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    
            /* 判断定时器超时时间 */
            if (bsp_CheckTimer(0))    
            {
                /* 每隔100ms 进来一次 */  
                bsp_LedToggle(2);
            }
    
            ucKeyCode = bsp_GetKey();    /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
            if (ucKeyCode != KEY_NONE)
            {
                switch (ucKeyCode)
                {
                    case KEY_DOWN_K1:            /* K1键按下,浮点数格式求sin和cos值 */
                         DSP_SIN_COS();
                        break;
                        
                    case KEY_DOWN_K2:            /* K2键按下,定点数格式求sin和cos值 */
                        DSP_SIN_COS_Q31();
                        break;
    
                    default:
                        /* 其他的键值不处理 */
                        break;
                }
            }
        }
    }

    18.8 实验例程说明(IAR)

    配套例子:

    V6-213_DSP控制函数(三角函数)

    实验目的:

    1. 学习DSP控制函数(三角函数)

    实验内容:

    1. 启动一个自动重装软件定时器,每100ms翻转一次LED2。
    2. 按下按键K1,浮点数格式求sin和cos值。
    3. 按下按键K2, 定点数格式求sin和cos值。

    上电后串口打印的信息:

    波特率 115200,数据位 8,奇偶校验位无,停止位 1。

    详见本章的3.4  4.4,5.4小节。

    程序设计:

      系统栈大小分配:

     

      硬件外设初始化

    硬件外设的初始化是在 bsp.c 文件实现:

    /*
    *********************************************************************************************************
    *    函 数 名: bsp_Init
    *    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    *    形    参:无
    *    返 回 值: 无
    *********************************************************************************************************
    */
    void bsp_Init(void)
    {
        /* 
           STM32F407 HAL 库初始化,此时系统用的还是F407自带的16MHz,HSI时钟:
           - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
           - 设置NVIV优先级分组为4。
         */
        HAL_Init();
    
        /* 
           配置系统时钟到168MHz
           - 切换使用HSE。
           - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
        */
        SystemClock_Config();
    
        /* 
           Event Recorder:
           - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
           - 默认不开启,如果要使能此选项,务必看V5开发板用户手册第8章
        */    
    #if Enable_EventRecorder == 1  
        /* 初始化EventRecorder并开启 */
        EventRecorderInitialize(EventRecordAll, 1U);
        EventRecorderStart();
    #endif
        
        bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
        bsp_InitTimer();      /* 初始化滴答定时器 */
        bsp_InitUart();    /* 初始化串口 */
        bsp_InitExtIO();   /* 初始化扩展IO */
        bsp_InitLed();        /* 初始化LED */        
    }

      主功能:

    主程序实现如下操作:

    •   启动一个自动重装软件定时器,每100ms翻转一次LED2。
    •   按下按键K1,浮点数格式求sin和cos值。
    •   按下按键K2, 定点数格式求sin和cos值。
    /*
    *********************************************************************************************************
    *    函 数 名: main
    *    功能说明: c程序入口
    *    形    参: 无
    *    返 回 值: 错误代码(无需处理)
    *********************************************************************************************************
    */
    int main(void)
    {
        uint8_t ucKeyCode;        /* 按键代码 */
        
    
        bsp_Init();        /* 硬件初始化 */
        PrintfLogo();    /* 打印例程信息到串口1 */
    
        PrintfHelp();    /* 打印操作提示信息 */
        
    
        bsp_StartAutoTimer(0, 100);    /* 启动1个100ms的自动重装的定时器 */
    
        /* 进入主程序循环体 */
        while (1)
        {
            bsp_Idle();        /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    
            /* 判断定时器超时时间 */
            if (bsp_CheckTimer(0))    
            {
                /* 每隔100ms 进来一次 */  
                bsp_LedToggle(2);
            }
    
            ucKeyCode = bsp_GetKey();    /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
            if (ucKeyCode != KEY_NONE)
            {
                switch (ucKeyCode)
                {
                    case KEY_DOWN_K1:            /* K1键按下,浮点数格式求sin和cos值 */
                         DSP_SIN_COS();
                        break;
                        
                    case KEY_DOWN_K2:            /* K2键按下,定点数格式求sin和cos值 */
                        DSP_SIN_COS_Q31();
                        break;
    
                    default:
                        /* 其他的键值不处理 */
                        break;
                }
            }
        }
    }

    18.9 总结

    本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的实现。

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/armfly/p/12842608.html
Copyright © 2011-2022 走看看