使用 STM32 微控制器系列中的 DAC生成音频和波形

合集下载

STM32_DAC 实验(正弦波_方波_锯齿波_发生器)

STM32_DAC 实验(正弦波_方波_锯齿波_发生器)

1//sine
正弦波
2//rectangular 矩形波
3//hackle 锯齿波
UINT8 flag = 0; UINT8 func = SINE_WAVE;
/*---------------------------------------------------------------------------MAIN function *----------------------------------------------------------------------------*/
Set_IO_direction(PORT_B,SW2,INPUT); Set_IO_direction(PORT_B,SW3,INPUT); Set_IO_direction(PORT_E,SW4,INPUT); Set_IO_direction(PORT_E,SW5,INPUT);
Turn_OFF_LED1(); Turn_OFF_LED2(); Turn_OFF_LED3(); Turn_OFF_LED4(); }
#endif break;
default: break; } //------------------------------------------------------------} // end while } // end main
/*----------------------------------------------------------------------------
GPIOD->CRH |= (Value << (GPIO * 4 - 8 * 4));//Set used bit } }

STM32L15x —— 数模转换器DAC

STM32L15x —— 数模转换器DAC

Same as STM32F-1模拟外设数模转换器(DAC)DAC ——概述两个DAC转换器:每个对应一个输出通道支持8位和12位的单一输出12位模式下,支持数据左对齐或右对齐同步更新功能产生噪声波或三角波双DAC通道能分别独立转换或同时转换每个通道都支持DMA传输DMA欠载错误检测支持外部触发转换DAC工作范围:1.8V 到3.6 V转换范围:0 到3.6 VDAC输出范围:0 ≤ DAC_OUTx ≤ VREF+ (VREF+和VREF-引脚仅存在于100脚和144脚封装的芯片)ADC 和DAC 共享同样的VREF+DAC ——通道框图TIM2_TRGO TIM4_TRGO TIM6_TRGO TIM7_TRGO TIM9_TRGOV REF +V DDA V SSAExt_IT_9DMA Request xDAC 控制寄存器Digital to Analog Converter xControl Logic xTrianglexLFSRx DHRxDORxSWTRIGx 触发选择T S E L x [2:0]M A M P x [3:0]W A V E x [1:0]T E N xD M AE N x12 bits12 bits12 bitsDAC_OUTx触发选择DAC ——输出电平DAC通道的输出电平使用以下公式:DAC Output = V REF+x (DOR / 4095)每个DAC通道都内置了输出缓冲,通过BOFFx位使能,用来降低输出阻抗DAC ——单通道数据格式每个DAC通道的每个数据对齐格式,都有相对于的数据寄存器8位右对齐:DAC_DHR8Rx [7:0]D7D6D5D4D3D2D1D012位右对齐:DAC_DHR12Rx [11:0]D11D10D9D8D7D6D5D4D3D2D1D012位左对齐:DAC_DHR12Lx [15:4]D11D10D9D8D7D6D5D4D3D2D1D0DAC_DHR8RxDAC_DHR12RxDAC_DHR12LxDAC ——转换触发可编程的DAC转换触发选择数据装载到DORx寄存器的条件:自动:在一个APB1时钟后装载(禁止外部触发位TENx = 0)触发:在三个APB1时钟后装载(使能外部触发位TENx = 1): 软件触发(SWTRIGx = 1) (仅需要一个APB1时钟,即可装载寄存器)Timer2 TRGOTimer4 TRGOTimer6 TRGOTimer7 TRGOTimer9 TRGOEXTI Line9通过一个线性反馈移位寄存器(LFSR),可以产生不同幅度的伪噪声波:可用于ADC 的过采样LFSR 寄存器的初始值为:0xAAA.LFSR 寄存器有12位,这12位可以全部或者部分的屏蔽防锁定机制:如果LFSR 寄存器的值为0,则视为1噪声波的产生:由外部信号触发,噪声值加到DAC_DHRx 寄存器的内容中,不计算进位11109876543210XOR12NORX 12X 0XX 4X 6在一个直流或者缓慢变化的信号上增加一个小幅的三角波信号:可作为基本波形发生器三角波的产生:由外部信号触发,数值增加到DAC_DHRx寄存器中的数值中,直到达到设定的最大振幅向上—向下三角波计数器:向上增加直到达到设定的最大振幅值向下递减直到回到设定的初始值三角波的最大振幅值:(2N–1),N=[1..12]MAMPx[3:0]: 最大振幅值DAC_DHRx: 初始值DAC ——DMA 传输两个DAC 通道都支持DAM 传输DAC 的DMA 请求由外部信号触发(不支持软件触发):DAC_DHRx 寄存器的值装载入DAC_DORx 寄存器 支持DMA 过载错误检测:将产生中断DACDMACPURAM(Pattern Table 1)(Pattern Table 2)Channel 1 OutputChannel 2 OutputDAC TriggersDAC ——双DAC通道模式两个DAC通道可以同时使用:通过同步转换模式产生差分或立体声信号11种双DAC通道模式:两个通道使用独立的触发,使用或者不使用伪噪声波发生器和三角波发生器,使用波发生器时选择同样的或者不同的计算数值(五种模式)两个通道通过软件同时启动两个通道使用同样触发,使用或者不使用伪噪声波发生器和三角波发生器,使用波发生器时选择同样的或者不同的计算数值(五种模式)DAC ——双DAC 通道模式下的数据格式双通道使用同样的对齐模式,数据保存在一个寄存器中8位右对齐:DAC 通道1的数据装载在DAC_DHR8RD [7:0]中,DAC 通道2的数据装载在DAC_DHR8RD [15:8]中D’7D’6D’5D’4D’3D’2D’1D’0D7D6D5D4D3D2D1D0DAC Channel1 DataDAC Channel2 Data D11D10D9D8D7D6D5D4D3D2D1D0D’11D’10D’9D’8D’7D’6D’5D’4D’3D’2D’1D’0DAC Channel1 DataDAC Channel2 Data D’11D11D10D9D8D7D6D5D4D3D2D1D0D’10D’9D’8D’7D’6D’5D’4D’3D’2D’1D’0DAC Channel2 Data DAC Channel1 DataDAC_DHR8RD DAC_DHR12RD DAC_DHR12LDDAC 通道内置了输出缓冲,并可由用户在软件中设置是否使能该缓冲的功能,因此不需要外接运算放大器如果不使能DAC 的输出缓冲,而用户的电路有带有负载,DAC 输出的电压会低于需要的数值,使能了缓冲,输出电压近似于需要的电压。

STM32实现DAC输出的相关设置

STM32实现DAC输出的相关设置

STM32实现DAC输出的相关设置STM32 DAC简介⼤容量的STM32F103具有内部DAC,战舰STM32选择的是STM32F103ZET6属于⼤容量产品,所以是带有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通道的框图如图24.1.1所⽰:图24.1.1 DAC通道模块框图图中VDDA和VSSA为DAC模块模拟部分的供电,⽽Vref+则是DAC模块的参考电压。

DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚)。

从图24.1.1可以看出,DAC输出是受DORx寄存器直接控制的,但是我们不能直接往DORx寄存器写⼊数据,⽽是通过DHRx 间接的传给DORx寄存器,实现对DAC输出的控制。

前⾯我们提到,STM32的DAC⽀持8/12位模式,8位模式的时候是固定的右对齐的,⽽12位模式⼜可以设置左对齐/右对齐。

单DAC通道x,总共有3种情况:DAC模块的通道1来输出模拟电压,其详细设置步骤如下:1)开启PA⼝时钟,设置PA4为模拟输⼊。

STM32F103ZET6的DAC通道1是接在PA4上的,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输⼊(虽然是输⼊,但是STM32内部会连接在DAC模拟输出上)。

STM32固件库之DAC

STM32固件库之DAC

void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) 用默认值填充 DAC_InitStruct 结构的每一个成员 - DAC_InitStruct : 指向将要被初始化的 DAC_InitTypeDef 结构指针 无 无 DAC_Trigger_None DAC_WaveGeneration_None DAC_LFSRUnmask_Bit0 DAC_OutputBuffer_Enable
输出参数: 返回参数: typedef struct {
无 无
uint32_t DAC_Trigger;
uint32_t DAC_WaveGeneration; uint32_t DAC_LFSRUnmask_TriangleAmplitude; uint32_t DAC_OutputBuffer; }DAC_InitTypeDef; DAC_Trigger DAC 通道 2 触发选择 DAC_Trigger DAC_Trigger_None DAC_Trigger_T6_TRGO DAC_Trigger_T8_TRGO DAC_Trigger_T3_TRGO DAC_Trigger_T7_TRGO DAC_Trigger_T5_TRGO DAC_Trigger_T15_TRGO DAC_Trigger_T2_TRGO DAC_Trigger_T4_TRGO DAC_Trigger_Ext_IT9 DAC_Trigger_Software DAC_WaveGeneration DAC 通道噪声/三角波生成使能 DAC_WaveGeneration DAC_WaveGeneration_None DAC_WaveGeneration_Noise DAC_WaveGeneration_Triangle DAC_LFSRUnmask_TriangleAmplitude DAC 通道屏蔽/幅值选择器 DAC_LFSRUnmask_TriangleAmplitude DAC_LFSRUnmask_Bit0 DAC_LFSRUnmask_Bits1_0 DAC_LFSRUnmask_Bits2_0 DAC_LFSRUnmask_Bits3_0 DAC_LFSRUnmask_Bits4_0 DAC_LFSRUnmask_Bits5_0 DAC_LFSRUnmask_Bits6_0 DAC_LFSRUnmask_Bits7_0 DAC_LFSRUnmask_Bits8_0 DAC_LFSRUnmask_Bits9_0 DAC_LFSRUnmask_Bits10_0 DAC_LFSRUnmask_Bits11_0 DAC_TriangleAmplitude_1 描述 对噪声波屏蔽 DAC 通道 LFSR 位 0 对噪声波屏蔽 DAC 通道 LFSR 位[1:0] 对噪声波屏蔽 DAC 通道 LFSR 位[2:0] 对噪声波屏蔽 DAC 通道 LFSR 位[3:0] 对噪声波屏蔽 DAC 通道 LFSR 位[4:0] 对噪声波屏蔽 DAC 通道 LFSR 位[5:0] 对噪声波屏蔽 DAC 通道 LFSR 位[6:0] 对噪声波屏蔽 DAC 通道 LFSR 位[7:0] 对噪声波屏蔽 DAC 通道 LFSR 位[8:0] 对噪声波屏蔽 DAC 通道 LFSR 位[9:0] 对噪声波屏蔽 DAC 通道 LFSR 位[10:0] 对噪声波屏蔽 DAC 通道 LFSR 位[11:0] 设置三角波振幅为 1 关闭波形生成 使能噪声波形发生器 使能三角波发生器 描述 关闭 DAC 通道触发 TIM6TRGO 事件 TIM8TRGO 事件 ,适用于大容量产品 TIM3TRGO 事件适用于互联型产品 TIM7TRGO 事件 TIM5TRGO 事件 TIM15TRGO 事件,适用于中、小容量产品 TIM2TRGO 事件 TIM4TRGO 事件 外部中断线 9 使能 DAC 通道软件触发 描述

STM32DAC详解

STM32DAC详解

STM32DAC详解上⼀篇介绍了《》,既然有模拟转数字的ADC模块,那么就必然有数字转模拟的DAC模块。

顾名思义,该模块仅具有ADC的补充功能。

它将数字⼆进制值转换为模拟电压输出。

DAC模块具有多种⽤途,包括⾳频⽣成,波形⽣成等。

通常在⼤多数8位微控制器中,此模块不可⽤,并且通过脉宽调制(PWM)可以稍微满⾜其需求。

部分原因是由于它们的硬件资源和运⾏速度相对较低。

所有STM32单⽚机都具有PWM模块,但⼤容量STM32也具有DAC模块。

STM32DAC模块不是很复杂,并且在⼯作原理⽅⾯与ADC模块相似。

01、DAC简介从STM32F207数据⼿册看到,STM32F207具有两个DAC模块。

每个DAC具有独⽴的通道,对应的GPIO分别为:PA4和PA5。

对于GPIO的复⽤功能(Alternatefunctions)和附加功能(Additionalfunctions),在《》有详细讲解。

除了DAC输出的管脚,还有其他相关引脚注意:使能DAC 通道x 后,相应GPIO 引脚(PA4 或PA5)将⾃动连接到模拟转换器输出(DAC_OUTx)。

为了避免寄⽣电流消耗,应⾸先将PA4 或PA5 引脚配置为模拟模式(AIN)。

下⾯的简化框图显⽰了STM32DAC模块的主要组件。

02、DAC转换由框图可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器写⼊数据,⽽是通过DHRx间接地传给DORx寄存器,实现对DAC的输出控制。

不能直接对寄存器DAC_DORx写⼊数据,任何输出到DAC通道x的数据都必须写⼊DAC_DHRx寄存器(数据实际写⼊DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。

1. 如果没有选中硬件触发(寄存器DAC_CR1的TENx位置0),存⼊寄存器DAC_DHRx的数据会在⼀个APB1时钟周期后⾃动传⾄寄存器DAC_DORx;2. 如果选中硬件触发(寄存器DAC_CR1的TENx位置1),数据传输在触发发⽣以后3个APB1时钟周期后完成。

用STM32内置的ADC实现数字示波器

用STM32内置的ADC实现数字示波器

用STM32内置的高速ADC实现简易示波器2010-06-22 00:38:32| 分类:STM32 | 标签:|字号大中小订阅这几周一直在埋头学习STM32,在论坛上学到了不少知识,得到了大家的帮助,这里衷心的向大家表示感谢,尤其是特别要感谢论坛上GRANT_JX大大:)正是有幸得到了他热心相赠的STM32F103VB芯片以及评估版的PCB,我才能够顺利开展我的STM32学习之旅啊。

经过一段时间的学习实验终于对STM32有了点初步的了解,有点入门了,呵呵。

并汇报下几周来学习STM32的小作品:用STM32内置的1MspsADC进行数据采样,并通过ENC28J60以太网接口发送到PC上波形显示,实现了低频数据采集及简易示波器功能。

刚刚初步实验有所收获,高兴啊,呵呵,特地帖上来跟大家分享下:)做一个数字采样示波器一直是我长久以来的愿望,不过毕竟这个目标难度比较大,涉及的方面实在太多,模拟前端电路、高速ADC、单片机、CPLD/FPGA、通讯、上位机程序、数据处理等等,不是一下子就能成的,慢慢一步步来呗,呵呵,好歹有个目标,一直在学习各方面的知识,也有动力:)由于高速ADC涉及到采样后的数据存储问题,大量的数据涌入使得单片机无法承受,因此通常需要用外部高速RAM加CPLD配合,或者干脆用大容量的FPGA做数据存储处理等,然后通知单片机将数据发送出去。

这部分实在是难度比较大,电路非常复杂,自己是有心无力啊,还得慢慢地技术积累。

正好ST新推出市场的以CORTEX-M3为核心的STM32,内部集成了2个1Msps 12bit的独立ADC,并且内部高达72MHZ的主频,高达1.25DMIPS/MHZ 的处理速度,高速的DMA传输功能,灵活强大的4个TIMER等等,这些真是非常有吸引力,何不用它来实现一个低频的数字示波器功能呢,我的目标是暂时只要定量定性地分析20KHZ以下的低频信号就行了,目标不高吧,用STM32可以方便地实现,等有了一定经验之后慢慢再用FPGA和高速ADC搞个100Msps 采样的示波器!说来也真是幸运,得到了GRANT兄相赠的STM32F103VB以及评估版的电路板,这些日子一直在学习STM32,不断地做实验,也算是稍微有点入门了,真是了解越多越喜欢这个芯片,呵呵。

基于stm32的信号发生器设计

基于stm32的信号发生器设计

课程设计报告For personal use only in study and research; not for commercial use设计课题:信号发生器专业班级:电子信息科学与技术一班学生姓名:***指导教师:***设计时间:信号发生器一.实验概述本系统以低功耗单片机stm32为主控器件,分为微控制器、FPGA、DA转换器、功率放大等模块,实现了一个能产生任意波形的波形发生器。

本设计利用单片机生成各种波形的数据,将数据传输给RAM存储器,通过后级的DA转换器实现波形的产生。

系统采用触摸屏方式输入波形参数和手绘波形,频率1HZ步进可调,峰-峰值可在0到10V之间任意调节。

电路设计条理清晰,人机交互界面友好,控制方便,很好地完成了题目的所有基本和发挥要求。

二.实验要求与目的实验要求:设计简易函数信号发生器系统实验目的:掌握应用嵌入式系统生成函数信号的方法三.实验内容与实验设备实验内容:a)设计程控放大器电路b)设计嵌入式系统电路及程序,实现信号发生器基本功能,可以产生三种标准波形:正玄波、三角波和方波;c)编写嵌入式系统程序,实现函数信号发生器功能,可以对标准波形设计频率、周期、最大值、最小值、峰峰值、偏移量和方波占空比。

d)编写嵌入式系统程序,实现随机信号发生器功能,输出在手写板上描绘的波形。

e)编写嵌入式系统程序,实现通讯功能,可以通过RS232接口设置输出信号。

实验设备:a)示波器、信号发生器、万用表b)STC单片机开发板、C8051F开发板、STM32开发板实验器件: STM32F103ZET6、ADUC7026四.方案比较1.1波形生成方案方案一:采用锁相式频率合成方案这种方案利用锁相环将压控振荡器VCO的输出频率锁定在所需频率上。

这种方案具有很好的窄带跟踪特性,很好的选择所需频率。

但由于模拟方法合成的正弦波参数(如:幅度,频率,相位)都很难被控制,难以满足实现任意波形的要求。

STM32产生任意波形的一种实现思路(以产生5k赫兹的方波STM32F103RCT6,HA。。。

STM32产生任意波形的一种实现思路(以产生5k赫兹的方波STM32F103RCT6,HA。。。

STM32产⽣任意波形的⼀种实现思路(以产⽣5k赫兹的⽅波STM32F103RCT6,HA。

本⽂的实现思路为DAC+DMA+TIMER 的⽅法产⽣任意波形基本思路DDS的原理,通过在STM32中,存储⼀个完整周期的信号波形,并以等间隔时间将波形数据输出,即可得到预期的波形我们在⼀个完整周期内取100点,⽤着100点来描述⼀个完整的周期信号1、我们需要5KHz∗100=500KHz的时间间隔——定时器以1500KHz的时间间隔输出单个的波形数据,不断重复即可得到频率为5K赫兹的波形。

2、在长度为100的波形数组中,定义前50个数据为0,后50个数据为1,形成⼀个完整的单周期⽅波信号。

3、定时器循环的输出⽅波数组中的波形数据即可得到的5KHz的⽅波。

程序流程STM32的TIM、TRGO事件STM32中有三类定时器:⾼级定时器、通⽤定时器、基本定时器。

三类定时器都可以产⽣触发事件(TRGO),所以使⽤任意⼀种定时器即可,这⾥以使⽤基本定时器为例。

当定时器发⽣溢出时,可以通过触发控制器产⽣TRGO事件。

可以看到当定时器发⽣上溢时,将产⽣更新事件,在CubeMX中可以配置上⽂的基本思路⾥⾯我们已经知道,定时器需要定时1500KHz的时间,TIM6挂接在系统APB1总线,APB1总线的时钟频率为18Mhz,根据定时器时间计算公式:T(s)=(ARR+1)∗(PSC+1) TIM C LK(Hz)f(Hz)=TIM C LK(Hz)(ARR+1)∗(PSC+1)=18MHz(5+1)∗(5+1)=500KHzSTM32DAC触发⽅式下的DMA传输根据参考⼿册中可知,当有外部触发DAC转换时,DAC会先产⽣⼀个DMA请求,更新DAC_DORx寄存器,更新完成后再进⾏DA转换在CubeMX中的设置如下:DAC触发启动:DAC的DMA配置:主程序的编写1、构建波形数据:2、在初始化后开启定时器、开始DMA转换:3、切换波形在这⾥使⽤按键KEY0来控制波形的切换,当按键按下产⽣外部中断,在中断中处理波形总结不同于以往,我⼀般使⽤定时器定时,到时间后,⼿动执⾏DA转换,这次使⽤定时器触发,DMA传输波形数据来完成DA转换。

stm32标准库dac+运算放大电路

stm32标准库dac+运算放大电路

标题:探索STM32标准库中的DAC功能及其与运算放大电路的结合应用近年来,嵌入式系统的发展已经极大地推动了数字信号处理技术的应用,其中,STM32作为一种常用的微控制器,其标准库中的DAC功能与运算放大电路的结合应用备受关注。

本文将从深度和广度两方面对这一主题进行全面评估,并为读者探寻出一条从简到繁、由浅入深的探索路径。

一、STM32标准库中的DAC功能在嵌入式系统中,DAC(数模转换器)是一种将数字信号转换为模拟信号的重要器件。

而在STM32的标准库中,DAC功能的实现则成为了许多嵌入式开发者关注的焦点之一。

通过对DAC功能的调试和优化,可以实现精准的电压输出,并广泛应用于音频播放、信号发生、工业控制等领域。

了解STM32标准库中DAC功能的使用方法及其参数配置对于嵌入式系统开发者而言是至关重要的。

1. DAC功能的初始化对于STM32标准库中的DAC功能,首先需要进行初始化设置。

可以通过配置DAC的输出电压范围、输出通道、输出缓冲器等参数,来实现对DAC功能的灵活控制。

2. DAC输出波形的生成在实际应用中,不仅需要简单地实现固定电压输出,还需要通过DAC 来生成各种复杂的波形信号,如正弦波、方波、锯齿波等。

针对不同波形信号的生成,需要结合定时器、中断等技术,来实现DAC输出波形的灵活生成。

二、运算放大电路在嵌入式系统中的应用除了了解STM32标准库中的DAC功能外,嵌入式开发者还需要了解运算放大电路在嵌入式系统中的重要性及其应用。

作为一种重要的信号处理器件,运算放大电路在信号放大、滤波、模数转换等方面发挥着重要作用。

1. 运算放大电路的基本原理运算放大电路是一种带负反馈的放大电路,通过合理的负反馈连接和参数设置,可以实现电压放大、电流放大、滤波、积分、微分等各种信号处理功能。

了解运算放大电路的基本原理对于在嵌入式系统中进行信号处理是非常重要的。

2. 运算放大电路与传感器的结合应用在嵌入式系统中,各种传感器的应用已经成为了不可或缺的一部分。

STM32之DAC配置

STM32之DAC配置

STM32之DAC配置STM32F103VCT6⾃带两个12位DAC,DAC的转换速度⼀直没有查到,⽹上有⼈说是1MHZ的频率,那就是1us了。

ADC的转换时间在56MHZ⼯作频率下为1us,在72MHZ⼯作频率下为1.17us。

如果AD和DA有对称关系的话,那么很可能跟ADC的时间相同,刚⼊⼿分析的,不见得正确!由于我此次使⽤是DA输出电压。

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);函数就可以发送数据了!!有两点要注意:1、该函数的第⼀个参数DAC_Align_12b_R不可依据设置ADC外设地址的⽅式重写这个地址,因为这个参数是不带基址的,⽽我们重写地址后⼀半会把基址算进去,这样就不对了!(笔者就曾经卡在这⾥!看来凡事不可先⼊为主,否则问题迟早会发⽣。

STM32驱动DA芯片DAC7617

STM32驱动DA芯片DAC7617

STM32驱动DAC7617这是本人第一次根据时序图写程序,完成后的确是有点成就感的。

所以记录下这次驱动的经历,聊以慰藉。

DAC7617是块四路串行输入12位电压输出的数模转换器芯片,低功耗,单电源供电,使用很方便。

从TI公司那里申请了两块,本来还申请其他型号的16位的,但是被拒绝了,只这两片成功了。

芯片到手后搜索了些资料,下载了芯片手册,对照着手册焊出了电路。

手册上说供电用3V的,参考电压才1.25V。

但是我系统板上的电源是5V或者3.3V的,而且1.25V的参考电压不容易得到。

我手头上有3.3V和2.5V 的AMS1117稳压芯片,于是我就用上这两块稳压芯片,把供电电压改成3.3V,参考电压改成2.5V。

硬件原理图如图1:图1首先看看手册,了解一下芯片,都是英文的,大概看懂了一些,主要看引脚的功能,和时序的描述,然后把引脚都注释上中文,方便查阅。

引脚功能如图2:图2接着就是看懂时序图开始写程序,时序图是这样叙述的:发送数据前,LOADREG先从低电平置为高电平,然后CS从高电平变为低电平,开始传输数据,CLK先从高电平置为低电平,然后传输一位数据,CLK置高,上升沿让这位数据进位,然后再如此传输接下来的15位数据;传送完16位数据把CS置高电平,最后LOADREG置为低电平把数据锁存到DAC寄存器。

如此便完成了一次DA传输。

时序图如图3:图3DAC16位寄存器的说明:第十五位和第十六位A1和A0为DAC通道选择通道,共4个通道,十三位和十四为无效,第零位到第十二位为DAC 值寄存器,值为0-4096;通道说明如图4:图4程序源码:/********************************************************************************* ** 文件名: mian.c** 库函数版本V3.5.0** 工作环境: RealView MDK-ARM 4.20** 修改: 韦冬成** 生成日期: 2011-07-25** 功能: DAC7617E驱动测试** 说明: 3.3V供电,2.5V参考电压,0对应0V,2048对应1.25V,4095对应最大值2.50V ** 因此计算公式应为AD_Out = (2.50/4095)*N;*********************************************************************************/ /* 包含头文件*******************************************************************/#include "stm32f10x.h"#include "stdio.h"#include "DAC7617E.h"/* 类型声明--------------——----------------------------------------------------*//* 宏定义--------------——------------------------------------------------------*//* 变量--------------——--------------------------------------------------------*//* 函数声明-----------------------------------------------------------------*//* 函数功能------------------------------------------------------------------*//********************************************************************************* 函数名称: main** 函数说明: 主函数** 输入参数: 无** 输出参数: 无** 返回参数: 无*******************************************************************************/int main(void){#ifdef DEBUGdebug();#endifSystemInit(); /* 系统初始化*/DAC7617E_Configuration();DAC7617E_Set_Value(0,2048); /* 通道A输出2048对应1.25V*/DAC7617E_Set_Value(1,2048); /* 通道B输出4095对应1.25V*/DAC7617E_Set_Value(2,4095); /* 通道C输出4095对应2.50V*/DAC7617E_Set_Value(3,0); /* 通道D输出0对应0.00V*/while(1){}//while(1)结束}#ifdef USE_FULL_ASSERT/******************************************************************************* * 函数名称: assert_failed* 函数说明: 报告在检查参数发生错误时的源文件名和错误行数* 输入参数: file: 源文件名line: 错误所在行数* 输出参数: 无* 返回参数: 无*****************************************************************************/ void assert_failed(uint8_t* file, uint32_t line){/* 用户可以增加自己的代码用于报告错误的文件名和所在行数,例如:printf("错误参数值: 文件名%s 在%d行\r\n", file, line) *//* 无限循环*/while (1){}}#endif/***********************************文件结束***********************************//******************************************************************************* **文件名: DAC7617E.c**模块功能: DAC7617E模块**修改:韦冬成**日期:2011.07.26**说明:把LDAC直接接低电平可节省一个IO口,若不需把所有通道同时** 复位则可把RESET直接接高电平,再省一个IO,如此,操作该芯** 片只需4个IO.** 本程序在3.3V供电,2.5V参考电压情况下测试,输出4095时对应最** 大电压为2.50V,中值(2048)对应1.25V.*******************************************************************************/ #include "DAC7617E.h"/******************************************************************************* * Function Name : DAC7617E_Configuration* Description : Configures DAC7617E* Input : None* Output : None* Return : None*******************************************************************************/ void DAC7617E_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/*Enble GPIOD*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能由APB2时钟控制的外设中的PA/*配置DAC7617E对应位IO口*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;//IO 端口的第8,9,10,11位GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻转速度为50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //端口模式为推拉输出方式GPIO_Init(GPIOD, &GPIO_InitStructure); //用以上几个参数初始化PA口/*设置IO为低电平*/DAC_LOADREG_SET(0);DAC_CS_SET(0);DAC_CLK_SET(0);DAC_SDI_SET(0);}void DAC7617E_Set_Value(u16 DA_chanel,u16 DA_V alue)//DA_chanel为DAC通道选择,0~3对应通道A~B,DA_Value为DAC输出值0~4096;{u8 i=0;u16 Setdata = 0;DAC_LOADREG_SET(1);DAC_CLK_SET(1);DAC_CS_SET(1);Setdata = ((DA_chanel<<14)&0xC000)+(DA_Value&0x0FFF);for(i=0;i<16;i++){DAC_CS_SET(0);DAC_CLK_SET(0);if(Setdata&0x8000){DAC_SDI_SET(1);}else{DAC_SDI_SET(0);}DAC_CLK_SET(1);Setdata<<=1;}DAC_CS_SET(1);DAC_LOADREG_SET(0);DAC_LOADREG_SET(1);}#ifndef __DAC7617E_H__#define __DAC7617E_H__/********************************************************************************文件名: DAC7617E.h**内容简述:头文件**修改:韦冬成**日期:2011.07.26*******************************************************************************/ #include "stm32f10x.h"/* 宏定义--------------------------------------------------------------------*///DAC7617E#define DAC_SDI (1<<8) // PD8#define DAC_CLK (1<<9) // PD9#define DAC_CS (1<<10) // PD10#define DAC_LOADREG (1<<11) // PD11#define DAC_LOADREG_SET(x) GPIOD->ODR=(GPIOD->ODR&~DAC_LOADREG)|(x ? DAC_LOADREG:0)#define DAC_CS_SET(x) GPIOD->ODR=(GPIOD->ODR&~DAC_CS)|(x ? DAC_CS:0)#define DAC_CLK_SET(x) GPIOD->ODR=(GPIOD->ODR&~DAC_CLK)|(x ? DAC_CLK:0) #define DAC_SDI_SET(x) GPIOD->ODR=(GPIOD->ODR&~DAC_SDI)|(x ? DAC_SDI:0)/* 函数声明-----------------------------------------------------------------*/void DAC7617E_Configuration(void);void DAC7617E_Set_Value(u16 DA_chanel,u16 DA_Value);//DA_chanel为DAC通道选择,0~3对应通道A~B,DA_Value为DAC输出值0~4096;#endif /*#ifndef __DAC7617E_H__*/。

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制此程序能输出两路通道,三路波形,利用STM32的DAC,TIM,LCD,和DMA控制的发射出正弦波,锯齿波和三角波,每种波形频率可调,独立输出,独立显示频率,使能。

