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

第二十八天-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.dtcms.com/a/361360.html

相关文章:

  • Java类和对象(下)
  • 【Doris入门】Doris数据表模型:明细模型(Duplicate Key Model)详解
  • shell——函数与数组
  • Selenium自动化测试框架
  • 艾莉丝努力练剑的创作纪念日:星河初启,牧梦长空
  • 如何做好出入库管理工作,好用的出入库管理软件有哪些
  • AI+PLM如何重构特种/高端复杂装备行业的工艺管理?
  • 大数据行业调研: 1列举大数据涉及到的各种行业,以及该行业未来发展的优势和劣势? 2列举大数据相关的岗位、岗位职责及其需要的专业技能?
  • ES6手录02-字符串与函数的扩展
  • 埃文科技亮相2025中部数字经济产业发展大会暨数智创新博览会
  • 华宇TAS应用中间件与长城科技两款产品完成兼容互认证
  • 深入浅出 HarmonyOS 应用开发:掌握 ArkTS 声明式 UI 与高效状态管理
  • 从零开始学习n8n-定时器+HTTP+飞书多维表格(上)
  • 基于高量子效率sCMOS相机的激光光斑衍射计算成像实验
  • 基于Flask的企业级产品信息管理系统技术实现笔记
  • Git中批量恢复文件到之前提交状态
  • 海康相机开发---HCNetSDK
  • 神经网络1——sklearn的简单实现
  • Qt::Q_INIT_RESOURCE用法
  • AUTOSAR进阶图解==>AUTOSAR_TPS_XMLSchemaProductionRules
  • 【ComfyUI】图像描述词润色总结
  • KL Loss
  • 生产者-消费者问题与 QWaitCondition
  • 深入探讨Java异常处理:受检异常与非受检异常的最佳实践
  • leetcode 1576 替换所有的问号
  • 深入Linux内核:IPC资源管理揭秘
  • Unity资源导入设置方式选择
  • 【Element Plus `el-select` 下拉菜单响应式定位问题深度解析】
  • 【数学建模学习笔记】缺失值处理
  • SRE 系列(五)| MTTK/MTTF/MTTV:故障应急机制的三板斧