利用Cordic 计算浮点三角函数
STM32的CORDIC介绍
含义与原理:CORDIC(Coordinate Rotation Digital Computer)即坐标旋转数字计算机。在三角函数(圆)模式下,它通过不断旋转单位向量来确定角度的正余弦值。比如,通过减小角度旋转单位向量(1, 0),直到旋转角度的累加和等于输入角度θ,此时旋转向量的x和y笛卡尔分量就分别对应于θ的余弦和正弦。在计算双曲函数时,则是通过沿双曲线逐级替换连续的圆周旋转来实现。
主要特点:STM32的CORDIC模块可以加速三角函数、取模、开方等数学运算,适合大量数据进行相同的运算操作,配合DMA可以大大节省CPU计算开销,且拥有较高的计算精度。
应用场景:常用于电机控制、计量、信号处理等领域。例如在电机控制中,可快速计算三角函数以实现对电机的精确控制;在信号处理中,能高效完成诸如正弦波、余弦波的生成等任务。
HAL库中与CORDIC相关函数的功能
HAL_CORDIC_Configure
功能:用于对CORDIC模块进行配置,主要是完成对CORDIC_ConfigTypeDef结构体的配置,包括设置要执行的函数(如正弦、余弦等)、精度、缩放比例、输入输出数据的大小等。
参数:第一个参数为CORDIC的句柄指针,第二个参数为指向CORDIC_ConfigTypeDef结构体的指针,用于指定具体的配置参数。
HAL_CORDIC_Calculate_DMA
功能:使用DMA方式进行CORDIC计算,能够实现数据的批量处理,提高计算效率,节省CPU资源。
参数:有5个入口参数,分别是cordic结构体地址、输入数据地址、输出数据地址、转换次数、DMA数据方向。
HAL_CORDIC_GetState
功能:获取CORDIC模块的状态,比如判断是否处于空闲状态等,可用于在程序中等待CORDIC模块完成当前操作,以便进行后续的数据读取或新的计算任务。
参数:传入CORDIC的句柄指针,用于指定要查询状态的CORDIC模块。
CORDIC相关函数计算正弦和余弦值的代码示例
以下是一个使用 STM32 HAL 库中 CORDIC 相关函数计算正弦和余弦值的代码示例。此示例假设使用的是 STM32Cube HAL 库,并且已经完成了基本的工程配置(如时钟配置等)。项目中,利用 DMA 模块来减小 CORDIC 计算函数对 CPU 占用的示例代码。通过使用 DMA 可以实现数据的批量传输,让 CORDIC 模块在后台进行计算,从而减少 CPU 干预。
代码示例
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file CORDIC/CORDIC_Sin_DMA/Src/main.c
* @author MCD Application Team
* @brief This sample code shows how to use the STM32G4xx CORDIC HAL API
* to compute Sine on arrays of data (Q1.31 format) in DMA mode.
******************************************************************************
* @attention
*
* Copyright (c) 2019 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
CORDIC_HandleTypeDef hcordic;
DMA_HandleTypeDef hdma_cordic_write;
DMA_HandleTypeDef hdma_cordic_read;
/* USER CODE BEGIN PV */
/* CORDIC configuration structure */
CORDIC_ConfigTypeDef sCordicConfig;
/* Array of angles in Q1.31 format, regularly incremented from 0 to 2*pi */
static int32_t aAngles[ARRAY_SIZE] =
{
0x00000000, 0x04000000, 0x08000000, 0x0C000000,
0x10000000, 0x14000000, 0x18000000, 0x1C000000,
0x20000000, 0x24000000, 0x28000000, 0x2C000000,
0x30000000, 0x34000000, 0x38000000, 0x3C000000,
0x40000000, 0x44000000, 0x48000000, 0x4C000000,
0x50000000, 0x54000000, 0x58000000, 0x5C000000,
0x60000000, 0x64000000, 0x68000000, 0x6C000000,
0x70000000, 0x74000000, 0x78000000, 0x7C000000,
0x80000000, 0x84000000, 0x88000000, 0x8C000000,
0x90000000, 0x94000000, 0x98000000, 0x9C000000,
0xA0000000, 0xA4000000, 0xA8000000, 0xAC000000,
0xB0000000, 0xB4000000, 0xB8000000, 0xBC000000,