最高频率达12.5KHz。

三种波形都是有一个简易小UI界面,电阻式触摸屏,能够完全手动控制通道的选择,波形的选择频率的选择以及各种波形的使能。

/****************************************************************************** **************使用手册:0.初学即兴所敲,不喜勿喷。

1.通道1和通道2只能分开输出。

2.只有选中响应的波形选择框,才能设置频率或者使能。

3.使能端只能在通道1或者通道2打开的情况下才能被使按下操作有效。

4.每次使能一个波形,其他波形使能将自动关闭。

5.当通道1和通道2都关闭,使能将自动无效。

6.通道1和通道2切换,必须重新使能。

7.开发平台为STM32战舰版。

USER:Zhang Changhao******************************************************************************* **************/#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "lcd.h"#include "usart.h"#include "24cxx.h"#include "flash.h"#include "touch.h"#include "STM32_WaveOutput.h"u8 t,Mode1,Mode2,Mode1_Flag,Mode2_Flag;u8 sinewave_flag,sawtooth_flag,triangle_flag,sinewave_mode,sawtooth_mode,triangle_mode;u8 sinewave_en,sawtooth_en,triangle_en;u8 sinewave_fre,sawtooth_fre,triangle_fre;u8 output_wave;u16 output_fre;#define MODE1 1#define MODE2 2#define sinewave 1#define sawtooth 2#define triangle 3void wave_show(u8 wavemode);void en_show(u8 wavemode);void Mode_Show(u8 mode);void wave_fre(u8 wavemode);void judge_tongdao();void judge_wave();void judge_en();void judge_fre();void show_init();void fengbi_tongdao();int main(void){delay_init();//延时函数初始化NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);//串口初始化为9600LED_Init();//LED端口初始化LCD_Init();KEY_Init();tp_dev.init();show_init();while(1){t=TP_Scan(0);if(t){t=0;//printf("%d,%d\r\n",tp_dev.x[0],tp_dev.y[0]);judge_tongdao();judge_wave();judge_en();judge_fre();if(sinewave_en==1||sawtooth_en==1||triangle_en==1){if(Mode1_Flag!=DISABLE){if(sinewave_en){output_wave=sinewave;output_fre=sinewave_fre*100;}else if(sawtooth_en){output_wave=sawtooth;output_fre=sawtooth_fre*100;}else if(triangle_en){output_wave=triangle;output_fre=triangle_fre*100;}printf("%d,%d\r\n",output_wave,output_fre);Wave_Init((output_wave-1),output_fre,ENABLE,(output_wave-1),output_fre,DISABLE); //printf("%d\r\n",TIM_TimeBaseStructure.TIM_Period);//Set_WaveFre(0,output_fre);}else if(Mode2_Flag!=DISABLE){if(sinewave_en){output_wave=sinewave;output_fre=sinewave_fre*100;}else if(sawtooth_en){output_wave=sawtooth;output_fre=sawtooth_fre*100;}else if(triangle_en){output_wave=triangle;output_fre=triangle_fre*100;}Wave_Init((output_wave-1),output_fre,DISABLE,(output_wave-1),output_fre,ENABLE);printf("%d,%d\r\n",output_wave,output_fre);}}else{Wave_Init(0,1,DISABLE,0,1,DISABLE);}}//if(t)LED1=!LED1;delay_ms(100);}}void show_init(){//清屏LCD_Clear(CYAN);POINT_COLOR=BROWN;//设置字体为红色LCD_Fill(0,0,2,320,BROWN);LCD_Fill(0,0,240,2,BROWN) ;LCD_Fill(0,318,240,320,BROWN);LCD_Fill(238,0,240,320,BROWN);LCD_Fill(7,7,9,313,BROWN);LCD_Fill(7,7,233,9,BROWN) ;LCD_Fill(7,311,233,313,BROWN);LCD_Fill(231,7,233,313,BROWN);LCD_DrawLine(0,0,7,7);LCD_DrawLine(233,313,240,320);LCD_DrawLine(233,7,240,0);LCD_DrawLine(7,313,0,320);//通道1 2的初始化POINT_COLOR=RED;//设置字体为红色LCD_Fill(20,20,110,65,MAGENTA);LCD_ShowString(38,35,80,16,16,"Output1"); LCD_Fill(130,20,220,65,MAGENTA);LCD_ShowString(148,35,80,16,16,"Output2");//正弦初始化LCD_Fill(50,80,145,110,LIGHTGREEN) ;LCD_ShowString(67,88,64,16,16,"SineWave"); LCD_Fill (155,80,200,110,RED) ;POINT_COLOR=GREEN;Draw_Circle(55,125,13);LCD_DrawLine(42,125,68,125);LCD_DrawLine(55,112,55,138);POINT_COLOR=BROWN;Draw_Circle(168,125,13);LCD_DrawLine(155,125,181,125) ;LCD_ShowString(72,120,80,16,16,"Fre:0.0KHz");//锯齿初始化POINT_COLOR=RED;LCD_Fill(50,150,145,180,DARKBLUE);LCD_ShowString(67,158,64,16,16,"SawTooth"); LCD_Fill (155,150,200,180,RED) ;POINT_COLOR= GREEN;Draw_Circle(55,195,13);LCD_DrawLine(42,195,68,195);LCD_DrawLine(55,182,55,208);POINT_COLOR=BROWN;Draw_Circle(168,195,13);LCD_DrawLine(155,195,181,195);LCD_ShowString(72,190,80,16,16,"Fre:0.0KHz");//三角初始化POINT_COLOR=RED;LCD_Fill(50,220,145,250,YELLOW) ;LCD_ShowString(63,228,64,16,16,"triangle"); LCD_Fill(155,220,200,250,RED) ;POINT_COLOR= GREEN;Draw_Circle(55,265,13);LCD_DrawLine(42,265,68,265);LCD_DrawLine(55,252,55,278);POINT_COLOR= BROWN;Draw_Circle(168,265,13);LCD_DrawLine(155,265,181,265);LCD_ShowString(72,260,80,16,16,"Fre:0.0KHz");LED0=0;//张长浩POINT_COLOR=DARKBLUE;LCD_ShowString(65,295,168,16,16,"BY:Zhang Changhao^_^");POINT_COLOR= BROWN;}void judge_tongdao(){//通道1 2 的识别操作if((tp_dev.x[0]>19)&&(tp_dev.x[0]<111)&&(tp_dev.y[0]>19)&&(tp_dev.y[0]<66)){ printf("\r\n");if(Mode1_Flag){Mode1_Flag=0;Mode1=DISABLE;//fengbi_tongdao();Mode_Show(MODE1);}else{Mode1_Flag=1;if(Mode2_Flag){Mode2=0;Mode2_Flag=0;Mode_Show(MODE2) ;}Mode1=ENABLE;Mode_Show(MODE1);}fengbi_tongdao();}else if((tp_dev.x[0]>129)&&(tp_dev.x[0]<221)&&(tp_dev.y[0]>19)&&(tp_dev.y[0]<66)){if(Mode2_Flag){Mode2_Flag=0;Mode2=DISABLE;//fengbi_tongdao();Mode_Show(MODE2);}else{Mode2_Flag=1;if(Mode1_Flag){Mode1=0;Mode1_Flag=0;Mode_Show(MODE1);}Mode2=ENABLE;Mode_Show(MODE2) ;}fengbi_tongdao();}}void judge_wave(){//三个波的识别操作if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146)&&(tp_dev.y[0]>79)&&(tp_dev.y[0]<111)) {if(sinewave_flag){sinewave_flag=0;sinewave_mode=DISABLE;wave_show(sinewave);}else{sinewave_flag=1;if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=0;wave_show(sawtooth) ;}else if(triangle_flag){triangle_flag=0;triangle_mode=0;wave_show(triangle) ;}sinewave_mode=ENABLE;wave_show(sinewave);}}///////////////else if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146) &&(tp_dev.y[0]>149)&&(tp_dev.y[0]<181)) {if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=DISABLE;wave_show(sawtooth);}else{sawtooth_flag=1;if(sinewave_flag){sinewave_flag=0;sinewave_mode=0;wave_show(sinewave) ;}else if(triangle_flag){triangle_flag=0;triangle_mode=0;wave_show(triangle) ;}sinewave_mode=ENABLE;wave_show(sawtooth);}}///////////////////////////////////else if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146) &&(tp_dev.y[0]>219)&&(tp_dev.y[0]<251)) {if(triangle_flag){triangle_flag=0;triangle_mode=DISABLE;wave_show(triangle);}else{triangle_flag=1;if(sinewave_flag){sinewave_flag=0;sinewave_mode=0;wave_show(sinewave) ;}if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=0;wave_show(sawtooth) ;}triangle_mode=ENABLE;wave_show(triangle);}}}void judge_en(){//三种波的使能显示if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201)&&(tp_dev.y[0]>79)&&(tp_dev.y[0]<111)) {if(sinewave_flag&&(Mode1||Mode2)){if(sinewave_en){sinewave_en=0;en_show(sinewave);}else{sinewave_en=1;if(sawtooth_en){sawtooth_en=0;en_show(sawtooth) ;}else if(triangle_en){triangle_en=0;wave_show(triangle) ;}en_show(sinewave);}}else{sinewave_en=0;en_show(sinewave);}}///////////////else if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201) &&(tp_dev.y[0]>149)&&(tp_dev.y[0]<181)) {if(sawtooth_flag&&(Mode1||Mode2)){if(sawtooth_en){sawtooth_en=0;en_show(sawtooth);}else{sawtooth_en=1;if(sinewave_en){sinewave_en=0;en_show(sinewave) ;}else if(triangle_en){triangle_en=0;en_show(triangle) ;}en_show(sawtooth);}}else{sawtooth_en=0;en_show(sawtooth);}}///////////////////////////////////else if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201) &&(tp_dev.y[0]>219)&&(tp_dev.y[0]<251)) {if(triangle_flag&&(Mode1||Mode2)){if(triangle_en){triangle_en=0;en_show(triangle);}else{triangle_en=1;if(sinewave_en){sinewave_en=0;en_show(sinewave) ;}if(sawtooth_en){sawtooth_en=0;en_show(sawtooth) ;}en_show(triangle);}}else{triangle_en=0;en_show(triangle);}} //使能判断if(triangle_en==0||sawtooth_en==0||sinewave_en==0){TIM_Cmd(TIM6, DISABLE);TIM_Cmd(TIM2, DISABLE);}}void judge_fre(){// 频率检测if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(125-tp_dev.y[0])*(125-tp_dev.y[0])<150){if(sinewave_flag){sinewave_fre+=1;wave_fre(sinewave);}}else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(125-tp_dev.y[0])*(125-tp_dev.y[0])<150){if(sinewave_flag){sinewave_fre-=1;wave_fre(sinewave);}}else if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(195-tp_dev.y[0])*(195-tp_dev.y[0])<150){if(sawtooth_flag){sawtooth_fre+=1;wave_fre(sawtooth);}}else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(195-tp_dev.y[0])*(195-tp_dev.y[0])<150){if(sawtooth_flag){sawtooth_fre-=1;wave_fre(sawtooth);}}else if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(265-tp_dev.y[0])*(265-tp_dev.y[0])<150){if(triangle_flag){triangle_fre+=1;wave_fre(triangle);}}else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(265-tp_dev.y[0])*(265-tp_dev.y[0])<150){if(triangle_flag){triangle_fre-=1;wave_fre(triangle);}} //判断频率}void Mode_Show(u8 mode){u16 color;color = POINT_COLOR;if(mode==1)//如果是模式1 就对模式1进行操作{if(Mode1==1){//横打印LCD_Fill(20,20,110,25,BLACK);LCD_Fill(20,60,110,65,BLACK);//竖打印LCD_Fill(105,20,110,65,BLACK);LCD_Fill(20,20,25,65,BLACK);}else{//横打印LCD_Fill(20,20,110,25,MAGENTA);LCD_Fill(20,60,110,65,MAGENTA);//竖打印LCD_Fill(105,20,110,65,MAGENTA);LCD_Fill(20,20,25,65,MAGENTA);}}else{if(Mode2==1){//横打印LCD_Fill(130,20,220,25,BLACK);LCD_Fill(130,60,220,65,BLACK);//竖打印LCD_Fill(215,20,220,65,BLACK);LCD_Fill(130,20,135,65,BLACK);}else{//横打印LCD_Fill(130,20,220,25,MAGENTA);LCD_Fill(130,60,220,65,MAGENTA);//竖打印LCD_Fill(215,20,220,65,MAGENTA);LCD_Fill(130,20,135,65,MAGENTA);}}POINT_COLOR=color;}void wave_show(u8 wavemode){u16 color;color = POINT_COLOR;if(wavemode==1)//如果是sine 就对模式2进行操作{if(sinewave_flag==1){//横打印LCD_Fill(50,80,145,85,BLACK);LCD_Fill(50,105,145,110,BLACK);//竖打印LCD_Fill(50,80,55,110,BLACK);LCD_Fill(140,80,145,110,BLACK);}else{//横打印LCD_Fill(50,80,145,85,LIGHTGREEN);LCD_Fill(50,105,145,110,LIGHTGREEN);//竖打印LCD_Fill(50,80,55,110,LIGHTGREEN);LCD_Fill(140,80,145,110,LIGHTGREEN);}}else if(wavemode==2)//如果是saw 就对模式2进行操作{if(sawtooth_flag==1){//横打印LCD_Fill(50,150,145,155,BLACK);LCD_Fill(50,175,145,180,BLACK);//竖打印LCD_Fill(50,150,55,180,BLACK);LCD_Fill(140,150,145,180,BLACK);}else{LCD_Fill(50,150,145,155,DARKBLUE);LCD_Fill(50,175,145,180,DARKBLUE);//竖打印LCD_Fill(50,150,55,180,DARKBLUE);LCD_Fill(140,150,145,180,DARKBLUE);}}else if(wavemode==3)//如果是tri 就对模式3进行操作{if(triangle_flag==1){//横打印LCD_Fill(50,220,145,225,BLACK);LCD_Fill(50,245,145,250,BLACK);//竖打印LCD_Fill(50,220,55,250,BLACK);LCD_Fill(140,220,145,250,BLACK);}else{//横打印LCD_Fill(50,220,145,225,YELLOW);LCD_Fill(50,245,145,250,YELLOW);//竖打印LCD_Fill(50,220,55,250,YELLOW);LCD_Fill(140,220,145,250,YELLOW);}}POINT_COLOR=color;}void en_show(u8 wavemode){u16 color;color = POINT_COLOR;if(wavemode==1)//如果是sine 就对模式2进行操作{if(sinewave_flag==1){if(sinewave_en){LCD_Fill(155,150,200,180,RED);LCD_Fill(155,220,200,250,RED);//切换波形后吧其他波形给关了LCD_Fill(155,80,200,110,GREEN);}else{LCD_Fill(155,80,200,110,RED);}}}if(wavemode==2)//如果是saw 就对模式2进行操作{if(sawtooth_flag==1){if(sawtooth_en){LCD_Fill(155,80,200,110,RED);LCD_Fill(155,220,200,250,RED);LCD_Fill(155,150,200,180,GREEN);}else{LCD_Fill(155,150,200,180,RED);}}}if(wavemode==3)//如果是saw 就对模式2进行操作{if(triangle_flag==1){if(triangle_en){LCD_Fill(155,150,200,180,RED);LCD_Fill(155,80,200,110,RED);LCD_Fill(155,220,200,250,GREEN);}else{LCD_Fill(155,220,200,250,RED);}}}POINT_COLOR=color;}void wave_fre(u8 wavemode){if(wavemode==1)//如果是sine 就对模式2进行操作{if(sinewave_flag==1){LCD_ShowNum(104,120,(sinewave_fre/10),1,16);LCD_ShowNum(120,120,(sinewave_fre%10),1,16);}}if(wavemode==2)//如果是sine 就对模式2进行操作{if(sawtooth_flag==1){LCD_ShowNum(104,190,(sawtooth_fre/10),1,16);LCD_ShowNum(120,190,(sawtooth_fre%10),1,16);}}if(wavemode==3)//如果是sine 就对模式2进行操作{if(triangle_flag==1){LCD_ShowNum(104,260,(triangle_fre/10),1,16);LCD_ShowNum(120,260,(triangle_fre%10),1,16);}}}void fengbi_tongdao(){sinewave_en=0;sawtooth_en=0;triangle_en=0;LCD_Fill(155,150,200,180,RED);LCD_Fill(155,220,200,250,RED);LCD_Fill(155,80,200,110,RED);if(Mode1==DISABLE){TIM_Cmd(TIM2, DISABLE);}if(Mode2==DISABLE){TIM_Cmd(TIM6, DISABLE);}}。

