21.DAC数模转换

news2024/9/22 21:19:08

1.STM32 DAC介绍:

DAC(Digital to analog converter)即数字模拟转换器,它可以将数字信号转换为模拟信号。

DAC主要特性:
  • 2个DAC转换器,每个转换器对应1个输出通道;
  • 8位或者12位单调输出;
  • 12位模式下数据左对齐或者右对齐;
  • 同步更新功能;
  • 噪声波形生成;
  • 三角波形生成;
DAC介绍:
  • 双DAC通道同时或者分别转换;
  • 每个通道都有DMA功能;
  • 外部触发转换;
  • 输入参考电压VREF+;
STM32 DAC结构框图:

① 第一部分:电压输入引脚:

VDDA和VSSA是模块的供电管脚,VREF+是DAC模块的参考电压,三个管脚都接到了3.3V,因此DAC的参考电压依然是0~3.3V,想要电压得到一定的精度更高,可以设置一个基准电压源;

② 第二部分:DAC转换:
③ 第三部分:DAC触发和输出:

外部触发方式:当DAC接口在所选定时器触发或外部中断线上升沿检测到上升沿的时候,DAC就可以将DHRx寄存器的值,存储到最后一个数据,就会转移到DORx寄存器中,发生触发后,会经过3个时钟周期,寄存器内就会得到更新,数模转换器输出;

内部触发方式:一旦触发就会开启转换,将DHRx的值经过一个APB1的时间加载到DORx中;

④  第四部分:DAC 的输出通道:

DAC1->PA4;

DAC2->PA5;

为了避免寄生电流的消耗,应当将DAC对应的通道管脚,配置为模拟输入模式;当配置了模拟输入模式后,对DAC的输出功能进行使能,它会自动将对应的管脚自动的连接到输出通道;

电压计算:DACout=(Vref+)*DORx/4095;

2.STM32 DAC配置步骤:

DAC相关库函数在stm32f10x_dac.c和stm32f10x_dac.h文件中;
  1. 使能端口及DAC时钟,设置引脚为模拟输入:RCC_APB2PeriphClockCmd()、RCC_APB1PeriphClockCmd();        
  2. 初始化DAC,设置DAC工作模式:void DAC_Init();
  3. 使能DAC的输出通道:void DAC_Cmd();
  4. 设置DAC的输出值:DAC_SetChannel1Data()、uint16_t DAC_GetDataOutputValue();

3 .DAC数模转换:

通过KEY_UP与KEY1按键控制STM32 DAC1输出电压,通过串口将DAC1输出的电压值打印显示,LED0指示灯闪烁提示系统运行。

(1)原理图:

 

(2)主函数:

#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart1.h"
#include "dac.h"



int main(){
    
    u8 i=0;    
    u8 key=0;
    int DAC_value=0;          //DAC值增减的标志
    u16 DAC_val=0;            //存储读取的DAC1通道1的值
    float DAC_vol=0.0f;       //存储DAC所对应的电压值    
    
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置分组
    delay_init();                                        //延时初始化
    LED_Init();  
    KEY_Init();                                          //按键初始化
    usart1_Init(9600);                                   //串口通信初始化
    DAC1_Init();                                         //DAC1的初始化
   
    while(1)
       {
          
          key=KEY_Scan(0);                               //扫描按键
          
          if(key==3)                                     //判断按键WK_UP是否被按下
          {
             DAC_value+=400;
             if(DAC_value>4000)
             {
                DAC_value=4095;                                         //判断,当DAC_value大于4000时,DAC_value=4095
             }
             DAC_SetChannel1Data(DAC_Align_12b_R,DAC_value);            //输出DAC的值,12位右对齐
             
          }
          else if(key==2)                                //判断按键KEY1是否被按下
          {
             DAC_value-=400;  
             if(DAC_value<=0)                            
             {
                DAC_value=0;
             }
             DAC_SetChannel1Data(DAC_Align_12b_R,DAC_value);            //输出DAC的值,12位右对齐
             
          }
          
          //系统指示灯闪烁
          i++;
          if(i%20==0)
          {
             LED0=!LED0;
          }
          
          //每隔1s打印一次
          if(i%100==0)
          {
             DAC_val=DAC_GetDataOutputValue(DAC_Channel_1);             //读取DAC1通道1的值
             DAC_vol=(float)DAC_val*(3.3/4095);                         //将输出的DAC值转换为所对应的电压值
             
             printf("当前的DAC对应的电压值:%.2f V\r\n",DAC_vol);
             printf("\r\n");
             
          }
          delay_ms(10);
          
      }       
}

