所谓的DAC功能也就是将数字信号转换为模拟信号,一般情况下使用比较多的就是ADC功能,也就是将模拟信号转换为数字信号,多用于读取传感器的值。但是有时候需要控制某些传感器,需要用模拟信号控制,这就需要将数字信号转换为模拟信号了。
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。
或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压V REF+ 以获得更精确的转换结果。
DAC 主要特征
2个DAC转换器:每个转换器对应1个输出通道
8位或者12位单调输出
12位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双DAC通道同时或者分别转换
每个通道都有DMA功能
外部触发转换
输入参考电压V REF+
下面就通过代码来实现模拟信号输出。
#include "dac.h"
void DAC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC , ENABLE);
//PA4设置为为模拟输入,使能DAC通道后,PA4会与DAC模拟输出相连,设置为输入为了避免了干扰
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //设置为模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; //不使用触发功能 TEN1=0
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; //屏蔽、幅值设置
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //DAC1输出缓存关闭
DAC_Init(DAC_Channel_1, &DAC_InitStructure); //初始化DAC通道1
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
}
//设置通道1输出电压
//vol:0--3300,代表0-3.3V
void DAC1_Set_Vol(u16 vol)
{
float temp = vol;
temp /= 1000;
temp = temp * 4096 / 3.3;
DAC_SetChannel1Data(DAC_Align_12b_R, temp);
}
在初始化的时候,要注意一个问题,STM32F103单片机的DAC输出通道有两个。
PA4和PA5,但是在初始化引脚的时候,要将PA4和PA5初始化为模拟输入功能。这个在官方文档上也有说明。
内部自动就会将PA4和PA5与模拟输出引脚连接起来。所以在初始化的时候,虽然用的是输出功能,但是还是要将引脚设置为输入。
初始化引脚之后,接下来初始化DAC功能,在这里不使用触发功能,也不使用波形发生功能。直接通过软件来控制
接下里通过一个函数将要输出的电压值换算为寄存器的设置值。DAC的转换为12位,所以最大值就是2^12,也就是4096,而stm32单片机的供电电压值3.3V,所以将要设置的电压值除以3.3,然后乘以4096就是DAC寄存器需要设置的值。
如果要输出模拟电压值时,只需要在主函数中调用DAC1_Set_Vol()函数,并将要设置的电压值传递给这个函数就行了。
int main(void)
{
u16 adcx;
float temp;
u8 t = 0;
u16 dacval = 0;
u8 key;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
DAC1_Init();
while(1)
{
LED0 = !LED0;
DAC1_Set_Vol(1000);
delay_ms(100);
}
}
在主函数中设置DAC输出的电压值为1000,也就是1V。这时通过万用表就可以在stm32单片机的PA4引脚量到1V的电压值了。
上一篇:STM32F103使用DAC功能输出三角波
下一篇:STM32F103单片机驱动蜂鸣器
推荐阅读最新更新时间:2024-11-10 23:27
推荐帖子
- 这个MOS管是不是画错了
- 本帖最后由jishuaihu于2015-5-2213:27编辑 这个MOS管是不是画错了,如图,电路的作用也说明白了。看这个图的时候发现这样接的话直接导通的还是那个二极管,导通压降比一般的二极管也不小啊。用MOS管代替二极管降低压降的用法我理解,MOS管导通电阻小,压降自然小。下图中漏极和源极是不是画反了。本人没有用过MOS管,也没有深入研究过。用过的给说说呗这个MOS管是不是画错了文中第一句是“需要在Vcc上进行反向极性电压保护”。按照图中接法,输入电压Vin接反时,M
- jishuaihu 综合技术交流
- 新手请教vs2008如何给wince4.2写程序。
- 我们应用一种wince4.2系统的人机界面,我想应该可以用vs.net来给他写程序,于是写了个很简单的程序,选的项目类型是智能设备.netframework2.0,目标平台是windowsce,.netcompactframeworkversion2.0写了简单的程序后生成工程,然后把生成的可执行文件拷贝到了wince人机界面的存储器里。在wince系统中运行该程序,错误提示:找不到我写的程序(或它的一个组件)请确认组件全部安装什么的。请问我的操作有什么问题?为什么会这样?
- anzx23 WindowsCE
- 初学单片机者必备
- http://www.51dz.com/n.asp?dl=2&a...12812&i=wen3329一个适合电子初学者的网站,欢迎大家来访问!!还提供各种电子元件套件。初学单片机几个不易掌握的概念 随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的
- hcbhcbhcbhcb 单片机
- 大家都来秀秀桌面吧
- imgborder=0src=e:\\无标题.bmp大家都来秀秀桌面吧斑竹:看不到图的啊得先上传附件,然后点附件后面的插入把图片插入到合适的位置。
- huo_hu 51单片机
- LSD-FET430UIF用MSP430Flasher升级固件后怎么装驱动?
- 前不久想用利尔达的仿真器LSD-FET430UIF直接将msp430-txt文件下载进430单片机,使用MSP430_Flasher,结果按照软件提示进行固件升级后,电脑就再也无法为其安装驱动了(固件升级前仿真器是可用的),也无法访问仿真器了,但插上仿真器后电脑能识别到这个是TexasInstrumentsMSP430-JTAG,然后如果指定到利尔达所附光盘内的驱动,就提示无法找到需要的软件,无法安装该硬件,打开电脑的设备管理器,该设备显示在“其它设备”目录下。从Wiki上
- wojiaomt 微控制器 MCU
- 用CSK6大模型开发板自定制一个能说会唱的桌面聊天机器人/AI智能语音助理
- 桌面机器人,作为人工智能领域中一个充满潜力的分支,正逐渐成为我们日常生活中的伙伴。它们不仅能够提供信息查询、陪伴关怀等实用功能,还能以更加人性化的方式与我们互动,成为我们工作和娱乐的好帮手。本文以聆思CSK6大模型开发板为例,讲解怎么定义人设、修改发音人音色、增加技能、挂载私有知识库、让您的桌面小伙伴更加智能、更加贴近用户的需求。1、个性人设塑造功能描述:个性塑造功能支持设置设备的交互风格,包括对话风格、语调语速等,增加个性化体验。支持更改大模型的自我认知
- 胡黎明 DIY/开源硬件专区
设计资源 培训 开发板 精华推荐
- 基于ST1S40IPHR的、具有使能开/关功能的、4A峰值800kHz固定频率PWM同步降压演示板
- LTM4608AEY 3V 至 5.5Vin、2.5V/8A 输出 DC/DC 稳压器的典型应用电路
- L4963D、1.5A 开关稳压器的典型应用
- AM6TW-4803SZ 3.3V 6 瓦双路输出 DC/DC 转换器的典型应用
- 使用 PNP 晶体管的 NCV2574 反相降压-升压稳压器关断电路的典型应用
- SPX431A 精密可调并联稳压器典型应用电路
- 用于 24V 汽车应用的 LTC4367HDD-1 过压电源保护控制器的典型应用
- LT1077 的典型应用 - 微功率、单电源、精密运算放大器
- 适用于STM32F410RB MCU的STM32 Nucleo-64开发板,支持Arduino和ST morpho连接
- DC1819A,用于具有可调电流限制的 LTC4415EMSE 双通道 4A 理想二极管的演示板