STM32(二十二)DAC输出正弦波

STM32(二十二)DAC输出正弦波

在常见的数字信号系统中大部分传感器信号被化成电压信号而adc把电压模拟信号转换成易于计算机存储处理的数字编码由计算机处理完成后再由dac输出电压模拟信号该电压模拟信号常常用来驱动某些执行器件使人类易于感知
STM32(二十二) DAC输出正弦波
一、简介
DAC为数模转换模块,作用是把输入的数字编码,转换成对应的模拟电压输出。在常见的数字信号系统中,大部分传感器信号被化成电 压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟ห้องสมุดไป่ตู้号,该电压模拟 信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还原就是这样-一个过程。

使用STM32微控制器系列中的DAC生成音频和波形

使用STM32微控制器系列中的DAC生成音频和波形

使用STM32微控制器系列中的DAC生成音频和波形STM32微控制器系列中的DAC(Digital-to-Analog Converter)可以用于生成音频和波形信号。

DAC将数字信号转换为模拟信号,可以输出到外部设备,如扬声器或耳机,以产生音频信号。

在以下的讨论中,我将介绍如何使用STM32的DAC模块生成音频和波形。

首先,我们需要配置DAC模块的参数以及引脚连接。

在STM32的Datasheet中,我们可以找到有关DAC模块的详细信息。

