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”的正弦值,从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。 PA6的附加功能为DAC2_OUT1,无需映射,直接将…...

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

算法知识点————【LRU算法】
思想:淘汰最久没有使用的 应用场景:手机清后台的时候先清最久没有使用的应用 设计一种数据结构:接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是…...
记一次MySQL视图查询优化的经验
背景:库房系统项目迁移,两个版本的结构发生了很大变化,新版本的库存系统在开发阶段由于数据量小,根据看不出查询的性能问题,还沾沾自喜的想新版本多好。但是在做同步之后(规则变更,需要插入很多…...

Cloudways搭建WordPress外贸独立站完整教程(1)
验证邮件发送完成后,就等待Cloudways的回复邮件,一般24小时之内就会收到激活的邮件。 Cloudways账号升级 激活成功后还需要账户升级,Cloudways提供了为期3天的免费试用体验。如果在试用期结束之前未绑定信用卡以升级账户,试用期…...

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

git pull之后发现项目错误,如何回到之前的版本方法
目录 首先我们打开小程序的cmd的黑窗口,git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已经返回了之前的6daaa2e的版本了 首先我们打开小程序的cmd的黑窗口,git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已…...

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

MyQql性能诊断与实践
获取更多免费资料,见下图...

有序序列判断
描述 输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围:3 < n< 50 序列中的值都满足 1< val < 100 输入描述: 第一行输入一个整数N…...
【Kubernetes知识点问答题】健康检查
目录 1. Kubernetes 对集群 Pod 和容器健康状态如何进行监控和检测的。 2. 解释 LivenessProbes 探针的作用及其适用场景。 3. 解释 ReadinessProbe 探针的作用及其适用场景。 4. 解释 StartupProbe 探针的作用及其适用场景。 5. 说明 K8s 中 Pod 级别的 Graceful Shutdown…...

【Prometheus】PromQL数据类型以及常用的计算函数用法详解
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

STM32高级定时器生成互补PWM的原理与代码实现
文章目录 前言一 CubeMx配置1.1 TIM1 Mode and Configuration1.2 Paramter Settings 二 程序代码三 仿真分析总结 前言 互补 PWM(Complementary PWM)是指一对逻辑状态互为反相的 PWM(脉冲宽度调制)信号。这种信号配置常见于电机控…...
双指针题总结
双指针题总结 hot100移动零盛水最多的容器三数之和接雨水最小覆盖子串 hot100 移动零 题目链接: 283.移动零 代码: 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类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8068 标注数量(xml文件个数):8068 标注数量(txt文件个数):8068 标注…...

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

经典文献阅读之--DEviLOG(使用合成数据和真实世界数据的数据驱动占用网格映射基于Transformer的BEV方案量产方案)
0. 简介 在自动驾驶汽车(AV)的感知任务中,数据驱动的方法往往优于传统方法。这促使我们开发了一种基于数据的方法来从激光雷达测量中计算占用网格地图(OGM)。我们的方法扩展了之前的工作,使得估计的环境表…...

ssh之登录服务器后,自动进入目录(四十七)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
如何看待IBM中国研发部裁员?
背景: 近日,IBM中国宣布撤出在华两大研发中心,引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展,也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对这一突如其来的变化&…...

计算机毕业设计选题推荐-土地承包管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定、智能推荐)
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...