完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、DAC相关
1. DAC简介 DAC数模转换器,又称D/A转换器,,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。 2. DAC的构成与特点 DAC主要由数字寄存器、模拟电子开关、位权网络、求和运算放大器和基准电压源(或恒流源)组成。用存于数字寄存器的数字量的各位数码,分别控制对应位的模拟电子开关,使数码为1的位在位权网络上产生与其位权成正比的电流值,再由运算放大器对各电流值求和,并转换成电压值 。 根据位权网络的不同,可以构成不同类型的DAC,如权电阻网络DAC、R–2R倒T形电阻网络DAC和单值电流型网络DAC等。权电阻网络DAC的转换精度取决于基准电压VREF,以及模拟电子开关、运算放大器和各权电阻值的精度。它的缺点是各权电阻的阻值都不相同,位数多时,其阻值相差甚远,这给保证精度带来很大困难,特别是对于集成电路的制作很不利,因此在集成的DAC中很少单独使用该电路。 它由若干个相同的R、2R网络节组成,每节对应于一个输入位。节与节之间串接成倒T形网络。R–2R倒T形电阻网络DAC是工作速度较快、应用较多的一种。和权电阻网络比较,由于它只有R、2R两种阻值,从而克服了权电阻阻值多,且阻值差别大的缺点 。 电流型DAC则是将恒流源切换到电阻网络中,恒流源内阻极大,相当于开路,所以连同电子开关在内,对它的转换精度影响都比较小,又因电子开关大多采用非饱和型的ECL开关电路,使这种DAC可以实现高速转换,转换精度较高 。 3. DAC功能剖析 参考电压 与 ADC 外设类似,DAC 也使用 VREF+引脚作为参考电压,在设计原理图的时候一般把VSSA接地,把 VREF+和 VDDA 接 3.3V,可得到 DAC 的输出电压范围为:0~3.3V。如果想让输出的电压范围变宽,可以在外部加一个电压调理电路,把 0~3.3V 的 DAC输出抬升到特定的范围即可。 数模转换及输出通道 框图中的―数字至模拟转换器 x‖是核心部件,整个 DAC 外设都围绕它而展开。它以左边的 VREF+作为参考电源,以 DAC 的数据寄存器“DORx”的数字编码作为输入,经过它转换得的模拟信号由右侧的“DAC_OUTx”通道输出。其中各个部件中的―x‖是指设备的标号,在 STM32 中具有 2 个这样的 DAC 部件,每个 DAC 有 1 个对应的输出通道连接到特定的引脚,即:PA4-通道 1,PA5-通道 2,为避免干扰,使用 DAC 功能时,DAC 通道引脚需要被配置成模拟输入功能(AIN)。 触发源及 DHRx 寄存器 在使用 DAC 时,不能直接对上述 DORx 寄存器写入数据,何输出到 DAC 通道 x 的数据都必须写入到 DHRx 寄存器中(其中包含 DHR8RxDHR12Lx 等,根据数据对齐方向和分辨率的情况写入到对应的寄存器中)。数据被写入到 DHRx 寄存器后,DAC 会根据触发配置进行处理,若使用硬件触发,则DHRx 中的数据会在 3 个APB1 时钟周期后传输至 DORx,DORx 随之输出相应的模拟电压到输出通道;若 DAC 设置为外部事件触发,可以使用定时器(TIMx_TRGO)、EXTI_9信号或软件触发(SWTRIGx)这几种方式控制数据 DAC 转换的时机,例如使用定时器触发,配合不同时刻的 DHRx 数据,可实现 DAC 输出正弦波的功能。 二、输出一个周期2khz的正弦波 本实验是利用DAC功能输出一个正弦波,同样本实验涉及到的源码仍然以官方提供为基础,野火官方提供了有关DAC输出正弦波的代码,可以以此分析修改。 1.DAC输出正弦波原理 这里主要叙述软件设计部分,为了使工程更加有条理,我们把 DAC 控制相关的代码独立分开存储,方便以后移植。这里主要将输出正弦波的第一步:计算获取正弦波数据表。 要输出正弦波,实质是要控制 DAC 以 v=sin(t)的正弦函数关系输出电压,其中 v 为电压输出,t 为时间。而由于模拟信号连续而数字信号是离散的,所以使用 DAC 产生正弦波时,只能按一定时间间隔输出正弦曲线上的点,在该时间段内输出相同的电压值,若缩短时间间隔,提高单个周期内的输出点数,可以得到逼近连续正弦波的图形,如图,若在外部电路加上适当的电容滤波,可得到更完美的图形。 由于正弦曲线是周期函数,所以只需要得到单个周期内的数据后按周期重复即可,而单个周期内取样输出的点数又是有限的,所以为了得到呈 v=sin(t)函数关系电压值的数据通常不会实时计算获取,而是预先计算好函数单个周期内的电压数据表,并且转化成以 DAC寄存器表示的值。 如 sin 函数值的范围为[-1: +1],而 STM32 的 DAC 输出电压范围为[0~3.3]V,按 12 位DAC 分辨率表示的方法,可写入寄存器的最大值为 2^12 = 4096,即范围为[0:4096]。所以, 实际输出时,会进行如下处理: 抬升 sin 函数的输出为正值:v = sin(t)+1 ,此时,v 的输出范围为[0:2]; 扩展输出至 DAC 的全电压范围: v = 3.3*(sin(t)+1)/2 ,此时,v 的输出范围为[0:3.3], 正是 DAC 的电压输出范围,扩展至全电压范围可以充分利用 DAC 的分辨率; 把电压值以 DAC 寄存器的形式表示:Reg_val = 212/3.3 * v = 211*(sin(t)+1),此时,存储到 DAC 寄存器的值范围为[0:4096]; 实践证明,在 sin(t)的单个周期内,取 32 个点进行电压输出已经能较好地还原正弦波形,所以在 t∈[0:2π]区间内等间距根据上述 Reg_val 公式运算得到 32 个寄存器值,即可得到正弦波表; 控制 DAC 输出时,每隔一段相同的时间从上述正弦波表中取出一个新数据进行输出, 即可输出正弦波。改变间隔时间的单位长度,可以改变正弦波曲线的周期。 为方便起见,我们使用了 Python 和 Matlab 脚本制作正弦波表,脚本的代码存储在本 工程的目录下,感兴趣可以打开文件查看,以下列出 Python 脚本代码, Python 脚本的实现原理就是前面介绍的正弦波数据表的制作过程,运行后,该脚本把 得到的正弦波表数据输出到目录下的 py_dac_sinWav.c 文件中,并且根 据取样点描绘出示意图。 2. 代码的修改 首先打开官方提供的源码资料 打开我们的例程之后编译运行,分析其中的代码,因为我们要求输出的是周期为2KHZ的正弦波所以,其中的有一些波形数据需要更改。而正弦波的频率计算该怎么表示呢?其实根据我们定时器的配置,我们可以推算出正弦波的计算式: 根据图中的公式,对应的我们2KHZ的正弦波需要3600个采样点,知道这个后面就好做了。 打开我们例程文件中的一个脚本sinWave,可以选择用matlab打开,这里用matlab。 用matlab打开该脚本之后,我们可以看到它的原例程是32个点,我们需要增加值3600个采样点,要做如下修改。 在修改好之后,我们就开始运行,可以看到此时弹出了图像,同时你可以手动看此时生成的数据,由于采样点过多,所以这里的曲线比较平滑,实际上它是离散的采样点,刻印放大仔细观察,这里就不做示范了。 将生成好的波形数据拷贝到我们之前的代码位置,同时还要修改周期数, 此时我们就可以连接开发板并烧录,并用示波器观察波形了。当然还可以借助音频制作工具制作一段数字化的2khz正弦波wav文件,同样可以模拟出相同效果的正弦波输出波形。 三、数字音频歌曲数据转换为模拟音频波形输出 1. 音频制作正弦波信号输出 这里用到的音频制作软件是AU CS6 我会在接下来的实验中具体介绍,这里就主要介绍步骤,首先要新建一个音频文件,因为这个可以直接生成,很简单。新建好之后在效果里面选择生成基本音色,选择所需要的波形,这样就生成好了,因为我们是要求2KHZ的正弦波,所以还需要自己手动的进行周期更改。 选择正弦 如图,这就是我们得到的正弦波形,我们可以将它放大再来观察 如图这就是正弦信号波形,然后我们要将他输出出去,此时就需要将它转成音频数据,这里采用类似汉字字模的方式。 首先将它导出成WAV格式文件 然后这里需要用到一个工具软件,用UltraEdit打开这个wav文件,前面的一段是固定格式 全选,然后设置范围,得到其中一段数据,鼠标右键 选择范围 输入起始的行号和列号,然后确定就选中了整个我们需要的内容,再次复制粘贴建立新文件,保存这个文件。 然后用notepad++打开上面的保存文件,并将它们改成16进制,然后粘贴到之前keil的数组中。 2. 音频歌曲数据转换为模拟音频波形 这里大部分步骤与上面相同,知识这里采用的是音频歌曲,所以需要我们准备一首歌。 打开我们下载好的音乐,按照之前介绍的步骤,将其转换为wav格式,然后可以看到它的波形 此时我们截取其中的一段生成一个新的WAV格式音频文件 可以看到它是正弦信号。 同样的步骤,我们需要将它用UltraEdit打开,然后再利用notepad++转换成16进制 同样将它粘贴到KEIL中对应位置,并修改周期 最后通过示波器观察输出波形 此时可以看到跟我们利用音频制作显示的波形是很像的,说明完成了。 总结 这次实验我们学习了利用DAC功能输出波形,了解了相关DAC的知识,同时从这次实验中我们掌握了许多实用的你操作以及音频制作各类输出信号。 |
|
|
|
一、DAC相关
1. DAC简介 DAC数模转换器,又称D/A转换器,,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。 2. DAC的构成与特点 DAC主要由数字寄存器、模拟电子开关、位权网络、求和运算放大器和基准电压源(或恒流源)组成。用存于数字寄存器的数字量的各位数码,分别控制对应位的模拟电子开关,使数码为1的位在位权网络上产生与其位权成正比的电流值,再由运算放大器对各电流值求和,并转换成电压值 。 根据位权网络的不同,可以构成不同类型的DAC,如权电阻网络DAC、R–2R倒T形电阻网络DAC和单值电流型网络DAC等。权电阻网络DAC的转换精度取决于基准电压VREF,以及模拟电子开关、运算放大器和各权电阻值的精度。它的缺点是各权电阻的阻值都不相同,位数多时,其阻值相差甚远,这给保证精度带来很大困难,特别是对于集成电路的制作很不利,因此在集成的DAC中很少单独使用该电路。 它由若干个相同的R、2R网络节组成,每节对应于一个输入位。节与节之间串接成倒T形网络。R–2R倒T形电阻网络DAC是工作速度较快、应用较多的一种。和权电阻网络比较,由于它只有R、2R两种阻值,从而克服了权电阻阻值多,且阻值差别大的缺点 。 电流型DAC则是将恒流源切换到电阻网络中,恒流源内阻极大,相当于开路,所以连同电子开关在内,对它的转换精度影响都比较小,又因电子开关大多采用非饱和型的ECL开关电路,使这种DAC可以实现高速转换,转换精度较高 。 3. DAC功能剖析 参考电压 与 ADC 外设类似,DAC 也使用 VREF+引脚作为参考电压,在设计原理图的时候一般把VSSA接地,把 VREF+和 VDDA 接 3.3V,可得到 DAC 的输出电压范围为:0~3.3V。如果想让输出的电压范围变宽,可以在外部加一个电压调理电路,把 0~3.3V 的 DAC输出抬升到特定的范围即可。 数模转换及输出通道 框图中的―数字至模拟转换器 x‖是核心部件,整个 DAC 外设都围绕它而展开。它以左边的 VREF+作为参考电源,以 DAC 的数据寄存器“DORx”的数字编码作为输入,经过它转换得的模拟信号由右侧的“DAC_OUTx”通道输出。其中各个部件中的―x‖是指设备的标号,在 STM32 中具有 2 个这样的 DAC 部件,每个 DAC 有 1 个对应的输出通道连接到特定的引脚,即:PA4-通道 1,PA5-通道 2,为避免干扰,使用 DAC 功能时,DAC 通道引脚需要被配置成模拟输入功能(AIN)。 触发源及 DHRx 寄存器 在使用 DAC 时,不能直接对上述 DORx 寄存器写入数据,何输出到 DAC 通道 x 的数据都必须写入到 DHRx 寄存器中(其中包含 DHR8RxDHR12Lx 等,根据数据对齐方向和分辨率的情况写入到对应的寄存器中)。数据被写入到 DHRx 寄存器后,DAC 会根据触发配置进行处理,若使用硬件触发,则DHRx 中的数据会在 3 个APB1 时钟周期后传输至 DORx,DORx 随之输出相应的模拟电压到输出通道;若 DAC 设置为外部事件触发,可以使用定时器(TIMx_TRGO)、EXTI_9信号或软件触发(SWTRIGx)这几种方式控制数据 DAC 转换的时机,例如使用定时器触发,配合不同时刻的 DHRx 数据,可实现 DAC 输出正弦波的功能。 二、输出一个周期2khz的正弦波 本实验是利用DAC功能输出一个正弦波,同样本实验涉及到的源码仍然以官方提供为基础,野火官方提供了有关DAC输出正弦波的代码,可以以此分析修改。 1.DAC输出正弦波原理 这里主要叙述软件设计部分,为了使工程更加有条理,我们把 DAC 控制相关的代码独立分开存储,方便以后移植。这里主要将输出正弦波的第一步:计算获取正弦波数据表。 要输出正弦波,实质是要控制 DAC 以 v=sin(t)的正弦函数关系输出电压,其中 v 为电压输出,t 为时间。而由于模拟信号连续而数字信号是离散的,所以使用 DAC 产生正弦波时,只能按一定时间间隔输出正弦曲线上的点,在该时间段内输出相同的电压值,若缩短时间间隔,提高单个周期内的输出点数,可以得到逼近连续正弦波的图形,如图,若在外部电路加上适当的电容滤波,可得到更完美的图形。 由于正弦曲线是周期函数,所以只需要得到单个周期内的数据后按周期重复即可,而单个周期内取样输出的点数又是有限的,所以为了得到呈 v=sin(t)函数关系电压值的数据通常不会实时计算获取,而是预先计算好函数单个周期内的电压数据表,并且转化成以 DAC寄存器表示的值。 如 sin 函数值的范围为[-1: +1],而 STM32 的 DAC 输出电压范围为[0~3.3]V,按 12 位DAC 分辨率表示的方法,可写入寄存器的最大值为 2^12 = 4096,即范围为[0:4096]。所以, 实际输出时,会进行如下处理: 抬升 sin 函数的输出为正值:v = sin(t)+1 ,此时,v 的输出范围为[0:2]; 扩展输出至 DAC 的全电压范围: v = 3.3*(sin(t)+1)/2 ,此时,v 的输出范围为[0:3.3], 正是 DAC 的电压输出范围,扩展至全电压范围可以充分利用 DAC 的分辨率; 把电压值以 DAC 寄存器的形式表示:Reg_val = 212/3.3 * v = 211*(sin(t)+1),此时,存储到 DAC 寄存器的值范围为[0:4096]; 实践证明,在 sin(t)的单个周期内,取 32 个点进行电压输出已经能较好地还原正弦波形,所以在 t∈[0:2π]区间内等间距根据上述 Reg_val 公式运算得到 32 个寄存器值,即可得到正弦波表; 控制 DAC 输出时,每隔一段相同的时间从上述正弦波表中取出一个新数据进行输出, 即可输出正弦波。改变间隔时间的单位长度,可以改变正弦波曲线的周期。 为方便起见,我们使用了 Python 和 Matlab 脚本制作正弦波表,脚本的代码存储在本 工程的目录下,感兴趣可以打开文件查看,以下列出 Python 脚本代码, Python 脚本的实现原理就是前面介绍的正弦波数据表的制作过程,运行后,该脚本把 得到的正弦波表数据输出到目录下的 py_dac_sinWav.c 文件中,并且根 据取样点描绘出示意图。 2. 代码的修改 首先打开官方提供的源码资料 打开我们的例程之后编译运行,分析其中的代码,因为我们要求输出的是周期为2KHZ的正弦波所以,其中的有一些波形数据需要更改。而正弦波的频率计算该怎么表示呢?其实根据我们定时器的配置,我们可以推算出正弦波的计算式: 根据图中的公式,对应的我们2KHZ的正弦波需要3600个采样点,知道这个后面就好做了。 打开我们例程文件中的一个脚本sinWave,可以选择用matlab打开,这里用matlab。 用matlab打开该脚本之后,我们可以看到它的原例程是32个点,我们需要增加值3600个采样点,要做如下修改。 在修改好之后,我们就开始运行,可以看到此时弹出了图像,同时你可以手动看此时生成的数据,由于采样点过多,所以这里的曲线比较平滑,实际上它是离散的采样点,刻印放大仔细观察,这里就不做示范了。 将生成好的波形数据拷贝到我们之前的代码位置,同时还要修改周期数, 此时我们就可以连接开发板并烧录,并用示波器观察波形了。当然还可以借助音频制作工具制作一段数字化的2khz正弦波wav文件,同样可以模拟出相同效果的正弦波输出波形。 三、数字音频歌曲数据转换为模拟音频波形输出 1. 音频制作正弦波信号输出 这里用到的音频制作软件是AU CS6 我会在接下来的实验中具体介绍,这里就主要介绍步骤,首先要新建一个音频文件,因为这个可以直接生成,很简单。新建好之后在效果里面选择生成基本音色,选择所需要的波形,这样就生成好了,因为我们是要求2KHZ的正弦波,所以还需要自己手动的进行周期更改。 选择正弦 如图,这就是我们得到的正弦波形,我们可以将它放大再来观察 如图这就是正弦信号波形,然后我们要将他输出出去,此时就需要将它转成音频数据,这里采用类似汉字字模的方式。 首先将它导出成WAV格式文件 然后这里需要用到一个工具软件,用UltraEdit打开这个wav文件,前面的一段是固定格式 全选,然后设置范围,得到其中一段数据,鼠标右键 选择范围 输入起始的行号和列号,然后确定就选中了整个我们需要的内容,再次复制粘贴建立新文件,保存这个文件。 然后用notepad++打开上面的保存文件,并将它们改成16进制,然后粘贴到之前keil的数组中。 2. 音频歌曲数据转换为模拟音频波形 这里大部分步骤与上面相同,知识这里采用的是音频歌曲,所以需要我们准备一首歌。 打开我们下载好的音乐,按照之前介绍的步骤,将其转换为wav格式,然后可以看到它的波形 此时我们截取其中的一段生成一个新的WAV格式音频文件 可以看到它是正弦信号。 同样的步骤,我们需要将它用UltraEdit打开,然后再利用notepad++转换成16进制 同样将它粘贴到KEIL中对应位置,并修改周期 最后通过示波器观察输出波形 此时可以看到跟我们利用音频制作显示的波形是很像的,说明完成了。 总结 这次实验我们学习了利用DAC功能输出波形,了解了相关DAC的知识,同时从这次实验中我们掌握了许多实用的你操作以及音频制作各类输出信号。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 13:40 , Processed in 0.897597 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号