我们需要选择一个可用的DAC通道,并配置相应的引脚作为输出。

为了简单起见,我们可以选择一个单通道的DAC模块,并将其连接到GPIO引脚。

接下来,我们需要编写代码来配置和控制DAC模块。

在STM32固件库(HAL库)中提供了用于操作DAC模块的函数。

我们需要包含相应的库文件,并初始化DAC模块及其相关参数。

以下是一个使用STM32HAL库进行DAC配置的示例代码:```cpp#include "stm32f4xx_hal.h"DAC_HandleTypeDef hdac;void DAC_Config(void)//初始化DAC模块hdac.Instance = DAC;HAL_DAC_Init(&hdac);//配置DAC通道参数DAC_ChannelConfTypeDef sConfig;sConfig.DAC_Trigger = DAC_TRIGGER_NONE;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);void DAC_SetValue(uint32_t value)//设置DAC通道的输出值HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, value);int main(void)//初始化硬件HAL_Init(;//配置DAC模块DAC_Config(;//产生音频或波形信号while (1)//设置DAC输出为一定值DAC_SetValue(2048);}```在上面的代码中,我们首先定义了一个DAC_HandleTypeDef结构体变量hdac,并初始化了DAC模块。

(1条消息)STM32学习之PWMDAC实验中的滤波电路部分元件参数的由来问题

