STM32 DAC

发布者:BlossomWhisper最新更新时间:2016-07-30 来源: eefocus关键字:STM32  DAC 手机看文章 扫描二维码
随时随地手机看文章
STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+以获得更精确的转换结果。

STM32 的 DAC 模块主要特点有:

①  2 个 DAC 转换器:每个转换器对应 1 个输出通道 

②  8 位或者 12 位单调输出 

③  12 位模式下数据左对齐或者右对齐 

④  同步更新功能 

⑤  噪声波形生成 

⑥  三角波形生成 

⑦  双 DAC 通道同时或者分别转换

⑧  每个通道都有 DMA 功能 

使用库函数的方法来设置 DAC 模块的通道 1 来输出模拟电压,其详细设置步骤如下:

1)开启 PA 口时钟,设置 PA4 为模拟输入。

STM32F103ZET6 的 DAC 通道 1 在 PA4 上,所以,我们先要使能 PORTA 的时钟,然后设置 PA4 为模拟输入。DAC 本身是输出,但是为什么端口要设置为模拟输入模式呢?因为一但使能 DACx 通道之后,相应的 GPIO 引脚(PA4 或者 PA5)会自动与 DAC 的模拟输出相连,设置为输入,是为了避免额外的干扰。

使能 GPIOA 时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );    //使能 PORTA 时钟

设置 PA1 为模拟输入只需要设置初始化参数即可:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入

2)使能 DAC1 时钟。

同其他外设一样,要想使用,必须先开启相应的时钟。 STM32 的 DAC 模块时钟是由 APB1提供的,所以我们调用函数 RCC_APB1PeriphClockCmd()设置 DAC 模块的时钟使能。 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );    //使能 DAC 通道时钟 

3)初始化 DAC,设置 DAC 的工作模式。

该部分设置全部通过 DAC_CR 设置实现,包括:DAC 通道 1 使能、DAC 通道 1 输出缓存关闭、不使用触发、不使用波形发生器等设置。这里 DMA  初始化是通过函数 DAC_Init 完成的:

void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) 

参数设置结构体类型 DAC_InitTypeDef 的定义:

typedef struct

{

uint32_t DAC_Trigger; //设置是否使用触发功能

uint32_t DAC_WaveGeneration; //设置是否使用波形发生

uint32_t DAC_LFSRUnmask_TriangleAmplitude; //设置屏蔽/幅值选择器,这个变量只在使用波形发生器的时候才有用

uint32_t DAC_OutputBuffer;  //设置输出缓存控制位

}DAC_InitTypeDef;

实例代码:

DAC_InitTypeDef DAC_InitType;

DAC_InitType.DAC_Trigger = DAC_Trigger_None;  //不使用触发功能  TEN1=0

DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None;//不使用波形发生

DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;

DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable ;  //DAC1 输出缓存关闭 

DAC_Init(DAC_Channel_1,&DAC_InitType);    //初始化 DAC 通道 1

4)使能 DAC 转换通道

初始化 DAC 之后,理所当然要使能 DAC 转换通道,库函数方法是:

DAC_Cmd(DAC_Channel_1, ENABLE);   //使能 DAC1

5)设置 DAC 的输出值。

通过前面 4 个步骤的设置,DAC 就可以开始工作了,我们使用 12 位右对齐数据格式,所以我们通过设置 DHR12R1,就可以在 DAC 输出引脚(PA4)得到不同的电压值了。库函数的函数是:

DAC_SetChannel1Data(DAC_Align_12b_R, 0);

第一个参数设置对齐方式,可以为 12 位右对齐 DAC_Align_12b_R,12 位左对齐DAC_Align_12b_L 以及 8 位右对齐 DAC_Align_8b_R 方式。第二个参数就是 DAC 的输入值了,这个很好理解,初始化设置为 0。

这里,还可以读出 DAC 的数值,函数是:

DAC_GetDataOutputValue(DAC_Channel_1);

  1. //DAC通道1输出初始化
  2. void Dac1_Init(void)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     DAC_InitTypeDef DAC_InitType;
  6.     
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );     //使能PORTA通道时钟
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );     //使能DAC通道时钟
  9.     
  10.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 // 端口配置
  11.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;          //模拟输入
  12.      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.      GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.     GPIO_SetBits(GPIOA,GPIO_Pin_4)    ;//PA.4 输出高
  15.     
  16.     DAC_InitType.DAC_Trigger=DAC_Trigger_None;    //不使用触发功能 TEN1=0
  17.     DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
  18.     DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
  19.     DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;    //DAC1输出缓存关闭 BOFF1=1
  20.     DAC_Init(DAC_Channel_1,&DAC_InitType);     //初始化DAC通道1
  21.     
  22.     DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
  23.     DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
  24. }
  25.  
  26.  
  27. //设置通道1输出电压
  28. //vol:0~3300,代表0~3.3V
  29. void Dac1_Set_Vol(u16 vol)
  30. {
  31.     float temp=vol;
  32.     temp/=1000;
  33.     temp=temp*4096/3.3;
  34.     DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
  35. }
  36.  

