当前位置: 首页 > ds >正文

第二十八天-DAC数模转换实验

一、DAC模块简介

1、DAC概念

2、主要特点

二、DAC转化过程

上侧是一些外部触发和软件触发。

我们写数字到DHRx中,经过一定的周期,控制逻辑将数字信号发送给DORx,然后传送至转换器,经转换后,从DAC_OUTx输出。

三、DAC数据格式

四、DAC触发方式

五、DAC输出

DAC缓存减少输出阻抗,增强驱动能力。

输出阻抗大,驱动能力弱。

输出阻抗小,输出能力强。

六、DAC相关寄存器

七、详细实验

1、实验要求

使用ADC测DAC的电压。

KEY1按下时,增加0.1的电压值。

KEY0按下时,减少0.1的电压值。

支持连按。

1、硬件连接

将ADC引脚和DAC引脚用跳线帽连接在一起。

2、配置步骤

3、详细代码

①dac.h

#ifndef __DAC_H
#define __DAC_H#include "sys.h"u8 Dac_Init();
u16 Get_DigVal();
float Cov_VolVal(u16 DigVal);
void AddVolValue(float val);
void SubVolValue(float val);
u8 Dis_DigVal();#endif

②dac.c

#include "dac.h"
#include "lcd.h"
u8 Dac_Init()
{//时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA PA4初始化GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//DAC初始化DAC_DeInit();DAC_InitTypeDef DAC_InitStruct;DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;DAC_InitStruct.DAC_Trigger = DAC_Trigger_None;DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_Init(DAC_Channel_1,&DAC_InitStruct);//DAC_CmdDAC_Cmd(DAC_Channel_1,ENABLE);//初始化数值DAC_SetChannel1Data(DAC_Align_12b_R,1000);}u16 Get_DigVal()
{return DAC_GetDataOutputValue(DAC_Channel_1);
}//DigVal 0~4095
float Cov_VolVal(u16 DigVal)
{return (float)DigVal / 4096 * 3.3;
}void AddVolValue(float val)
{//反向计算增加值u16 DigValAdd = (float)val * 4096 / 3.3;u16 DigValOld = DAC_GetDataOutputValue(DAC_Channel_1);u16 DigValNew = DigValAdd + DigValOld;if(DigValNew >= 4096)DigValNew = 0;DAC_SetChannel1Data(DAC_Channel_1,DigValNew);
}
void SubVolValue(float val)
{//反向计算减小值u16 DigValSub = (float)val * 4096 / 3.3;u16 DigValOld = DAC_GetDataOutputValue(DAC_Channel_1);u16 DigValNew = DigValOld - DigValSub;if(DigValNew <= 4096)DigValNew = 0;DAC_SetChannel1Data(DAC_Channel_1,DigValNew);
}
u8 Dis_DigVal()
{u16 DigVal = Get_DigVal();float AnoVal = Cov_VolVal(DigVal);u8 AnoVal1 = AnoVal;u8 AnoVal2 = (AnoVal - AnoVal1) *10;LCD_ShowNum(144,50,DigVal,4,24);LCD_ShowNum(144,74,AnoVal1,1,24);LCD_ShowNum(168,74,AnoVal2,1,24);}

③main.c

#include "stm32f10x.h"
#include "rtc.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "wkup.h"
#include "adc.h"
#include "tsensor.h"
#include "lsensor.h"
#include "dac.h"
#include "key.h"/************************************************ALIENTEK 战舰STM32F103开发板实验0工程模板注意,这是手册中的新建工程章节使用的main文件 技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司  作者:正点原子 @ALIENTEK
************************************************/int main(void){	u16 t = 0;delay_init();uart_init(115200);LED_Init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RTC_Init();LCD_Init(); Adc_Init();Dac_Init();LCD_ShowString(60,50,200,24,24,"DACVAL:  ");LCD_ShowString(60,74,200,24,24,"DACVOL:  ");LCD_ShowString(156,74,200,24,24,".");LCD_ShowString(60,98,200,24,24,"ADCVAL:  ");LCD_ShowString(60,120,200,24,24,"    -  -  ");LCD_ShowString(60,174,200,24,24,"  :  :  ");while(1){++t;if(t % 100 == 0){LED0 =! LED0;}Dis_DigVal();Dis_Vol(ADC_Channel_1,10);//点击key0 加0.1if(KEY_Scan(1) == k0_pres){AddVolValue(0.1);}if(KEY_Scan(1) == k1_pres){SubVolValue(0.1);}delay_ms(10);}}

4、代码结果

http://www.xdnf.cn/news/19765.html

相关文章:

  • “便农惠农”智慧社区系统(代码+数据库+LW)
  • 【深度学习基础】深度学习中的早停法:从理论到实践的全面解析
  • OpenCV C++ 入门实战:从基础操作到类封装全解析
  • UART控制器——ZYNQ学习笔记14
  • QT中的HTTP
  • GSM8K 原理全解析:从数学推理基准到大模型对齐的试金石
  • 五、练习2:Git分支操作
  • 安卓版 Pad 搭载 OCR 证件识别:酒店入住登记的高效解法
  • 永磁同步电机无速度算法--高频脉振方波注入法(新型位置跟踪策略)
  • Meteor主题友链页面自研
  • QT中的TCP
  • HTML应用指南:利用GET请求获取全国招商银行网点位置信息
  • IS-IS的原理
  • MySQL 性能调优与 SQL 优化的核心利器
  • Windows 命令行:cd 命令1,cd 命令的简单使用
  • 【软件开发工程师の校招秘籍】
  • 安装nodejs安装node.js安装教程(Windows Linux)
  • 盲盒抽谷机小程序开发:如何用3D技术重构沉浸式体验?
  • 闭包的简单讲解
  • LeetCode 19: 删除链表的倒数第 N 个结点
  • 捡捡java——4、日志
  • 数据结构:单链表的应用(力扣算法题)第二章
  • MJ Prompt Tool-好用的Midjourney提示词工具
  • 如何测试瞬态电压抑制二极管性能是否达标?-ASIM阿赛姆
  • 同源策略--跨域
  • 盟接之桥说制造:浅谈本分和做正确的事情
  • HBase实战(一)
  • MFC应用防止多开
  • OpenCV 4.1.1 编译错误解决方案(cudaoptflow.hpp not found)
  • Day20 API