STM32之DAC配置

发布者:EtherealJourney最新更新时间:2016-12-20 来源: eefocus关键字:STM32  DAC配置 手机看文章 扫描二维码
随时随地手机看文章

STM32F103VCT6自带两个12位DAC,DAC的转换速度一直没有查到,网上有人说是1MHZ的频率,那就是1us了。ADC的转换时间在56MHZ工作频率下为1us,在72MHZ工作频率下为1.17us。如果AD和DA有对称关系的话,那么很可能跟ADC的时间相同。(仅作分析用!)

       DAC于我,有两个用途:输出波形和输出固定电压。先来说说前者的配置。

       第一个参数:触发方式,DAC_InitStructure.DAC_Trigger。可选的外部触发源一共有八个。六个是定时器触发:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下两个分别是:EXTI线路9和软件触发。如果采用定时器触发的话,就还要再编写相应的定时器函数,这个倒不是很复杂,和定时器的编写方式类似。如:DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;//选择定时器6作外部触发源

 

void TIM_Configuration(void)

{

       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

       TIM_OCInitTypeDef            TIM_OCInitStructure;

 

      

       TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

      TIM_TimeBaseStructure.TIM_Period = 0x85;         

      TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      

      TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   

      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

      TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);     

      

    TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);

}

输出信号频率计算:假设输出一个6个点的锯齿波波形,则其频率为:(72MHZ/(0x85+1))*6=89.552KHZ.注意:如果prescaler不为0,则时钟还要再除以(prescaler+1)

       第二个参数:DAC_InitStructure.DAC_WaveGeneration。顾名思义:波形发生器。STM32内部集成了两个幅度可调的波形发生器,可以产生三角波和噪声波。如果我们使用自定义的缓冲区的话,就不需要配置这个参数或者使其为DAC_WaveGeneration_None,但为了避免别人误以为你忘了配置这个参数,所以还是多写一句吧,养成好的习惯。

       第三个参数:DAC_InitStructure.DAC_OutputBuffer,即是否使用输出缓存。输出缓存的功能主要用来减小输出阻抗,是STM32的DAC无需外部运放就可以直接驱动负载。这里一般设置成DAC_OutputBuffer_Disable,即关闭外部缓存。这是为保险起见,万一驱动能力不够强(本人也没试过@_@),那调试的时间就又多了一些。

       参数的配置就这么多了,算得上STM32中最简单的外设配置之一了!

       一般来说,用DAC输出波形,传输的数据比较多,所以采用DMA传输可以节省CPU的开支。所以在调用DAC_DMACmd(DAC_Channel_1, ENABLE);函数后别忘了配置DMA函数。详细的配置说明就不写了,这里把代码贴出来:

 

void DMA_Configuration(void)

{

       DMA_InitTypeDef            DMA_InitStructure;

      

       DMA_DeInit(DMA2_Channel3);

       DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;

       DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&FIR_OutPutValueTab;

       DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

       DMA_InitStructure.DMA_BufferSize = 200;

       DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

       DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

       DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

       DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

       DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

       DMA_InitStructure.DMA_Priority = DMA_Priority_High;

       DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

       DMA_Init(DMA2_Channel3, &DMA_InitStructure);

 

      

       DMA_Cmd(DMA2_Channel3, ENABLE);

      

       DMA_ITConfig(DMA2_Channel3,DMA_IT_TC,ENABLE);

}

注意红色字体写的那行代码,当我们传输多个数据时,需要将其设置为连续转换!其余就不赘述了。

       接下来谈谈DAC固定电压的配置。

       STM32的DAC固定电压配置和上面的波形输出配置相似,不同的地方在于它要多调用一个函数:DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);这样才会输出固定的电平。

具体配置如下:

 

void DAC_VOLTAGE_Configuration(void)

{

       DAC_InitTypeDef            DAC_InitStructure;

       DAC_DeInit();

      

      DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;

      DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;      

      DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

      DAC_Init(DAC_Channel_1, &DAC_InitStructure);

       //

      

       DAC_Cmd(DAC_Channel_1, ENABLE);

       DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);

}

配置完成后,调用DAC_SetChannel1Data(DAC_Align_12b_R,4000);函数就可以发送数据了!!极其方便。比起5615,0832之流不知简便了多少!有两点要注意:1、该函数的第一个参数DAC_Align_12b_R不可依据设置ADC外设地址的方式重写这个地址,因为这个参数是不带基址的,而我们重写地址后一半会把基址算进去,这样就不对了!(笔者就曾经卡在这里!看来凡事不可先入为主,否则问题迟早会发生。)2、每次改变发送数据时,要同时调用以下两个函数:

       DAC_SetChannel1Data(DAC_Align_12b_R,4000);

       DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);

至于为什么,我的理解是:因为DAC改变数据后并不会立即写入寄存器,需要一次更新,由于不是通过定时器触发来更新,因此就只能通过调用函数的方法来更新。

       以上仅是本人结合《STM32F10xx参考手册》和编程经验写的心得,错漏疏失在所难免,欢迎读者批评指正,不胜感激!


关键字:STM32  DAC配置 引用地址:STM32之DAC配置

上一篇:STM32的USB多包数据传送
下一篇:STM32F PWM的生成

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

