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

STM32-DAC数模转换

DAC数模转换:将数字信号转换成模拟信号

特性:2个DAC转换器每个都拥有一个转换通道

8位或12位单调输出(8位右对齐;12位左对齐右对齐)

双ADC通道同时或者分别转换

外部触发中断

  1.  电压源
  2. 控制部分(外部触发3个APB1;不使用1个APB1)
  3. 外部触发
  4. 输出:DAC1-PA4;DAC2-PA5

软件设计流程:

  • 使能端口以及DAC时钟;设置引脚为模拟输入
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC时钟GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟量输入
  • 初始化DAC,设置DAC工作模式(触发选择;DAC波形发生;屏蔽\幅值选择器;DAC输出)
typedef struct
{uint32_t DAC_Trigger;                      /*!< 指定所选DAC通道的外部触发源此参数可以是 @ref DAC_trigger_selection 中的一个值 */uint32_t DAC_WaveGeneration;               /*!< 指定是否生成DAC通道的噪声波或三角波,或不生成任何波形此参数可以是 @ref DAC_wave_generation 中的一个值 */uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< 指定噪声波生成的LFSR掩码或DAC通道的三角波最大生成幅度此参数可以是 @ref DAC_lfsrunmask_triangleamplitude 中的一个值 */uint32_t DAC_OutputBuffer;                 /*!< 指定是否启用或禁用DAC通道的输出缓冲器此参数可以是 @ref DAC_output_buffer 中的一个值 */
}DAC_InitTypeDef;
  • 使能DAC输出通道
	DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1
  • 设置DAC输出值
/*** @brief  设置DAC通道1的转换数据* @param  DAC_Align: 指定数据对齐方式*         该参数可以是 @ref DAC_data_align 中的一个值,例如:*           - DAC_Align_8b_R: 8位右对齐*           - DAC_Align_12b_L: 12位左对齐*           - DAC_Align_12b_R: 12位右对齐* @param  Data: 要转换的数字值*         - 对于8位右对齐,有效范围为0~255(0x00~0xFF)*         - 对于12位右对齐,有效范围为0~4095(0x000~0xFFF)*         - 对于12位左对齐,有效范围同样为0~4095,但数据需左移4位* @retval 无* @note   写入的数据将在下次触发事件(如软件触发或定时器触发)时转换为模拟电压*         转换后的电压值 = (Data / 满量程值) × VREF+*         例如,对于12位DAC且VREF+=3.3V,Data=2048对应电压1.65V*/
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)

代码如下:

#include "dac.h"/*******************************************************************************
* 函 数 名         : DAC1_Init
* 函数功能		   : DAC1初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DAC1_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;DAC_InitTypeDef DAC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//DAC_1GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟量输入GPIO_Init(GPIOA,&GPIO_InitStructure);DAC_InitStructure.DAC_Trigger=DAC_Trigger_None;	//不使用触发功能 TEN1=0DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;	//DAC1输出缓存关闭 BOFF1=1DAC_Init(DAC_Channel_1,&DAC_InitStructure);	 //初始化DAC通道1DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC通道1}

主函数代码:(按键按下,DAC写入转换值)

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "dac.h"/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()
{u8 i=0;u8 key;int dac_value=0;u16 dacval;float dac_vol;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组LED_Init();USART1_Init(115200);KEY_Init();DAC1_Init();while(1){key=KEY_Scan(0);//单次按下if(key==KEY_UP_PRESS){dac_value+=400;if(dac_value>=4000){dac_value=4095;}DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);//写入4095}else if(key==KEY1_PRESS){dac_value-=400;	if(dac_value<=0){dac_value=0;}DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);			}i++;if(i%20==0){LED1=!LED1;}if(i%50==0){dacval=DAC_GetDataOutputValue(DAC_Channel_1);dac_vol=(float)dacval*(3.3/4096);printf("输出DAC电压值为:%.2fV\r\n",dac_vol);}delay_ms(10);	}
}

http://www.dtcms.com/a/274070.html

相关文章:

  • 将英语转化为语音 英文转音频 英语转语音朗读
  • 嵌入式八股文之 GPIO
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (三)RISC-V架构深度解剖(下)
  • FPGA实现SDI转LVDS视频发送,基于GTX+OSERDES2原语架构,提供2套工程源码和技术支持
  • Spring注解IoC与JUnit整合实战
  • MyBatis-Plus通用中等、大量数据分批查询和处理
  • 蔚来测开一面:HashMap从1.7开始到1.8的过程,既然都解决不了并发安全问题,为什么还要进一步解决环形链表的问题?
  • XPath 语法【Web 自动化-定位方法】
  • [java][springboot]@PostConstruct的介绍和用法
  • 机器学习基础知识【 激活函数、损失函数、优化器、 正则化、调度器、指标函数】
  • AI加持的开源知识库新秀:PandaWiki,如何用它打造智能化文档系统?
  • 「日拱一码」024 机器学习——防止过拟合
  • 【yolo】模型训练参数解读
  • 哪个ai写论文比较好?实测推荐这6大AI论文写作神器
  • CCF-GESP 等级考试 2025年6月认证C++五级真题解析
  • 2025年值得推荐的5款 AI赋能企业级项目管理软件工具大盘点!
  • Linux:多线程---同步生产者消费者模型
  • 【尝试】基于YoloV8做安全帽识别
  • 12. 说一下 https 的加密过程
  • 2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛-B题 疾病的预测与大数据分析
  • CCN-508 规范
  • Web 网站性能优化之 Nginx 优化指南
  • 提示工程:突破Transformer极限的计算科学
  • S7-1200 系列 PLC 中 SCL 语言的 PEEK 和 POKE 指令使用详解
  • IDE 关联 Git 操作
  • Java使用OSHI获取服务器信息
  • 如何在报表开发工具FastReport .NET 中构建和连接 Firebird 插件?
  • SpringBoot JWT
  • 异步技术:Web 性能优化的核心引擎
  • crmeb多门店对接拉卡拉支付小程序聚合收银台集成全流程详解