STM32 DAC+串口

news2024/11/23 12:21:41

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、DAC是什么?
  • 二、STM32 DAC
    • 1.什么型号有DAC
    • 2. 简介
    • 3. 主要特点
    • 4. DAC框图
    • 5. DAC 电压范围和引脚
  • 三、程序步骤
    • 1. 开启DAC时钟
    • 2. 配置引脚 PA4 PA5 模拟输入
    • 3. 初始化DAC
    • 5. 使能DAC
    • 6. 写入数字电压
    • 7. 触发转换
    • 8测试结果
  • 四、加入串口互动
    • 1.定义发送字符格式:
    • 方案1 比较符合人性
    • 方案2,用mv输出,没有小数,提取会更简单
    • 2.获取字符串
    • 3.解释字符串
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

前面学习了STM32的ADC,掌握了模拟信号如何转化成数字信号,现在学习如何将数字信号转换成模拟信号。

目标:串口输入3.3v->stm32->DAC->3.3V ->ADC ->串口 ->电压
举例: 3.3v -> "3.3v"字符串->解释前面的数字 3.3怎么给DAC

具体:(ADC) PA0 ->(DAC) ?


提示:以下是本篇文章正文内容,下面案例可供参考

一、DAC是什么?

示例:DAC是数字模拟转换器(Digital to Analog Converter)的缩写,它是一种将数字信号转换为模拟信号的设备。

DAC数模转换实验工作原理

https://www.bilibili.com/video/BV11Z4y1z7mP/?spm_id_from=333.337.search-card.all.click

二、STM32 DAC

1.什么型号有DAC

在这里插入图片描述

查看数据手册
在这里插入图片描述
在这里插入图片描述

2. 简介

在这里插入图片描述

3. 主要特点

在这里插入图片描述

4. DAC框图

在这里插入图片描述

5. DAC 电压范围和引脚

在这里插入图片描述

三、程序步骤

1. 开启DAC时钟

在这里插入图片描述

在这里插入图片描述

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

2. 配置引脚 PA4 PA5 模拟输入

在这里插入图片描述在这里插入图片描述

	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_4;          //
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;     //模拟输入
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x

3. 初始化DAC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

	//3.初始化DAC
	
	//DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude=
	DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
	DAC_InitStruct.DAC_Trigger=DAC_Trigger_Software; //软件触发
	DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None;
	
	DAC_Init(DAC_Channel_1,&DAC_InitStruct);

5. 使能DAC

在这里插入图片描述

DAC_Cmd(DAC_Channel_1, ENABLE);

6. 写入数字电压

在这里插入图片描述
在这里插入图片描述

DAC_SetChannel1Data(DAC_Align_12b_R, 2048); // 12位 电压范围  0-4095

7. 触发转换

在这里插入图片描述
在这里插入图片描述

 DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);//软件使能转换

完整初始化参考

void dac_init()
{
     GPIO_InitTypeDef GPIO_InitStruct;
	 DAC_InitTypeDef DAC_InitStruct;
	
	//1.开时钟
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
	// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
	//2. 配置位模拟输入
	
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_4;          //
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;     //模拟输入
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x
	
	//3.初始化DAC
	
	//DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude=
	DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
	DAC_InitStruct.DAC_Trigger=DAC_Trigger_Software; //软件触发
	DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None;
	
	DAC_Init(DAC_Channel_1,&DAC_InitStruct);
	 // 4. 使能DAC
	
	DAC_Cmd(DAC_Channel_1, ENABLE);
	
	DAC_SetChannel1Data(DAC_Align_12b_R, 2048); // 12位 电压范围  0-4095
	
	 DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);//软件使能转换
		
}

程序框架

void main
{
	ADC_init();
	uart_init();
	DAC_init();
	
	while(1)
	{
		//adc 读取
		//发送串口
	}
}

8测试结果

***

在这里插入图片描述

四、加入串口互动

1.定义发送字符格式:

方案1 比较符合人性

“DAC输出:3.3v” 则输出3.3v
“DAC输出:1.65v” 则输出1.65v

