13-STM32F1 DAC输出

STM32F1  DAC输出

数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。 DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。 DAC工作在12位模式时,数据可以设置成左对齐或右对齐。 DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下, 2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。 DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。

● 2个DAC转换器:每个转换器对应1个输出通道
● 8位或者12位单调输出
● 12位模式下数据左对齐或者右对齐
● 同步更新功能
● 噪声波形生成
● 三角波形生成
● 双DAC通道同时或者分别转换
● 每个通道都有DMA功能
● 外部触发转换
● 输入参考电压VREF+ 

虽然DAC有这么强大的功能,但是这里为了说明原理,只实验最简单的功能,输出一个恒定的电压

开发板;正点原子精英板
实验目的;利用DAC在PA4上输出一个恒定的电压。DAC通道1在PA4上,数据手册有说明
代码如下;
//这个实验用的是STM32F10x大容量的芯片,在《 STM32F1开发指南-库函数版本》里解释的非常详细,
//代码已经验证过,是可以使用的
#include "sys.h"
#include "delay.h"

/**************
步骤;
1、IO口初始化,要用模拟输入方式
2、DAC的初始化,其实就是初始化DAC的结构体
3、使能DAC
4、设定DAC输出电压,这个电压可以随时更改

*****************/

void init_dac()
{
	GPIO_InitTypeDef GPIO_InitStructure;//gpio初始化的结构体
	DAC_InitTypeDef DAC_InitStruct;//DAC初始化结构体
	
	//打开GPIOA时钟,DAC接在PA4上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//打开DAC时钟,是DAC不是ADC,刚开始我打开的是ADC的时钟,找了好久才找到原因
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
	
	//DAC输出时IO要配置为模拟输入,《STM32中文参考手册 》12.2章节最后部分有解释
	//打开DAC功能后,PA4会自动连接到DAC输出,《TM32中文参考手册 》12.2章节最后部分有解释
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	DAC_DeInit();
	//这里的每个配置都可以查看具体配置的是寄存器的哪个位,注释在STM32F10X_DAC.H文件里的第130-135行,其实就是DAC_Init()这个函数定义的地方
	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的通道1
	DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC
	
	DAC_SetChannel1Data(DAC_Align_8b_R,0);//初始化输出0v	
}
 int main(void)
 {	
	 delay_init();	//延时函数及系统时钟初始化
	 init_dac();	//DAC初始化
	 
	 DAC_SetChannel1Data(DAC_Align_8b_R,125);//这里可以选择数据位数,
	 //比如这里以8位数据的话,最大值为255,也就是255对应3.3v,那么现在这里设置为125,输出的定压应该为Vout=3.3*(125/256)v
	 //如果是以12位靠右输出的话,计算公式应该为,Vout=3.3*(data/4096),data就是你设置的数值,一般情况Vref=vcc=3.3v
	while(1)
	{}
 }

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值