一、STM32F103输出一路PWM波形
1、实验要求
要求:
用STM32F103输出一路PWM波形,建议采用定时器方法。野火和网上大多数资源采用此方法,有完整源码。用示波器观察输出波形。
2、操作步骤
1、首先我们找到野火自带的PWM输出波形工程文件:

可以将这个文件复制到我们方便的路径下,然后打开:

2、因为野火自带的这个工程相关要求都能够符合,所以我们直接编译即可,不需要进行修改:

主函数(未修改):
// TIM—高级定时器-PWM互补输出带死区时间应用
#include “stm32f10x.h”
#include “bsp_led.h”
#include “bsp_AdvanceTim.h”
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/* 高级定时器初始化 */
ADVANCE_TIM_Init();
while(1)
{
}
}
/*********************************************END OF FILE**********************/
3、之后将我们编译过后生成的hex文件烧录到stm32板子中,之后将板子连接示波器(根据引脚定义,示波器探头输入可以接开发板的PA8和PB13两个引脚,任选其一即可。)
3、输出效果
我们完成前面的步骤之后,打开示波器,即可得到相应的一个矩形脉冲波形:
二、STM32F103的DAC功能输出一个周期2khz的正弦波
1、实验要求
要求:
用STM32F103的DAC功能完成以下波形输出,用示波器观察波形,并用蜂鸣器或手机耳机收听输出声音效果、感受歌曲的音质差异。
输出一个周期2khz的正弦波(循环)。此波形驱动作用至蜂鸣器或喇叭,会呈现一个“滴…”的单音;
2、实验步骤
1、我们可以通过工程里的正弦波点数和定时器配置生成特定频率的正弦波,这里实验要求中我们需要输出一个周期为2kHz的正弦波,通过下面计算公式:

我们通过计算可以得到,一共需要3600个采样点。
2、因为我们需要输出正弦波,而计算机只能够识别一个一个的点,所以我们需要先对正弦波进行采样,取出一定的点放到数组中,再去执行输出代码。我在这里采用Matlab进行采样点的获取。
3、首先我们找到野火配套资料里的 38-DAC—输出正弦波 工程文件,将其打开,找到如下文件,用matlab打开:

4、打开之后对其进行略微的修改,如下图:

以上修改之后代码如下:
%用于产生正弦数据表,输出到文件dac_sinWave.c 文件中,复制到c语言数组即可
n = 2*pi/3600 : 2*pi/3600 : 2*pi %分成3600等份
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:32
if r(i) 》 4095 %限制数据最大不超过4095
r(i) = 4095
end
end
dlmwrite(‘dac_sinWave.c’,r); %把数据写入到文件,方便添加到stm32工程中
plot(n,r,‘。’) %把这些点画出来
5、修改之后我们运行该脚本,便会生成3600个取样点:

这些点会自动保存到以下c文件中:

我们只需打开它复制全部:

6、然后打开 DAC-输出正弦波 的工程keil文件:

将复制的全部粘贴到 uint16_t Sine12bit 数组中:

然后对main函数进行编译生成hex文件。
之后将hex文件烧录到板子中,将板子与示波器连接(开发板DAC输出通道为PA4和PA5,所以我们可以使用这两个引脚来观测输出波形,选其一即可)
3、输出波形
完成上面步骤之后,打开示波器,我们便可以得到如下图所示的正确输出波形:
4、加上蜂鸣器
得到波形之后我们将板子上的PA4或PA5接上蜂鸣器,并接地,便可让蜂鸣器发出声音(实验时声音较小,需要仔细听):
三、用STM32F103的DAC功能将一段数字音频歌曲数据转换为模拟音频波形输出
1、实验要求
要求:
将一段数字音频歌曲数据转换为模拟音频波形输出(循环)。
提示:首先用音频制作工具制作一段数字化的2khz正弦波wav文件、转换一首你喜欢的歌曲片段(或者自己唱录一句,如“我还是从前那个少年miya”)为wav文件。制作时须指定采样频率、量化位数和通道数,以及时间长度。MCU资源有限,建议采样8khz,量化16bit,单通道,时长仅仅5~10秒。音频wav数据可以用类似汉字字模的保存方式,直接copy到Keil代码中数组中,不必使用SD卡上的wav文件(野火开发板是读取SD卡上的wav文件)。
2、实验步骤及结果
此次试验需要下载三个软件进行,一是 Adobe Audition CS6,二是notepad++,三是Uedit32,我会在文末列出资源包的下载链接。
1、首先我们打开 Adobe Audition CS6软件,在里面选择我们之前电脑上下载的一首歌曲进行打开,得到如下界面:

2、我们用鼠标拖动截取其中的一小段(几秒钟即可),然后点击存储选区为:

之后按如下进行相关的设置,点击确定即可完成截取,生成一个wav格式的文件:

3、之后我们用下载的UltraEdit软件打开这个wav文件:

得到如下界面,前面的一段是固定格式:

4、CTRL+A 鼠标右键 选择 十六进制复制 选定视图,新建文件,粘贴:

我们想要的只是中间的那一块内容。CTRL+A 鼠标右键 选择范围 输入起始的行号和列号,确定就选中了整个我们需要的内容,

这就选择到了我们要用到的内容,将其复制下来:

5、打开 notepad++ 软件,将以上复制的内容粘贴进去,然后 alt+c ,在其中插入 ,0x 生成如下文件:

然后删除不需要的尾行,将该文本复制下来。
6、还是打开 38-DAC—输出正弦波 工程文件:

然后将文本复制进uint16_t Sine12bit[]数组中去,并删掉中括号里面的数据:

之后编译main函数即可:

然后像前面一样将生成的hex文件烧录到板子中去,将板子PA4或PA5端连接示波器,打开示波器便可观察到我们截取音乐片段的模拟音频波形:
四、总结
本次在STM32下的PWM和DAC练习,学会了如何将stm32与示波器进行联合调试输出相关波形,通过蜂鸣器或手机耳机收听输出声音效果,并能够将一段数字音频歌曲数据转换为模拟音频波形通过示波器输出,学到了不少新的嵌入式下的东西。
一、STM32F103输出一路PWM波形
1、实验要求
要求:
用STM32F103输出一路PWM波形,建议采用定时器方法。野火和网上大多数资源采用此方法,有完整源码。用示波器观察输出波形。
2、操作步骤
1、首先我们找到野火自带的PWM输出波形工程文件:

可以将这个文件复制到我们方便的路径下,然后打开:

2、因为野火自带的这个工程相关要求都能够符合,所以我们直接编译即可,不需要进行修改:

主函数(未修改):
// TIM—高级定时器-PWM互补输出带死区时间应用
#include “stm32f10x.h”
#include “bsp_led.h”
#include “bsp_AdvanceTim.h”
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/* 高级定时器初始化 */
ADVANCE_TIM_Init();
while(1)
{
}
}
/*********************************************END OF FILE**********************/
3、之后将我们编译过后生成的hex文件烧录到stm32板子中,之后将板子连接示波器(根据引脚定义,示波器探头输入可以接开发板的PA8和PB13两个引脚,任选其一即可。)
3、输出效果
我们完成前面的步骤之后,打开示波器,即可得到相应的一个矩形脉冲波形:
二、STM32F103的DAC功能输出一个周期2khz的正弦波
1、实验要求
要求:
用STM32F103的DAC功能完成以下波形输出,用示波器观察波形,并用蜂鸣器或手机耳机收听输出声音效果、感受歌曲的音质差异。
输出一个周期2khz的正弦波(循环)。此波形驱动作用至蜂鸣器或喇叭,会呈现一个“滴…”的单音;
2、实验步骤
1、我们可以通过工程里的正弦波点数和定时器配置生成特定频率的正弦波,这里实验要求中我们需要输出一个周期为2kHz的正弦波,通过下面计算公式:

我们通过计算可以得到,一共需要3600个采样点。
2、因为我们需要输出正弦波,而计算机只能够识别一个一个的点,所以我们需要先对正弦波进行采样,取出一定的点放到数组中,再去执行输出代码。我在这里采用Matlab进行采样点的获取。
3、首先我们找到野火配套资料里的 38-DAC—输出正弦波 工程文件,将其打开,找到如下文件,用matlab打开:

