IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【STM32】HAL库 CubeMX例程七---DAC(附工程源码) -> 正文阅读

[嵌入式]【STM32】HAL库 CubeMX例程七---DAC(附工程源码)

前期准备:

  1. STM32CubeMX
  2. STM32RCT6核心板
  3. IDE Keil(MDK-ARM)

STM32CubeMX部分

1. 配置时钟

在这里插入图片描述
选择STM32F103RCTx系列芯片,配置时钟的同时会自动配置IO口引脚
在这里插入图片描述
将HCLK设置为最大频率72MHz

2. 配置DAC

什么是DAC?

数模转换器,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器

简单来讲,就是将键盘敲上去的一堆数字,变成看不见摸不着的量

1. DAC的触发方式

  • 定时器触发:TIM2、TIM4、TIM5、TIM6、TIM7、TIM8共6个定时器可以触发
  • 外部中断触发:EXTI线路9
  • 软件触发

2. DAC可发生的波形:

  • 无波形(矩形波)
  • 噪声波形
  • 三角波

3. DAC输出电压:

DAC输出 = VREF x (DOR/4095)
2.4V < VREF范围 < 3.3V
DAC的引脚应该设置成模拟输入(AIN)模式

总结:

  • 2个DAC转换器
  • 每个转换器对应1个输出通道
  • 可采用DAC+DMA方式使用
  • 8位或者12位单调输出
  • 12位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双DAC通道时,可同时或单独转换
  • 外部触发转换

在这里插入图片描述

  • OUT1通道输出
  • External Trigger (外部中断EXTI9触发):不勾选
  • Output Buffer (使能DAC输出缓存):DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。
  • Tigger (触发方式): None(不需要其他任何的触发源,直接使用DAC_SetChannelxData(),就可以设定输出电压的大小。如果使用了软件触发,那么,每次在使用DAC_SetChannelxData()修改输出电压后,还需要调用DAC_SoftwareTriggerCmd(),目的是使能软件触发。由于:软件触发是硬件在一个APB1时钟周期后自动关断的,于是,每次修改输出电压的值后,都要调用DAC_SoftwareTriggerCmd()方法,才能生效。)

3. 工程生成

在这里插入图片描述
工程管理依旧是这几个选项,然后GENERATE CODE,STM32CubeMX部分完成。



Keil部分

//DAC函数
? HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);     //开启DAC输出
? HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);   //关闭DAC输出
? HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启,开启DAC的DMA输出
? HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC的DMA输出
? HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);  //设置DAC输出值
? uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel);  //获取DAC输出值

输出矩形波:

在main.c文件添加

  /* USER CODE BEGIN 2 */
  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);  //设置发生的电压
  HAL_DAC_Start(&hdac,DAC_CHANNEL_1);  //开启DAC1
  /* USER CODE END 2 */

输出电压 = ( 设定的DAC / 4096 ) * 3.3 V
=> ( 2.48 / 4096 ) * 3.3 ≈ 1.6 V

编译下载时需要选择相对应的下载器,勾选以下
在这里插入图片描述
运行即可

如图为PA4(DAC)引脚电压:
在这里插入图片描述

输出三角波:

重新点开CubeMX工程,重新配置
在这里插入图片描述

  • Tigger (触发方式): 定时器2
  • 波形生成模式(Wave generation mode) :
    三角波发生器(Triangle wave generation)勾选
    噪声波形(noise wave generation)不选择
  • 最大三角波幅(Maximum Triangle Amplitude)4095
    如果最大电压是3.3V,那么三角波幅值为3.3V
    0 ~ 4095 对应 0V ~ 3.3V

在这里插入图片描述
配置定时器,频率为2MHZ,配置TIM有讲过,这里和下面涉及TIM的知识点快进不再讲解,不了解的具体请看
【STM32】HAL库 CubeMX例程四—定时器中断(附工程源码)

在这里插入图片描述
由图可知三角波一个周期是一上一下,一上(一下)周期是4095,两趟就是4095 * 2

因此三角波频率 = (定时器频率 / (4095 * 2))
在main.c添加

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2);  //开启定时器2
  HAL_DAC_Start(&hdac, DAC_CHANNEL_1);  //开始DAC1
  /* USER CODE END 2 */

用示波器看到的就是三角波
在这里插入图片描述

链接:本期内容Keil工程
提取码:6735

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:23:50  更:2021-07-27 16:24:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:47:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码