方案2,用mv输出,没有小数,提取会更简单

“DAC输出:3300mv” 则输出3300mv
“DAC输出:1650v” 则输出1650mv

2.获取字符串

串口中断获取

3.解释字符串

举例
“DAC输出:3.3v” 在字符串种查找 DAC关键字,然后再找到 ':'从这里 获取后面的’3.3’字符,直到’v’停止将获取的字符 3.3 转换成实际数字,
3.3 在转换成数字电压

字符转整型STM32史上最短 字符转整形 简简单单

https://blog.csdn.net/weixin_51102592/article/details/121125622?app_version=6.2.4&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22121125622%22%2C%22source%22%3A%22ganhui13000%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app

#include "string.h"
#include "stdlib.h"
u8 DATA[200]="X12Y34Y56Y78";
int shuju_chuli(const char *shuju,char zifu )
{
	char *shu_ju_1=strchr(shuju,zifu)+1;			//数据
	return atoi(shu_ju_1); 					//数值
}

int shuju_chuli1(const char *shuju,char zifu )
{
	char *shu_ju_1=strchr(shuju,zifu)+1;			//数据
	char *shu_ju_2=strchr(shu_ju_1,zifu)+1;			//数据
	return atoi(shu_ju_2); 					//数值
}

	printf("X是:%d\r\n",shuju_chuli((const char*)DATA,'X'));
	printf("y是:%d\r\n",shuju_chuli((const char*)DATA,'Y'));
	printf("Y1是:%d\r\n",shuju_chuli1((const char*)DATA,'Y'));

总结

DAC的原理,STM32DAC的特点,STM32DAC实操,用ADC和DAC闭环,实现了ADC和DAC 的检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1317902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数学建模】《实战数学建模:例题与讲解》第十二讲-因子分析、判别分析(含Matlab代码)

【数学建模】《实战数学建模:例题与讲解》第十二讲-因子分析、判别分析(含Matlab代码) 基本概念时间判别费歇判别贝叶斯判别 习题10.31. 题目要求2.解题过程3.程序4.结果 习题10.6(1)1. 题目要求2.解题过程——对应分析…

Stable-Diffusion|从图片反推prompt的工具:Tagger(五)

stable-diffusion-webui-wd14-tagger 前面几篇: Stable-Diffusion|window10安装GPU版本的 Stable-Diffusion-WebUI遇到的一些问题(一) 【Stable-Diffusion|入门怎么下载与使用civitai网站的模型(二)】 Stable-Diffusi…

PyQt6 QDial旋钮控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

Linux----文件权限命令

1. chmod命令的介绍 命令说明chmod修改文件权限 chmod修改文件权限有两种方式: 字母法数字法 2. chmod 字母法的使用 角色说明: 角色说明uuser, 表示该文件的所有者ggroup, 表示用户组oother, 表示其他用户aall, 表示所有用户 权限设置说明: 操作符说明增加权限-撤销权…

性能测试之Locust(完整版)

官方文档:Locust说明文档 一、Locust简介 1、定义 Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程&#xff08…

什么软件可以压缩视频大小?超级简单

什么软件可以压缩视频大小?当我们想将视频上传到网上时,有时候会遇到视频因为体积太大而无法上传的问题,这种情况就需要将视频进行压缩了。那什么软件可以压缩视频大小呢?下面小编就来为大家介绍压缩视频的方法,支持批…

SpringBoot+FastJson 优雅的过滤 Response Body

Spring 源码系列 1、Spring 学习之扩展点总结之后置处理器(一) 2、Spring 学习之扩展点总结之后置处理器(二) 3、Spring 学习之扩展点总结之自定义事件(三) 4、Spring 学习之扩展点总结之内置事件&#xf…

项目实战:自动驾驶之方向盘操纵

项目介绍 根据汽车前方摄像头捕捉的画面,控制汽车方向盘转动的方向和角度,这是自动驾驶要解决的核心问题。这个项目主要是通过使用深度神经网络解决一个回归问题。不同于分类、识别场景,回归问题中神经网络输出的是一个连续的值。 通过这个项目的学习,可以将神经网络用于通…