(1条消息)STM32学习之PWMDAC实验中的滤波电路部分元件参数的由来问题

(1条消息)STM32学习之PWMDAC实验中的滤波电路部分元件参数的由来问题在正点原子STM32利用PWM输出+RC滤波来实现一个DAC功能的实验中,有几个参数自己不是很理解,通过翻阅资料,百度等渐渐理解,现总结如下:(以下全是个人理解,如有不缜密的地方,还请阅读者见谅并指出)首先,我们得先明白为什么通过PWM输出+RC滤波能实现DAC 的功能,DAC的功能不用多说,看其名字就知道是数模转换器,也就是将一串数字信号,转换为对应的模拟信号。

比如我们在利用stm32做DAC实验中,如果我们的DAC是12位的,那么我们就可以看作将我们的0~3.3V间的电压分成了2的12次方,也就是4096份,那么我们由每一份对应的电压*我们输入的份数,那么就可以得到一个电压值,我们可以利用我们的ADC进行采集,就可以直接显示出来啦。

以上是对DAC的一个简单的介绍和理解,而这里我们用PWM输出+RC滤波是怎样实现DAC的功能的呢,我们就要回过去复习我们之前学习的PWM输出实验,在那个实验中(主函数代码如图1),我们通过在主函数中添加循环,设置PWM比较值,使得其占空比不断变化,从而实现在一个很快的周期里高低电平占比的变化,从而使人能看到灯从亮到暗,从暗到亮,我的理解如图2所示图1如图2 ,假如灯是从亮到暗(低电平亮),那么,PWM输出的波形的变化则为也就是说,我们通过在一个较快的频率的内改变PWM的占空比就可以将一个明明是间断数字的信号,在我们眼睛看起来就像一个连续变化的模拟信号。

图3 实际电路典型PWM波形对于这样一个PWM波,n为一个周期内的高电平的脉冲个数,N 为一个周期内的脉冲数。

它是一个周期函数,那么我们就可以得到它的傅里叶级数通过其傅里叶级数我们知道,在一个周期中,如果N一定,那么其直流分量与n有关,n越大,一个周期内的高电平所占的比例越大,那么我得到的直流分量就越大,所以,我们可以通过调节PWM的占空比,从而调节n的值,这样我们就可以输出不同大小的直流电压啦。

STM32_DAC学习(固定值_三角波)

STM32_DAC学习(固定值_三角波)

STM32_DAC学习1、学习目的:使用DAC库函数实现固定值、三角波输出在完成目的之前我需要对STM32的DAC转换器进行学习和了解,也就说要知道STM32的DAC有哪些特点,能做哪些事。

下面我们就先看看DAC的特点。

1、DAC的简介:STM32的数字/模拟转换模块(DAC)是12位的数字输入,电压输出的数模转换器。

虽然是12位的,但是也可以配置成8位的模式(即数字输入可以是12位或者8位)。

它可以与DMA控制器配合使用。

在12位数字输入模式时,数据的对齐方式可以左对齐或者右对齐,而8位模式在下是固定的右对齐(无需配置)。