(3)头文件:

#ifndef __DAC_H
#define __DAC_H


typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;

void DAC1_Init(void);         //DAC1的初始化


#endif

(4)DAC数模转换功能函数:

#include "stm32f10x.h"
#include "dac.h"



/*
   功能:DAC1的初始化
   变量:无
   返回值:无
*/
void DAC1_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct;
   DAC_InitTypeDef DAC_InitStruct;
   
   
   //1.使能端口时钟和DAC时钟,并设置引脚模式
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
   
   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;           //模拟输入
   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;               //PA4
   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;       //速度
   GPIO_Init(GPIOA,&GPIO_InitStruct);
   
   //2.初始化DAC,设置DAC工作模式
   DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;       //屏蔽/幅值选择器
   DAC_InitStruct.DAC_OutputBuffer=DAC_OutputBuffer_Disable;                  //DAC输出缓存->不使用缓存
   DAC_InitStruct.DAC_Trigger=DAC_Trigger_None;                               //触发方式->不使用外部触发
   DAC_InitStruct.DAC_WaveGeneration=DAC_WaveGeneration_None;                 //DAC波形发生->不使用波形发生
   DAC_Init(DAC_Channel_1,&DAC_InitStruct);                                   //DAC1的通道1
   
   //3.设置DAC的输出值
   DAC_SetChannel1Data(DAC_Align_12b_R,0);                             //12位右对齐,设置值=0
   
   //4.使能DAC1
   DAC_Init(DAC_Channel_1,&DAC_InitStruct);
     
}


(5)实验结果:

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

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

相关文章

Coggle 30 Days of ML(23年7月)任务五:XGBoost训练与预测

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务五&#xff1a;XGBoost训练与预测 任务五&#xff1a;使用TFIDF特征和XGBoost完成训练和预测 说明&#xff1a;在这个任务中&#xff0c;你需要使用TFIDF特征和XGBoost算法完成训练和预测&#xff0c;进一步提升文本…

Matlab数学建模实战——(Lokta-Volterra掠食者-猎物方程)

1.题目 问题1 该数学建模的第一问和第二问主要是用Matlab求解微分方程组&#xff0c;直接编程即可。 求解 Step1改写 y(1)ry(2)f Step2得y的导数 y(1).2y(1)-ay(1)*y(2)y(2).-y(2)a*y(1)*y(2) Step3编程 clear; a0.01; F(t,y)[2*y(1)-a*y(1)*y(2);-y(2)a*y(1)*y(2)]; […

【Mac】Mac 通过路径找到对应的文件夹

mac 的快捷键 复制文件夹或文件全路径 命令&#xff1a;command Option C 跳转文件夹或文件 命令&#xff1a;command shift G 其他待补充

hexo #02 基本操作

本篇主要步骤 1、创建博客 1、创建博客 使用 $ hexo new [layout] <title>命令创建一篇新的博客。 PS hexo> npx hexo new post "test" Debugger attached. Debugger attached. INFO Validating config INFO Created: D:\hexo\source\_posts\test.md Wa…

MySQL表单查询以及多表查询