关键字:STM32  DAC 引用地址:STM32 DAC

上一篇:STM32 CAN 控制器
下一篇: STM32 的内部温度传感器

推荐阅读最新更新时间:2024-03-16 15:02

STM32 基础系列教程 26 - USB_MSC
前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如
[单片机]
<font color='red'>STM32</font> 基础系列教程 26 - USB_MSC
STM32 PA15作普通IO用时的配置
调STM32F103RB板时,其中用到PA15作普通LED灯。一开始编程,配置成PP输出模式,但无论置0还是置1,均输出3.3V。后来发现此脚为JTAG口调试口。 经查找到问题解决办法: 需要重新映射一下,重新映射方法如下: 首先要打开GPIOA的AFIO时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 然后调用GPIO重映射函数,根据需求实现重映射: GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 然后运行OK! 补充说明 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisab
[单片机]
stm32学习笔记(八)中断服务函数与函数调用的区别
在《微机原理》和《计算机组成》等课程 教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过把两过程结合起来,采用比较教学方法,能收到了很好的教学效果。 1、两过程定义与作用 子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表等5种。 子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,
[单片机]
STM32 启动代码汇编指令详解
● EQU 伪指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的 #define 。 语法格式:name EQU expr{ , type} 注意:语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的; name:数值(expr)的符号名称; expr:一个与内核寄存器相关的地址,或一个绝对地址,或一个与PC相关的地址,或一个32位整型常量; type:可选项,它可以是ARM、THUMB、CODE16、CODE32或DATA中的任何一个。 举个例子: fiq EQU 0x1C,CODE32 ● AREA 伪指
[单片机]
基于stm32的8m晶振不起振的原因解析
STM32板子突然出了大问题。所以延时函数都变慢9倍。 我的延时函数是用的SysTick函数精确延时。 因为第一步需要初始化时间,一般8M的晶振我们都要初始化72.因为系统一般都是倍频9倍的。 但是今天貌似是系统没有倍频9倍。 所以才导致整体时间是原来9倍长。 后来发现倍频是在 RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) 成功后才设置的如果HSEStartUpStatus不等于1那么就不会执行倍频。也就是说只能使用内部自带的8M晶振了。 后来单步调,发现确实是这个HS
[单片机]
STM32外设资源查询方法,对比C8T6和ZET6
对应不同型号的单片机的外设资源需要找相应的单片机的数据手册,比如STM32F103ZET6数据手册,STM32F103C8T6数据手册. 根据FLASH大小STM32F103ZET6 - 为HD型,STM32F103C8T6 - 为MD型。 STM32F103家族系列芯片外设对比 STM32F103ZET6 外设资源数据手册一览 从上图也可以看到ZET6一共有11个定时器,包括2个高级定时器、4个通用定时器、2个基本定时器…当然还有2个看门狗和1个系统定时器。 再由这个两个图也可以看出TIM1/8是高级定时器、TIM2/3/4/5是通用定时器、TIM6/7是基本定时器。 高级定时器在APB1总线上,通用和
[单片机]
<font color='red'>STM32</font>外设资源查询方法,对比C8T6和ZET6
STM32内部RAM在线调试配置方法及详细说明
Ⅰ、 写在前面 本文主要讲述的内容:基于Keil开发工具下,STM32内部RAM在线调试配置方法,以及每一项配置的详细说明。如需要了解更多相关的文章,可以到我博客,或微信公众号查看。 让程序运行在RAM中调试代码有两优点:1.速度快;2.减少对芯片FLASH读写次数,增加芯片寿命。 本文牵涉的知识比较多,如果弄明白所有细节问题,对自己这方面的技能是一种很大的提升。 本文基于ST公司Cortex-M内核的STM32来讲述其配置方法,其实也适用于其他公司(如:TI、NXP等)的Cortex-M芯片,原理都是一样的。 本文内容已经整理成PDF文件,提供给大家下载: http://pan.baidu.com/s/1d
[单片机]
<font color='red'>STM32</font>内部RAM在线调试配置方法及详细说明
双路16 位DAC具有6 种独立软件可编程输出范围
2007 年 12 月 12 日 - 北京 - 凌力尔特推出双路 16 位电流输出 DAC LTC2753-16,该器件具有 6 种独立的软件可编程 SoftSpanTM 单极性和双极型输出范围,范围最宽可达 ±10V。软件可编程性去除了对昂贵的精确电阻、增益级和人手切换跨接线的需求。LTC2753-16 具有准确的 DC 性能规格,包括在 -40oC 至 +85oC 的工业温度范围内具有 ±1LSB (最大值) 的 INL 和 DNL。该 DAC 用 2.7V 至 5.5V 的单电源工作,消耗的电源电流最大仅为 1uA。6 种独立的 SoftSpan 输出电压范围包括两种单极性范围 (0V 至 5V、0V 至 10V) 和 4
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved