STM32的DAC实验

实验目的: 用STM32F103的DAC功能完成以下波形输出,用示波器观察波形,并用蜂鸣器或手机耳机收听输出声音效果、感受歌曲的音质差异。
1)输出一个周期2khz的正弦波(循环)。此波形驱动作用至蜂鸣器或喇叭,会呈现一个“滴…”的单音;
2)将一段数字音频歌曲数据转换为模拟音频波形输出(循环)。

实验环境:STM32—F103-MINI开发板,串口调试助手,keil5及以上,示波器
参考资料:野火stm32mini教程38-DAC—输出正弦波 【野火®】零死角玩转STM32—F103-MINI.pdf,38章DAC—输出正弦波

一、DAC简介

数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。

STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。
在这里插入图片描述

二、2KHz正弦波实验

1.用MATLAB计算

打开野火的教程

野火STM32F103-mini开发板资料\1-程序源码_教程文档\1《STM32库开发实战指南》(标准库源码)【优先学习】\1-书籍配套例程-F103RCMINI\38-DAC—输出正弦波

找到dac.m
将里面的代码改为

TIM_Period    = 19;                 %定时周期数 
TIM_Prescaler = 0;                  %定时时钟分频
fsin = 2000;                        %正弦波频率
Tsysclk=1/72000000;                 %系统时钟周期
Ttim = Tsysclk * (TIM_Prescaler+1); %定时时钟周期
Tupdate = Ttim * (TIM_Period +1);   %定时器触发周期
Tsin = 1/fsin ;                     %周期
point = Tsin/Tupdate                %单周期信号点数

这样就可以求出2KHz的正弦波需要多少信号点数
在这里插入图片描述
求出来需要1800个点。
接着打开sinWave.m,代码改为:

n = 2*pi/1800 : 2*pi/1800 : 2*pi      %分成1800等份
a = sin(n)+1;                     %求取sin函数值并向上平移一个单位,消除负数值
a = a * 3.3/2;                    %调整幅值,使范围限制为0~3.3   
r = a* (2.^12) /3.3               %求取dac数值,12位dac LSB = 3.3/2.^12 
r = uint16(r);                     %double型数据转化成16位整型数据 
for i = 1:1800                        
if r(i) > 4095                      %限制数据最大不超过4095
    r(i) = 4095
end
end 
dlmwrite('dac_sinWave.c',r);      %把数据写入到文件,方便添加到stm32工程中
plot(n,r,'.')                     %把这些点画出来 

运行ta
在这里插入图片描述

2.keil编程

生成的dac_sinWave.c,将里面的内容复制到波形数据里面。

#define POINT_NUM 1800
/* 波形数据 ----------------------------------------------------*/
const uint16_t Sine12bit[POINT_NUM] = {}

编译并下载到开发板上。

3.示波器显示

示波器夹子接GND,笔接PA4或者PA5。
因为DAC输出正弦波例程 PA4 PA5双通道输出(板子的PA4引脚复用会影响输出电压)。
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DAC是数字模拟转换器(Digital-to-Analog Converter)的缩写,它可以将数字信号转换为模拟信号。在STM32中,DAC模块有多个通道,每个通道可以输出模拟信号。\[1\] DAC模块的模拟部分由VDDA和VSSA供电,而Vref+是DAC模块的参考电压。DAC_OUTx是DAC的输出通道,对应于PA4或PA5引脚。DAC的输出受DORx寄存器直接控制,但我们通过DHRx寄存器间接地将数据传递给DORx寄存器,从而实现对DAC输出的控制。\[1\] 在STM32的DAC模块中,支持8位和12位两种模式。在8位模式下,数据是固定的右对齐的,而在12位模式下,可以设置为左对齐或右对齐。对于单个DAC通道x,有三种情况:\[1\] 1. 8位数据右对齐:用户将数据写入DAC_DHR8Rx\[7:0\]位(实际存储在DHRx\[11:4\]位)。 2. 12位数据左对齐:用户将数据写入DAC_DHR12Lx\[15:4\]位(实际存储在DHRx\[11:0\]位)。 3. 12位数据右对齐:用户将数据写入DAC_DHR12Rx\[11:0\]位(实际存储在DHRx\[11:0\]位)。 要使用STM32的DAC模块,需要进行一系列的设置步骤,包括开启GPIO口时钟、设置GPIO口为模拟输入使能、使能DAC时钟、初始化DAC并设置工作模式、设置DAC的转换通道以及设置DAC的输出值。\[2\] 需要注意的是,STM_DAC和GBC_KEY共用PA4引脚,所以如果在开发板上插入了其他模块,可能会影响DAC的输出结果。因此,在进行DAC实验时,建议不要在ATK MODULE位置插入其他模块。\[3\] #### 引用[.reference_title] - *1* *2* *3* [STM32的DAC](https://blog.csdn.net/qq_45578181/article/details/126512679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值