4、打开之后对其进行略微的修改,如下图:

以上修改之后代码如下:
%用于产生正弦数据表,输出到文件dac_sinWave.c 文件中,复制到c语言数组即可
n = 2*pi/3600 : 2*pi/3600 : 2*pi %分成3600等份
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:32
if r(i) 》 4095 %限制数据最大不超过4095
r(i) = 4095
end
end
dlmwrite(‘dac_sinWave.c’,r); %把数据写入到文件,方便添加到stm32工程中
plot(n,r,‘。’) %把这些点画出来
5、修改之后我们运行该脚本,便会生成3600个取样点:

这些点会自动保存到以下c文件中:

我们只需打开它复制全部:

6、然后打开 DAC-输出正弦波 的工程keil文件:

将复制的全部粘贴到 uint16_t Sine12bit 数组中:

然后对main函数进行编译生成hex文件。
之后将hex文件烧录到板子中,将板子与示波器连接(开发板DAC输出通道为PA4和PA5,所以我们可以使用这两个引脚来观测输出波形,选其一即可)
3、输出波形
完成上面步骤之后,打开示波器,我们便可以得到如下图所示的正确输出波形:
4、加上蜂鸣器
得到波形之后我们将板子上的PA4或PA5接上蜂鸣器,并接地,便可让蜂鸣器发出声音(实验时声音较小,需要仔细听):
三、用STM32F103的DAC功能将一段数字音频歌曲数据转换为模拟音频波形输出
1、实验要求
要求:
将一段数字音频歌曲数据转换为模拟音频波形输出(循环)。
提示:首先用音频制作工具制作一段数字化的2khz正弦波wav文件、转换一首你喜欢的歌曲片段(或者自己唱录一句,如“我还是从前那个少年miya”)为wav文件。制作时须指定采样频率、量化位数和通道数,以及时间长度。MCU资源有限,建议采样8khz,量化16bit,单通道,时长仅仅5~10秒。音频wav数据可以用类似汉字字模的保存方式,直接copy到Keil代码中数组中,不必使用SD卡上的wav文件(野火开发板是读取SD卡上的wav文件)。
2、实验步骤及结果
此次试验需要下载三个软件进行,一是 Adobe Audition CS6,二是notepad++,三是Uedit32,我会在文末列出资源包的下载链接。
1、首先我们打开 Adobe Audition CS6软件,在里面选择我们之前电脑上下载的一首歌曲进行打开,得到如下界面:

2、我们用鼠标拖动截取其中的一小段(几秒钟即可),然后点击存储选区为:

之后按如下进行相关的设置,点击确定即可完成截取,生成一个wav格式的文件:

3、之后我们用下载的UltraEdit软件打开这个wav文件:

得到如下界面,前面的一段是固定格式:

4、CTRL+A 鼠标右键 选择 十六进制复制 选定视图,新建文件,粘贴:

我们想要的只是中间的那一块内容。CTRL+A 鼠标右键 选择范围 输入起始的行号和列号,确定就选中了整个我们需要的内容,

这就选择到了我们要用到的内容,将其复制下来:

5、打开 notepad++ 软件,将以上复制的内容粘贴进去,然后 alt+c ,在其中插入 ,0x 生成如下文件:

然后删除不需要的尾行,将该文本复制下来。
6、还是打开 38-DAC—输出正弦波 工程文件:

然后将文本复制进uint16_t Sine12bit[]数组中去,并删掉中括号里面的数据:

之后编译main函数即可:

然后像前面一样将生成的hex文件烧录到板子中去,将板子PA4或PA5端连接示波器,打开示波器便可观察到我们截取音乐片段的模拟音频波形:
四、总结
本次在STM32下的PWM和DAC练习,学会了如何将stm32与示波器进行联合调试输出相关波形,通过蜂鸣器或手机耳机收听输出声音效果,并能够将一段数字音频歌曲数据转换为模拟音频波形通过示波器输出,学到了不少新的嵌入式下的东西。
举报