STM32端口输入输出模式配置
STM32的IO口模式配置 根据数据手册提供的信息,stm32的io口一共有八种模式,他们分别是: 四种输入模式 上拉输入: 通过内部的上拉电阻将一个不确定的信号通过一个电阻拉到高电平。 下拉输入: 把电压拉到GND。与上拉原理相似。 浮空输入: 引脚内部什么都不接,处于浮空模式下,电平状态是不确定的。外部信号输入什么,IO口就是什么状态。 模拟输入: 接收到的是连续的模拟信号,一般用于AD转换。 四种输出模式 推挽输出: 可以输出高低电平,连接数字器件。在stm32中推挽电路由两个MOS管组成:输出高电平时P-MOS管导通,引脚联通VDD(3.3v)。输出低电平时N-MOS导通,引脚联通GND。**该方式既提高电路的负
[单片机]
应用笔记 | MPU 子区话题
1. 问题起因 有人询问STM32F7 和STM32H7 系列库例程中有关MPU 配置中的下面这句加绿色下划线的代码的意思是什么?有何用? 图1、芯片存储空间MPU 背景配置 从上面截图中的红色框内代码我们不难看出,这里进行MPU 设置就是将从0 开始的4G 空间,即整个STM32 可寻址空间定义为Strongly Ordered 存储属性。且此时MPU Region 编号为0。可代码注释上又说只是将未定义的区域配置为Strongly Ordered,这未定义区域到底啥意思,该如何理解?难道跟绿色下划线标示的那行代码有关系。 那么,这句代码MPU_InitStruct.SubRegionDisable = 0x87;
[单片机]
应用笔记 | MPU 子区话题
STM32中的看门狗
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 简单来说,看门狗就是在不停地对我们正在运行的程序进行监视,我们必须在规定的时间的有效的时间内去进行“喂狗”操作,这样看门狗就知道我们的程序正在正常的运行,如果我们程序由于外界原因跑飞了,那么就无法进行喂狗操作,那么看门狗由于饥饿难耐,他就会使我们的单片机进行复位,以便让程序重
[单片机]
STM32的各种时钟系统的应用解析
时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。 重要的时钟: PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚; 1、HSI:高速内部时钟信号 STM32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②
[单片机]
stm32学习——中断的优先级设置
stm32的中断具有不同的优先级,可以使用NVIC(嵌套向量中断控制器,Nested Vectored Interrupt Controller)来控制。 一、基本原理介绍 stm32的中断优先级分主副两类(也称为抢占式优先级和响应式优先级),主优先级是抢占式的(为零表示最高),即,优先级高的中断到来时即使优先级较低的中断正在执行,也要停下来先执行优先级较高的中断。而辅优先级是非抢占式的,即,具有相同主优先级的两个中断,如果辅优先级较高的中断到来,此时有副优先级较低的中断正在执行,要等这个中断执行完了再执行后到来的这个中断。 stm32使用4为寄存器来管理中断优先级,NVIC_PriorityGroup来设置中断优先级的分组方式的
[单片机]
STM32的exti中断调试遇到一奇怪问题总结
前两日调试EXTI 中断程序,程序很简单抄了网上的范例,起初调试正常,可以正常运行,但我在程序中加入另外的代码后问题出现,表现为中断莫名其妙的开始响应!检查自己的程序,未发现异常,中断部分的设置也没有为题。逐步屏蔽后加入的代码,依据屏蔽的代码不同,单步运行后从不同的位置跳入中断。怪哉怪哉....反复调试若干遍,花费时间2天有余... 百思不得其解之际,又检查了自己的板子,看到BOOT1悬空,心中一动,当初图省事,空了此脚,难不成问题在此? 找了调帽装上,一切正常,吐血.... .....(心里活动省略200字) 原来 虽然boot0置0了,但是boot1还是不能悬空的呀! ------------------------------
[单片机]
STM32学习笔记——AFIO时钟的配置问题
最近在写程序时发现设置外部中断出了问题,之前的程序好好的怎么就不能用了呢?经过了一晚上的折腾发现问题出在AFIO时钟的配置上,我没有使能AFIO时钟。 什么时候要开启AFIO呢?参考手册: 说的很明白,操作AFIO的三类寄存器时需要开启: 1.事件控制寄存器(AFIO_EVCR) 2.复用重映射和调试I/O配置寄存器(AFIO_MAPR) 3.外部中断配置寄存器x(AFIO_EXTICRx) 这三类其实是AFIO的全部寄存器, AFIO_EVCR是事件相关的,AFIO_MAPR是与重映射和调试I/O相关的,AFIO_EXTICRx是与外部中断相关的。因此管脚重映射和调试I/O配置、外部中断、事件时需开启AFIO。 再回
[单片机]
基于STM32的铁路自动围栏系统设计
一、项目背景 随着城市规模的不断扩大和交通运输方式的日益发展,铁路与公路的交叉口已经成为常见的场景。然而,这些交叉口往往存在一定的安全隐患,因为有时不易发现列车行进的情况,导致公路上的车辆或行人可能会无意中闯入铁路区域,从而引发重大交通事故。 为了解决这个问题,当前开发了一款基于 STM32 的铁路自动围栏系统。该系统采用了STM32F103RCT6作为主控 芯片 ,并使用 步进电机 来控制铁路围栏的开启和闭合。同时,系统还配备了 红外 感应器,以便能够及时监测到列车的通过情况。 当系统监测到有列车即将通过铁路交叉口时,公路 信号 灯会立刻变为红灯,蜂鸣器也会发出警报声音,以提醒行人和车辆注意安全。同时,铁路两侧的围栏也会自动
[单片机]
基于<font color='red'>STM32</font>的铁路自动围栏系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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