当前位置: 首页 > news >正文

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值,从DAC1和DAC2输出。
1、DAC特点

 PA4的附加功能为DAC1_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。
PA6的附加功能为DAC2_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。

2、测试程序

DAC_HandleTypeDef      DAC_1_Handler;   //DAC1句柄
DAC_HandleTypeDef      DAC_2_Handler;   //DAC2句柄

void DAC1_Init(void)
{
    DAC_ChannelConfTypeDef DAC1_CH1;        //DAC通道参数相关结构体
    GPIO_InitTypeDef       GPIO_InitStruct; //IO口参数结构体

    __HAL_RCC_DAC1_CLK_ENABLE();  //使能DAC1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟

    GPIO_InitStruct.Pin   = GPIO_PIN_4;           //选择引脚编号为4
    GPIO_InitStruct.Mode  = GPIO_MODE_ANALOG;     //模拟模式
  GPIO_InitStruct.Pull  = GPIO_NOPULL;          //引脚上拉和下拉都没有被激活
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //输出速度设置为25MHz至50MHz
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOC的外设寄存器

    DAC_1_Handler.Instance = DAC1; //DAC1
    HAL_DAC_Init(&DAC_1_Handler);  //初始化DAC1

    DAC1_CH1.DAC_HighFrequency     = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_160MHZ;
    //DAC时钟选择
  DAC1_CH1.DAC_DMADoubleDataMode = DISABLE; //双重数据模式(高带宽模式)关闭
  DAC1_CH1.DAC_SignedFormat      = DISABLE; //有符号模式关闭
  DAC1_CH1.DAC_SampleAndHold     = DAC_SAMPLEANDHOLD_DISABLE; //关闭采样保持
  DAC1_CH1.DAC_Trigger           = DAC_TRIGGER_NONE;          //不需要外部触发
  DAC1_CH1.DAC_OutputBuffer      = DAC_OUTPUTBUFFER_ENABLE;   //DAC输出缓冲器打开
  DAC1_CH1.DAC_UserTrimming      = DAC_TRIMMING_FACTORY;      //工厂矫正模式
    DAC1_CH1.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;    //不允许内部连接DAC1_CH1
  HAL_DAC_ConfigChannel(&DAC_1_Handler, &DAC1_CH1, DAC_CHANNEL_1);   //初始化
  HAL_DACEx_SelfCalibrate(&DAC_1_Handler, &DAC1_CH1, DAC_CHANNEL_1); //矫正
    HAL_DAC_Start(&DAC_1_Handler,DAC_CHANNEL_1); //开启DAC1通道1                  
    
    HAL_DAC_SetValue(&DAC_1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,2048);
    //设置DAC输出电压: 2048*3.3/(0xFFF+1)=1.65V

    Sin_CORDIC_INT();//用CORDIC算法实现正弦计算
}

void DAC2_Init(void)
{
    DAC_ChannelConfTypeDef DAC2_CH1;        //DAC通道参数相关结构体
    GPIO_InitTypeDef       GPIO_InitStruct; //IO口参数结构体

    __HAL_RCC_DAC2_CLK_ENABLE();  //使能DAC2时钟
    __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟

    GPIO_InitStruct.Pin   = GPIO_PIN_6;           //选择引脚编号为6
    GPIO_InitStruct.Mode  = GPIO_MODE_ANALOG;     //模拟模式
  GPIO_InitStruct.Pull  = GPIO_NOPULL;          //引脚上拉和下拉都没有被激活
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //输出速度设置为25MHz至50MHz
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    //根据GPIO_InitStruct结构变量指定的参数初始化GPIOC的外设寄存器

    DAC_2_Handler.Instance = DAC2; //DAC2
    HAL_DAC_Init(&DAC_2_Handler);  //初始化DAC2

    DAC2_CH1.DAC_HighFrequency     = DAC_HIGH_FREQUENCY_INTERFACE_MODE_ABOVE_160MHZ;
    //DAC时钟选择
  DAC2_CH1.DAC_DMADoubleDataMode = DISABLE; //双重数据模式(高带宽模式)关闭
  DAC2_CH1.DAC_SignedFormat      = DISABLE; //有符号模式关闭
  DAC2_CH1.DAC_SampleAndHold     = DAC_SAMPLEANDHOLD_DISABLE; //关闭采样保持
  DAC2_CH1.DAC_Trigger           = DAC_TRIGGER_NONE;          //不需要外部触发
  DAC2_CH1.DAC_OutputBuffer      = DAC_OUTPUTBUFFER_ENABLE;   //DAC输出缓冲器打开
  DAC2_CH1.DAC_UserTrimming      = DAC_TRIMMING_FACTORY;      //工厂矫正模式
    DAC2_CH1.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;    //不允许内部连接DAC2_CH1
  HAL_DAC_ConfigChannel(&DAC_2_Handler, &DAC2_CH1, DAC_CHANNEL_1);   //初始化
  HAL_DACEx_SelfCalibrate(&DAC_2_Handler, &DAC2_CH1, DAC_CHANNEL_1); //矫正
    HAL_DAC_Start(&DAC_2_Handler,DAC_CHANNEL_1); //开启DAC2通道1                  
    
    HAL_DAC_SetValue(&DAC_2_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,2048);
    //设置DAC2输出电压: 2048*3.3/(0xFFF+1)=1.65V
}