Flink系列之:大状态与 Checkpoint 调优

Flink系列之:大状态与 Checkpoint 调优 一、概述二、监控状态和 Checkpoints三、Checkpoint 调优四、RocksDB 调优五、增量 Checkpoint六、RocksDB 或 JVM 堆中的计时器七、RocksDB 内存调优八、容量规划九、压缩十、Task 本地恢复十一、主要(分布式存储…

PADS9.5 : 原图绘图图纸尺寸下修改

原图绘图图纸尺寸下修改 图页边界线也要修改 如果二者选择不一致: 会出现下图所示情况:

Django和ECharts异步请求示例

前提条件 创建django项目,安装配置过程这里就不讲述了。 后端url http://127.0.0.1:8000/echarts/demo/ view视图函数 from django.http import HttpResponse import jsondef EchartsDemo(request):data {}categories ["衬衫","羊毛衫",&…

基于net6的zmq调试工具

0.前言 最近在做CS架构的上位机控制软件,服务端和客户端是通过zmq进行通讯的,网上现有的工具都是tcp、串口的调试工具,一直没有找到一个合适的zmq调试工具。就使用C#语言开发了这个简易的zmq调试工具,项目地址ZmqDebuggerTool。 …

这一篇就够了!全套SpringBoot教程02

SpringBoot运维实用篇 基础篇发布以后,看到了很多小伙伴在网上的留言,也帮助超过100位小伙伴解决了一些遇到的问题,并且已经发现了部分问题具有典型性,预计将有些问题在后面篇章的合适位置添加到本套课程中,作为解决方…

app分发平台哪个好点?手机app应用内测分发平台支持负载均衡的重要性

随着互联网的快速发展,内测分发平台扮演着越来越重要的角色。而在现代应用程序的开发和运营过程中,负载均衡技术是不可或缺的一部分。内测分发平台支持负载均衡对于提高系统的稳定性、可靠性和性能至关重要。那么什么是负载均衡又有哪些重要性。 图片来源…

FPGA设计时序约束十二、Set_Clock_Sense

目录 一、序言 二、Set Clock Sense 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 3.1 工程代码 3.2 无set_clock_sense 3.3 设置set_clock_sense 四、参考资料 一、序言 本章将介绍Set_Clock_Sense约束,在介绍约束之前&#xff0…

【上海大学数字逻辑实验报告】七、中规模元件及综合设计

一、实验目的 掌握中规模时序元件的测试。学会在Quartus II上设计序列发生器。 二、实验原理 74LS161是四位可预置数二进制加计数器,采用16引脚双列直插式封装的中规模集成电路,其外形如下图所示: 其各引脚功能为: 异步复位输…

cmd命令bat脚本隐藏执行窗口

家里一直都有远程开3389的需要,一直使用的是frp. 最近发现总是经常掉线。也不清楚原因,后调查出来原来是由于 我命令行窗口一般启动的比较多,有时候就会去点一下(选择复制内容),如下: 有时候…

解决:Invalid bound statement (not found): com.XXXXX.UserMapper.countUser

问题:Invalid bound statement (not found): com.XXXXX.UserMapper.countUser 原因:mapper.java和mapper.xml映射不上 解决方法: 1、在application.properties全局配置文件中没有加上映射mapper文件的配置,mapper为resources下的文件&…

可以给网站任意位置添加4个区块源码

在网站里添加html区块把html里的代码复制进去,然后把3、4、5行的CSS和JS修改成网站对应目录就行了

十七、如何将MapReduce程序提交到YARN运行

1、启动某个节点的某一个用户 hadoopnode1:~$ jps 13025 Jps hadoopnode1:~$ yarn --daemon start resourcemanager hadoopnode1:~$ jps 13170 ResourceManager 13253 Jps hadoopnode1:~$ yarn --daemon start nodemanager hadoopnode1:~$ jps 13170 ResourceManager 15062 Jp…