1.单表查询 CREATE TABLE emp ( empno int(4) NOT NULL, ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, mgr int(4) NULL DEFAULT NULL, hi…

基于51单片机的羽毛球计分器设计

功能&#xff1a; 本实例是基于51单片机的羽毛球计分器&#xff0c;主要硬件由51单片机最小系统&#xff0c;LCD1602液晶屏电路&#xff0c;按键电路构成。 1.本设计选用LCD1602液晶屏作为显示器件&#xff0c;用于记录两队的分数。 2.按照设计的功能模块共选用8个按键&#xf…

【软件测试】Git查看commit的提交历史(详细)一点即通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 查看提交历史 在提…

【MATLAB第53期】基于MATLAB的TSK模糊神经网络时间序列预测模型,含短期预测未来功能

【MATLAB第53期】基于MATLAB的TSK模糊神经网络时间序列预测模型&#xff0c;含短期预测未来功能 一、效果展示 二、数据设置 数据采用一列数据滑动窗口设置为5 &#xff0c;可自行设置70%训练30%测试预测未来值为10 &#xff0c;可自行设置&#xff0c;控制10以内 三、模型…

zabbix proxy的配置及zabbix实现高可用(监控 windows,java应用,SNMP等)

目录 zabbix proxy 分布式代理服务器部署zabbix proxy 代理服务器部署 Zabbix 高可用集群Zabbix 监控 Windows 系统Zabbix 监控 java 应用Zabbix 监控 SNMP zabbix proxy 分布式代理服务器 zabbix 分布式代理服务器&#xff0c;可以代替zabbix server 采集性能和可用性数据。z…

C++的范围for语句详解 附易错实例

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

匿名管道的使用示例

目录 整体框架 通信步骤 创建管道 ​编辑创建子进程&关闭相应的fd ​编辑 进程间通信 父子进程通信之间四种场景 实现父亲读&#xff0c;孩子写的进程间通信 管道通信的使用场景样例实现 整体框架 通信步骤 创建管道 pipe的参数为输出型参数&#xff0c;返回读写端…

从小白到大神之路之学习运维第55天--------shell脚本实例应用

第三阶段基础 时 间&#xff1a;2023年7月7日 参加人&#xff1a;全班人员 内 容&#xff1a; shell实例 目录 shell脚本应用&#xff1a; 一、shell脚本 二、环境变量的基本使用 三、条件测试 shell脚本应用&#xff1a; 一、shell脚本 1、shell脚本的作用shell解…

MySql索引结构介绍

文章目录 1.索引概述2. 索引结构2.1 二叉树与红黑树索引结构2.2 B-Tree索引结构2.3 BTree介绍2.4 Hash索引介绍 1.索引概述 索引的概念 索引的演示 索引的优缺点 2. 索引结构 索引结构在不同的存储引擎中的支持情况&#xff0c;我们平时所说的索引&#xff0c;如果没有特殊的…

深度学习各类优化器大总结

一、优化算法设计原理 深度学习中的优化算法采用的原理是梯度下降法&#xff0c;即最小化目标函数 J ( θ ) J(\theta) J(θ)&#xff0c;最优化的求解过程&#xff0c;首先求解目标函数的梯度 ∇ J ( θ ) \nabla J(\theta) ∇J(θ)&#xff0c;然后将参数 θ \theta θ 向…

Java代码风格统一

Java代码风格统一 IDEA快捷键失效IDEA配置代码风格 IDEA快捷键失效 Ctr Shift F 这里是搜狗输入法影响的。 Ctr Shift L 这个是因为网易云的问题。 IDEA配置代码风格 统一代码风格是必须的&#xff0c;因为我们需要时不时的格式化代码&#xff0c; 如果每个人的开发风格…

程序员到公务员:从入门到上岸

有句话叫做&#xff0c;“打不过就加入”。尽管当下我们国家的体制还存在种种的问题&#xff0c;不过&#xff0c;大家还都是挤破脑袋想进体制。毕竟&#xff0c;某种程度上来说&#xff0c;体制内还真是香~ 我记得读大学那会&#xff0c;教我们C语言的老师&#xff0c;就和我…

Linus I/O之io_ring

由于调用系统调用时&#xff0c;会从用户态切换到内核态&#xff0c;从而进行上下文切换&#xff0c;而上下文切换会消耗一定的 CPU 时间。 io_uring 为了减少或者摒弃系统调用&#xff0c;采用了用户态与内核态 共享内存 的方式来通信。 第一步&#xff1a;应用程序通过向 io…

FreeRTOS ~(七)互斥量 ~ (2/3)互斥量解决优先级反转问题

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 FreeRTOS ~&#xff08;六&#xff09;信号量 ~ &#xff08;2/…

openpnp - 用空调压缩机改真空泵

文章目录 openpnp - 用空调压缩机改真空泵概述笔记备注END openpnp - 用空调压缩机改真空泵 概述 原来设备用的真空泵是AP200C/V 这个商品标称是48DB的噪音, 实际用的时候, 噪音很大, 应该快70DB了, 放在屋子里很吵. 如果仅仅是太吵, 可能也忍了. 关键是这个真空泵有强干扰…

JS逆向之——天翼云登录

JS逆向之——天翼云登录 前言 此文章仅用于技术交流&#xff0c;欢迎指出相关问题&#xff0c;感兴趣的可以关注我&#xff0c;有相关python逆向问题可以私信交流讨论。 目标与目的 目标网站&#xff1a;天翼云登录 目的&#xff1a;通过构建登录参数&#xff0c;完成天翼…