//函数功能: 用CORDIC算法实现正弦计算
void Sin_CORDIC_INT    (void)
{
    CORDIC_HandleTypeDef hcordic;                             //三角函数描述结构体
    CORDIC_ConfigTypeDef sCordicConfig;                       //参数配置结构体
  __HAL_RCC_CORDIC_CLK_ENABLE();                            //开启时钟
    
    hcordic.Instance = CORDIC;                                //选择三角函数计算单元
  HAL_CORDIC_Init(&hcordic);                                //初始化
    
    sCordicConfig.Function         = CORDIC_FUNCTION_SINE;     //选择计算正弦
  sCordicConfig.Precision        = CORDIC_PRECISION_6CYCLES; //选择计算精度等级
  sCordicConfig.Scale            = CORDIC_SCALE_0;           //选择计算系数
  sCordicConfig.NbWrite          = CORDIC_NBWRITE_1;         //选择计算结果个数
  sCordicConfig.NbRead           = CORDIC_NBREAD_1;          //选择输出正弦
  sCordicConfig.InSize           = CORDIC_INSIZE_32BITS;
    //选择输入数据格式Q1.31,在Q1.31格式的数字范围:-1 (0x80000000) to 1 至 2^(-31) (0x7FFFFFFF).
  sCordicConfig.OutSize          = CORDIC_OUTSIZE_32BITS;    //选择数据输出格式Q1.31
  HAL_CORDIC_Configure(&hcordic, &sCordicConfig);            //初始化
}

//0<=angles<360,返回值在-1和1之间
//主频170MHz时,本函数执行时间330ns

float sin_f(float angles)
{
    MODIFY_REG(CORDIC->CSR,CORDIC_CSR_FUNC|CORDIC_CSR_SCALE,CORDIC_FUNCTION_SINE|CORDIC_SCALE_0);
    //选择计算类型:CORDIC_FUNCTION_SINE
    WRITE_REG(CORDIC->WDATA, (int32_t)((180.0f-angles)*11930464.7f));
    //小于180度为正数,大于180度为负数,乘以11930464.7就转换成“q1.31格式”的数据
    //写入CORDIC_WDATA寄存器后,就可以读取“CORDIC_RDATA寄存器的数据”
    //由于“模为0x80000000”,0x80000000/180=2147483648/180=11930464.7

    return (int32_t)READ_REG(CORDIC->RDATA)/2147483648.0f;
    //读取CORDIC_RDATA寄存器的数据是“q1.31格式”的数据,经过转换后,就是正弦值
    //由于“模为0x80000000”,也就是2147483648,除以“模”后就得到正弦值,范围为[-1,1]

}

//函数功能:测试DAC输出正弦波形
void Test_DAC_Output_CORDIC_Sin(void)
{
    __IO float i=0.0f;
    __IO uint16_t ADC_value1=0x00;

    while(1)
    {
        for(i=0.0f;i<360.0f;i=i+0.1f)
        {
            ADC_value1=((sin_f(i)+1.65f)/3.3f)*4095.0f;
            //使用硬件实现,需要3.72ms完成一个for循环
            //设置偏置电压为1.65V,当sin_f(i)=0,ADC的值为1.65V

            HAL_DAC_SetValue(&DAC_1_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,ADC_value1);
            //设置DAC输出电压: ADC_value1 * 3.3 / (0xFFF+1),单位为“V”
        }
    }
}

//函数功能:测试DAC输出正弦波形
void Test_DAC_Output_math_Sin(void)
{
    __IO float i=0.0f;
    __IO uint16_t ADC_value1=0x00;

    while(1)
    {
        for(i=0.0f;i<360.0f;i=i+0.1f)
        {
      ADC_value1=( ( sin(i*3.1415926/180)+1.65f )/3.3f )*4095.0f;
            //使用数学函数,需要172ms完成一个for循环
            HAL_DAC_SetValue(&DAC_2_Handler,DAC_CHANNEL_1,DAC_ALIGN_12B_R,ADC_value1);
            //设置DAC输出电压: ADC_value1 * 3.3 / (0xFFF+1),单位为“V”
        }
    }
}

 3、测试结果

在没有任何延时的条件下,硬件产生正弦波形周期比软件产生正弦波形要小很多。,说明硬件响应速度比软件快。

相关文章:

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值&#xff0c;从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1&#xff0c;无需映射&#xff0c;直接将它配置为模拟功能&#xff0c;就可以使用了。 PA6的附加功能为DAC2_OUT1&#xff0c;无需映射&#xff0c;直接将…...

哈希表的底层实现(2)---C++版

目录 链地址法Separate Chaining——哈希桶的模拟实现 超大重点分析&#xff1a; 两种方法对比 由于在上次的哈希表的底层实现(1)---C版已经详细的阐述了相关的结构和原理&#xff0c;哈希表的实现方法主要分为链地址法和开放定址法。开放定址法上次已经实现过了&#xff0c…...

