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…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...