DAC模块有2个通道,每个通道都是独立的,这也导致了DAC可以单通道独立使用,也可以双通道同时使用。

2个通道分别对应的是PA4(1通道)、PA5(2通道)。

2、DAC主要特征:●2个DAC转换器,每个转换器对应1个输出通道●8位或者12位单调输出●12位模式下数据左对齐或者右对齐●同步更新功能●噪声波形生成●三角波形生成●双DAC通道同时或者分别转换●每个通道都有DMA功能●外部触发转换●输入参考电压V REF+DAC通道模块框图:3、DAC固定值输出固定值输出是DAC最简单的使用,在STM32的DAC中我们需要设置的东西并不多。

我可以现在看看DAC_InitTypeDef结构体:typedef struct{u32 DAC_Trigger; //触发选择u32 DAC_WaveGeneration; //波形发生u32 DAC_LFSRUnmask_TriangleAmplitude; //幅值选择u32 DAC_OutputBuffer; //输出缓存控制}DAC_InitTypeDef;在固定值输出时,我们不需要进行触发、幅度设置,只需要使能相应的通道即可。

所以在打开DAC时钟和GPIOA的时钟后,就是进行相应的格式化,固定输出格式化如下:DAC_InitType.DAC_Trigger = DAC_Trigger_None; //不使用触发功能DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生功能DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; //不屏蔽/幅值选择DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//不使用缓存输出DAC_Init(DAC_Channel_1,&DAC_InitType);格式化后就是使能DAC相应的通道DAC_Cmd(DAC_Channel_1,ENABLE); //这里使用通道1所有的准备工作都好了,要想输出想要的值就必须给DAC转换器输入相应的数据DAC_SetChannel1Data(DAC_Align_12b_R,1023);//这里输入3.3V/4的12bit数据4、三角波输出三角波的输出需要仔细阅读数据手册的内容,不然要想输出三角波是不那么容易的。

STM32配置DAC输出固定电压和方波

STM32配置DAC输出固定电压和方波

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。

【STM32H7教程】第60章STM32H7的DAC应用之定时器触发实现DMA方式双通道波形

【STM32H7教程】第60章STM32H7的DAC应用之定时器触发实现DMA方式双通道波形

【STM32H7教程】第60章STM32H7的DAC应⽤之定时器触发实现DMA⽅式双通道波形完整教程下载地址:第60章 STM32H7的DAC应⽤之定时器触发实现DMA⽅式双通道波形本章节为⼤家讲解DAC采⽤定时器触发⽅式实现DMA双通道波形输出,实际输出效果也⽐较好,项⽬使⽤价值也⽐较⼤。

60.1 初学者重要提⽰60.2 H7和F4的DAC输出效果对⽐60.3 DAC驱动设计60.4 DAC驱动移植和使⽤60.5 实验例程设计框架60.6 实验例程说明(MDK)60.7 实验例程说明(IAR)60.8 总结60.1 初学者重要提⽰1. 学习本章节前,务必优先学习第59章,需要对DAC的基础知识有个认识。

2. 开发板右上⾓有个跳线帽,可以让ADC的稳压基准接3.3V或者2.5V,本章例⼦是接到3.3V。

3. 注意STM32H7只有⼀个DAC,但有两个独⽴的通道,跟F4的略不同,F4是两个DAC。

4. 如果仅使⽤STM32H7的⼀个通道,即PA4或者PA5引脚,另⼀个引脚没有做任何配置,这个引脚上会有波形效应。

5. STM32H7的DAC⽀持出⼚校准和⽤户校准模式。

特别注意⼀点,校准是建⽴在⽤户使能了输出缓冲的情况下才有效。

6. STM32H7的DAC⽀持正常模式和采样保持模式,其中采样保持模式⽤于低功耗状态使⽤。

7. DAC的输出除了可以连接PA4或者PA5引脚,也可以连接到⽚上外设,⽐如运放,⽐较器。

60.2 DAC稳压基准硬件设计详见第46章的第2⼩节,有详细说明,ADC和DAC使⽤的基准源是⼀样的。

60.3 H7和F4的DAC输出效果对⽐STM32H7的DAC输出100KHz⽅波的效果⽐F429好不少,满幅输出。

STM32H743输出100KHz的效果如下:STM32F429输出100KHz的效果如下:60.4 DAC驱动设计60.4.1 DAC驱动设计框架为了⽅便⼤家理解DAC驱动的实现,先看下⾯DAC的驱动设计框架:DAC做定时器触发 + DMA数据传输的实现思路框图如下:下⾯为⼤家讲解具体的驱动实现。

12、STM32数模转换器(DAC)

12、STM32数模转换器(DAC)
数模转换器 (DAC)
RM0090
12
数模转换器 (DAC)
除非特别说明,否则本部分适用于整个 STM32F4xx 系列。
12.1
DAC 简介
DAC 模块是 12 位电压输出数模转换器。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出 通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当 两个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压 引脚 VREF+ (与 ADC 共享)来提高分辨率。
DOR DACoutput V REF ------------4095
12.3.6
DAC 触发选择
如果 TENx 控制位置 1,可通过外部事件(定时计数器、外部中断线)触发转换。TSELx[2:0] 控制位将决定通过 8 个可能事件中的哪一个来触发转换,如表 58 所示。 表 58. 外部触发器
每当 DAC 接口在所选定时器 TRGO 输出或所选外部中断线 9 上检测到上升沿时,DAC_DHRx 寄存器中存储的最后一个数据即会转移到 DAC_DORx 寄存器中。发生触发后再经过三个 APB1 周期,DAC_DORx 寄存器将会得到更新。 如果选择软件触发,一旦 SWTRIG 位置 1,转换即会开始。DAC_DHRx 寄存器内容加载到 DAC_DORx 寄存器中后,SWTRIG 即由硬件复位。
DAC 引脚
信号类型 正模拟参考电压输入 模拟电源输入 模拟电源接地输入 模拟输出信号 备注 DAC 高 / 正参考电压,1.8 V VREF+ VDDA 模拟电源 模拟电源接地 DAC 通道 x 模拟输出

stm32dac产生正弦波实践报告

stm32dac产生正弦波实践报告

一、概述stm32单片机作为一种常用的微控制器,拥有丰富的外设资源,其中包括数字模拟转换器(DAC)模块。

DAC模块可以将数字信号转换为模拟信号,通常用于音频处理、波形生成等应用。

本次实践旨在利用stm32单片机的DAC模块,产生正弦波信号,并通过外部电路将其输出到示波器进行观测,验证其波形质量和稳定性。

二、实验准备1.硬件准备1)stm32开发板2)示波器3)示波器探头4)电路连线板5)杜邦线、电阻、电容等元件2.软件准备1)Keil开发环境2)stm32CubeMX配置工具三、实验步骤1.使用stm32CubeMX配置DAC模块1)在stm32CubeMX中新建工程,并选择对应型号的单片机2)在Pinout Configuration中配置DAC输出引脚3)在Configuration中使能DAC模块,并配置输出缓冲区、波形发生器等参数4)生成代码并导入Keil开发环境中2.编写DAC初始化和波形生成代码在Keil中编写初始化DAC模块的代码,并编写正弦波发生算法,将生成的正弦波数据写入DAC数据寄存器。