算法知识点————【LRU算法】

思想&#xff1a;淘汰最久没有使用的 应用场景&#xff1a;手机清后台的时候先清最久没有使用的应用 设计一种数据结构&#xff1a;接收一个 capacity 参数作为缓存的最大容量&#xff0c;然后实现两个 API&#xff0c;一个是 put(key, val) 方法存入键值对&#xff0c;另一个是…...

记一次MySQL视图查询优化的经验

背景&#xff1a;库房系统项目迁移&#xff0c;两个版本的结构发生了很大变化&#xff0c;新版本的库存系统在开发阶段由于数据量小&#xff0c;根据看不出查询的性能问题&#xff0c;还沾沾自喜的想新版本多好。但是在做同步之后&#xff08;规则变更&#xff0c;需要插入很多…...

Cloudways搭建WordPress外贸独立站完整教程(1)

验证邮件发送完成后&#xff0c;就等待Cloudways的回复邮件&#xff0c;一般24小时之内就会收到激活的邮件。 Cloudways账号升级 激活成功后还需要账户升级&#xff0c;Cloudways提供了为期3天的免费试用体验。如果在试用期结束之前未绑定信用卡以升级账户&#xff0c;试用期…...

Delphi5数据控制组件——查询

文章目录 效果图参考查询Free方法Close方法总结通俗理解 完整代码 效果图 参考 本文是在上一篇的基础上&#xff0c;将查询页面重新写一次。 查询 {点击查询} procedure TForm2.Button1Click(Sender: TObject); vartj,tj1,tj2,tj3,tj4,tj5,tj6,tj7:string; begin//按照工号查…...

git pull之后发现项目错误,如何回到之前的版本方法

目录 首先我们打开小程序的cmd的黑窗口&#xff0c;git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已经返回了之前的6daaa2e的版本了 首先我们打开小程序的cmd的黑窗口&#xff0c;git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已…...

防跌倒识别摄像机

防跌倒识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备&#xff0c;旨在通过实时监测和分析监控画面中的行为动作&#xff0c;及时发现并预防跌倒事件的发生。这种摄像机在医疗、养老院、家庭等场所有着广泛的应用前景。 防跌倒识别摄像机在医疗领域具有重要意义…...

MyQql性能诊断与实践

获取更多免费资料&#xff0c;见下图...

有序序列判断

描述 输入一个整数序列&#xff0c;判断是否是有序序列&#xff0c;有序&#xff0c;指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围&#xff1a;3 < n< 50 序列中的值都满足 1< val < 100 输入描述&#xff1a; 第一行输入一个整数N…...

【Kubernetes知识点问答题】健康检查

目录 1. Kubernetes 对集群 Pod 和容器健康状态如何进行监控和检测的。 2. 解释 LivenessProbes 探针的作用及其适用场景。 3. 解释 ReadinessProbe 探针的作用及其适用场景。 4. 解释 StartupProbe 探针的作用及其适用场景。 5. 说明 K8s 中 Pod 级别的 Graceful Shutdown…...

【Prometheus】PromQL数据类型以及常用的计算函数用法详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

STM32高级定时器生成互补PWM的原理与代码实现

文章目录 前言一 CubeMx配置1.1 TIM1 Mode and Configuration1.2 Paramter Settings 二 程序代码三 仿真分析总结 前言 互补 PWM&#xff08;Complementary PWM&#xff09;是指一对逻辑状态互为反相的 PWM&#xff08;脉冲宽度调制&#xff09;信号。这种信号配置常见于电机控…...

双指针题总结

双指针题总结 hot100移动零盛水最多的容器三数之和接雨水最小覆盖子串 hot100 移动零 题目链接&#xff1a; 283.移动零 代码&#xff1a; class Solution {public void moveZeroes(int[] nums) {int slow 0;for (int fast 0; fast < nums.length; fast ){if (nums[fas…...

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8068 标注数量(xml文件个数)&#xff1a;8068 标注数量(txt文件个数)&#xff1a;8068 标注…...

JVM3-双亲委派机制

目录 概述 作用 如何指定加载类的类加载器&#xff1f; 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制&#xff…...

经典文献阅读之--DEviLOG(使用合成数据和真实世界数据的数据驱动占用网格映射基于Transformer的BEV方案量产方案)

0. 简介 在自动驾驶汽车&#xff08;AV&#xff09;的感知任务中&#xff0c;数据驱动的方法往往优于传统方法。这促使我们开发了一种基于数据的方法来从激光雷达测量中计算占用网格地图&#xff08;OGM&#xff09;。我们的方法扩展了之前的工作&#xff0c;使得估计的环境表…...

ssh之登录服务器后,自动进入目录(四十七)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

如何看待IBM中国研发部裁员?

背景&#xff1a; 近日&#xff0c;IBM中国宣布撤出在华两大研发中心&#xff0c;引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展&#xff0c;也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对这一突如其来的变化&…...

计算机毕业设计选题推荐-土地承包管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...