STM32F103DAC功能实现

发布者:phi31最新更新时间:2022-01-27 来源: eefocus关键字:STM32F103  模拟信号 手机看文章 扫描二维码
随时随地手机看文章

所谓的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输出通道有两个。

image.png

PA4和PA5,但是在初始化引脚的时候,要将PA4和PA5初始化为模拟输入功能。这个在官方文档上也有说明。

image.png

内部自动就会将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  模拟信号 引用地址:STM32F103DAC功能实现

上一篇:STM32F103使用DAC功能输出三角波
下一篇:STM32F103单片机驱动蜂鸣器

推荐阅读最新更新时间:2024-11-21 10:35

STM32F103系列 PB4引脚问题
因为STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能 1、禁用PB4复用功能 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); 或者GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); 用这两天其中一条,完全禁用JTAG+SW-DP或者屏蔽JTAG-DP,用来释放各个io。 注意:还是用以下这条来释放PB4吧,因为上面两条会禁用SW和JTAG,造成无法调试 GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,
[单片机]
不同stm32f103芯片内部外设资源
由表可知,芯片内部的外设资源除了跟stm32f103后面的第一个字母有关外,还和flash的大小有关。上面的表中只有一部分,具体的可以参考Keil的芯片型号选择部分。 下面是stm32f103c8t6的资源: TIM1_BRK_IRQn = 24, TIM1_UP_IRQn = 25, TIM1_TRG_COM_IRQn = 26, TIM1_CC_IRQn = 27, TIM2_IRQn = 28, TIM3_IRQn = 29, TIM4_IRQn 可以知道c8t6有一个高级定
[单片机]
不同<font color='red'>stm32f103</font>芯片内部外设资源
关于内外时钟切换及时钟超频测试
前言 近日,有群友困于STM32的时钟系统。这里就详细介绍一下关于内外时钟切换及时钟超频测试,希望对大家能有所帮助 诚然,当使用固件库时,把外部晶振摘掉,系统确实会自动切换到内部时钟,但是只会以8M的默认值运行,显然这是十分不可行的,8M的速度直接让我们的STM32病入膏肓,今天的任务就是让STM32失去外挂(晶振)时,依旧可以激情澎湃。 时钟详解这里不过多介绍,自己也没有别人介绍的好,本文旨在解决现实问题。 此处插播广告:群友问过这种问题,外部接8M晶振和16M晶振有啥区别? 以我微薄的经验来看,这两个在用的时候差别不大,如果使用ST的固件库(以STM32F103为例),使用8M的晶振会更方便,不用改任
[单片机]
关于内外时钟切换及时钟超频测试
基于TMS320F28335和STM32F103VET6芯片实现北斗定位系统的设计
前期实际北斗模块定位误差统计分析中得出了北斗模块的定位误差分布服从正态分布,根据北斗模块定位误差分布的规律,利用在同一块电路板上的双天线模块接收北斗定位信号,将定位信息传给TMS320F28335DSP芯片,DSP对北斗模块给出的定位信息做实时算法处理,并将处理后的定位信息传给嵌入式ARM芯片,ARM芯片在TFT液晶屏上更新定位信息,同时根据用户要求来设置北斗模块的工作模式。在接收不到北斗定位信息时DSP利用UKF滤波算法,将预测定位信息发送给ARM芯片,并标记为预测信息,且显示在TFT液晶屏上。 北斗定位系统是我国自主开发的全球定位系统,目前北斗定位系统在轨运行卫星已达16颗,截止2012年12月27日,我国的北斗定位系统空
[单片机]
基于TMS320F28335和<font color='red'>STM32F103</font>VET6芯片实现北斗定位系统的设计
STM32F103标准库开发:内部Flash的读写
一、STM32存储器介绍 STM32存储器分为以下两种: 1. 随机存储器—RAM RAM是与CPU直接交换数据的内部存储器,也叫主存(内存)。 它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。 当电源关闭时RAM不能保留数据(掉电数据消失哦)如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。 2. 只读存储器—ROM ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。 ROM所存数据稳定,断电后所存数据也不会改变。 二、STM32F103系列存储器介绍 1. STM32F103系列存储器分类 具体分类
[单片机]
<font color='red'>STM32F103</font>标准库开发:内部Flash的读写
STM32F103+RT-Thread从零开始(一)——点亮LED
STM32系列MCU STM32系列芯片包括F0/F1/F2/F3/F4/F7/L0/L1/L4/H7等系列芯片芯片。不同系列的芯片适用于不同的应用场景。 F0/L0基于ARM Cortex-M0,F1/F2/L1系列基于ARM Cortex-M3,F3/F4/L4系列基于ARM Cortex-M4,F7/H7基于ARM Cortex-M7。L系列表示超低功耗,H表示超高性能(对应就是高功耗了),F就是个折中方案了,性能不错,功耗也不高。 其他的先不管,F1系列芯片主要分类如下: · 超值型STM32F100 - 24 MHz CPU,具有电机控制和CEC功能· 基本型STM32F101 - 36 MHz CPU,具有高达1MB的
[单片机]
<font color='red'>STM32F103</font>+RT-Thread从零开始(一)——点亮LED
STM32F103C8T6在线升级 IAP
stm32程序每次执行都会从基地址0x800 0000开始执行。IAP程序升级的执行是在bootloader引导文件执行后,进行加载、跳转APP程序。所以每次上电后进入BootLoader判断是否需要升级,如果升级则接受bin文件,如果不升级则直接跳转app程序。 BootLoader和app程序的FLASH大小需要根据自己的程序情况自由的分配大小就可以了。 代码:根据正点原子的例程进行修改的 1、由于BootLoader引导程序比较小,我设置的flash大小为0x1800 2、iap函数:由于STM32F103C8T6程序存储容量是64KB,每页的大小为1K字节即1024,所以iapbuf数组设置为512。
[单片机]
<font color='red'>STM32F103</font>C8T6在线升级 IAP
STM32 ADC详解
01、ADC简介 ADC是Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 从STM32F207的数据手册中下图看到,STM32F207VC有3个精度为12bit的ADC控制器,有16个外部通道,而144脚的STM32F207Zx和176脚的STM32F207Ix因为带PF脚,所以多8个通道,为24个外部通道。各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。 02、STM32的ADC外设 上面说
[单片机]
STM32 ADC详解
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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