3.连接示波器进行观测1)通过电路连线板搭建DAC输出到示波器的电路连接2)将示波器探头连接到电路上,设置示波器参数4.程序烧录和调试使用ST-Link将程序烧录到stm32开发板中,通过示波器观测输出波形,并根据实际观测结果进行调试和优化。

五、实验结果与分析经实验验证,stm32DAC产生的正弦波信号波形质量良好,无明显畸变和波形失真,幅度和频率稳定。

示波器观测结果与理论预期吻合,在给定的频率和振幅下,输出波形符合正弦曲线特征。

实验结果表明,stm32DAC模块在波形生成方面具有较高的准确性和稳定性,适用于需要模拟信号输出的应用场景。

六、结论与展望本次实验通过对stm32DAC的使用实践,验证了其正弦波信号产生的可行性和稳定性。

未来可以进一步深入研究DAC模块的其他应用场景,并结合其他外设资源,实现更复杂的信号处理和控制功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AN3126应用笔记使用 STM32 微控制器系列中的 DAC生成音频和波形前言本应用笔记举例介绍了使用数模转换器 (DAC) 外设生成音频输出信号的过程,该 DAC 外设内嵌在 STM32F10xx 微控制器系列产品中。

数模转换器 (DAC) 是一种与模数转换器功能相反的器件,可以将数字形式的数据转换为相应的模拟电压信号。

STM32 DAC 模块是 12 位字转换器,带有两个支持立体声音频的输出通道。

DAC 可用于多种音频应用中,例如:安全警报、蓝牙耳机、发声玩具、答录机、人机接口以及低成本的音乐播放器STM32 DAC 还可实现许多其他模拟用途,如模拟波形产生和控制工程。

本应用笔记主要包括两部分内容:●第 1 节介绍 STM32 DAC 模块的主要特性。

●第 2 节介绍了两个示例。

—在第一个示例中,DAC 用于生成正弦波形。

—在第二个例中,DAC 用于通过 .WAV 文件生成音频。

2010 年 05 月文档 ID 16895 第 1 版1/19目录AN3126目录1DAC 主要特性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1数据格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2双通道模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3专用定时器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.4DMA 功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.5DMA 下溢错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.6白噪声发生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.6.1定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.6.2典型应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.7三角波发生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.7.1定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.7.2典型应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.8缓冲的输出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1使用 DAC 生成正弦波形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1.1说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1.2准备数字模式的正弦波形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1.3修正正弦波频率 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2使用 DAC 实现音频波形播放器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2.1说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2.2音频波形文件规范 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.2.3.WAV 文件格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.3实现音频波形播放器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182/19文档 ID 16895 第 1 版文档 ID 16895 第 1 版3/19AN3126DAC 主要特性1 DAC 主要特性1.1数据格式DAC 可以使用以下三种整型格式的数据:8 位右对齐、12 位右对齐以及 12 位左对齐。

12 位值的范围在 0x000 到 0xFFF 之间,其中 0x000 为最小值,而 0xFFF 为最大值。

图 1.DAC 数据格式1.2 双通道模式DAC 有两个输出通道,每个通道各有一个转换器。

在双 DAC 通道模式下,转换可以单独进行,也可以同时进行。

当 DAC 通道由同一个触发源触发后,两个通道将组合在一起同步执行更新操作,转换也会同时进行。

1.3 专用定时器除了通过软件和外部触发器触发 DAC 转换之外,还可以通过不同的定时器触发 DAC 转换。

TIM6 和 TIM7 是两个基本定时器,主要用于 DAC 触发。

每当 DAC 接口在所选的定时器触发输出 (TIMx_TRGO) 上检测到上升沿时,DAC_DHRx 寄存器中存储的最后一个数据即会转移到 DAC_DORx 寄存器中。

图 2.STM32F100x DAC 触发器通道ai183008 位右对齐12 位左对齐12 位右对齐ai18301DAC 通道 x 触发器DAC 主要特性AN31264/19文档 ID 16895 第 1 版1.4 DMA 功能STM32 微控制器配有一个多通道 DMA 模块。

每个 DAC 通道都连接到独立的 DMA 通道。

对于 STM32F100x 微控制器,DAC 通道 1 连接到 DMA 通道 3,DAC 通道 2 连接到 DMA 通道 4。

未使用 DMA 时,CPU 用于向 DAC 提供模式波形。

通常,波形保存在存储器 (RAM) 中,CPU 负责将数据从 RAM 传输到 DAC 。

使用 DMA 时,系统的整体性能会因内核的释放而提升。

此时,数据直接通过 DMA 从存储器传输到 DAC ,无需 CPU 执行任何操作。

这样节省的 CPU 资源可供其它操作使用。

AN3126DAC 主要特性下溢错误1.5 DMADMA 向 DAC 提供模式波形时,有时会出现 DMA 传输速度比 DAC 转换速度快的情况。

此时,DAC 会检测到部分模式波形遭到忽略而不予转换。

它随后会将“DMA 下溢错误”标志置 1。

可以使用触发定时器通过共享 IRQ 通道处理下溢错误,在 DAC 不通过 TIM6 触发时也可通过专用中断来处理。

1.6 白噪声发生器1.6.1 定义STM32 微控制器 DAC 为用户提供了一个伪随机码发生器。

根据移位寄存器上使用的节拍数,在序列重复前,可生成具有最多 2n-1个数的序列。

文档 ID 16895 第 1 版5/19DAC 主要特性AN31266/19文档 ID 16895 第 1 版图 5.DAC中内置的伪随机码发生器由噪声发生器生成的噪声具有均匀的频谱分布,可将这些噪声视为白噪声。

不过,白噪声分布均匀,不具备高斯输出特性。

图 6.噪声波形噪声波形的偏移量可以编程。

使用预配置的偏移量表更改此偏移量(信号模式),用户可获得与信号模式和噪声波形之和相对应的波形。

相关文档
最新文档