STM32 DAC+串口

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

文章目录


前言

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

前面学习了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时钟

c 复制代码
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

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

c 复制代码
	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





c 复制代码
	//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

c 复制代码
DAC_Cmd(DAC_Channel_1, ENABLE);

6. 写入数字电压


c 复制代码
DAC_SetChannel1Data(DAC_Align_12b_R, 2048); // 12位 电压范围  0-4095

7. 触发转换


c 复制代码
 DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);//软件使能转换

完整初始化参考

c 复制代码
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);//软件使能转换
		
}

程序框架

c 复制代码
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={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"121125622"%2C"source"%3A"ganhui13000"}\&uLinkId=usr1mkqgl919blen\&utm_source=app

c 复制代码
#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 的检测。

相关推荐
2CM_Embed2 小时前
Altium Designer 原理图与 PCB 快速相互定位:Cross Probe 交叉探针
嵌入式硬件·pcb·altium designer·c2000
恒锐丰-罗生4 小时前
宽压大电流同步降压优选|CN3906 DC-DC 电源芯片,车载 / 工控 / IoT 全能供电方案
嵌入式硬件·硬件工程
happygrilclh7 小时前
STM32,串口单字节中断接受,每次上电后,会收到一个0x00的解决办法。
单片机·嵌入式硬件
智闲电子设计8 小时前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
zcmodeltech9 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
程序员与背包客_CoderZ10 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
嵌入式阿蔡11 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
天空'之城12 小时前
单片机基础核心知识点汇总(三)
单片机·嵌入式硬件
嵌入式阿蔡12 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
恒锐丰科技韩生13 小时前
率能 SS8847E|2.7~15V 双通道 H 桥电机驱动 ETSSOP16 散热封装 家电 / 打印 / 舞台灯光专用
嵌入式硬件·硬件工程