STM32的PWM和DAC练习

文章目录

  • 一、用STM32F103输出一路PWM波形
  • 二、输出一个周期2khz的正弦波(循环)
  • 三、将一段数字音频歌曲数据转换为模拟音频波形输出


一、用STM32F103输出一路PWM波形

PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。PWM 模式分为两种,PWM1 和 PWM2,总得来说是差不多。

实验时用的野火自带的代码
STM32的PWM和DAC练习_第1张图片修改代码main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_GeneralTim.h"  

/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{
     
	/* led 端口配置 */ 
	LED_GPIO_Config();
	
	/* 定时器初始化 */
	GENERAL_TIM_Init();
	
  while(1)
  {
           
  }
}

生成hex文件
在这里插入图片描述
烧录
STM32的PWM和DAC练习_第2张图片
结果
STM32的PWM和DAC练习_第3张图片

二、输出一个周期2khz的正弦波(循环)

根据实验教程
STM32的PWM和DAC练习_第4张图片我们需要输出一个周期为2kHz的正弦波,通过计算公式,我们可以得到,一共需要3600个采样点

打开野火自带的正弦波表制作脚本,生成3600个采样点,这些点存在.c文件中

STM32的PWM和DAC练习_第5张图片
matlab代码

%用于产生正弦数据表,输出到文件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,'.')                     %把这些点画出来 

用matlab生成的点
STM32的PWM和DAC练习_第6张图片工程文件
STM32的PWM和DAC练习_第7张图片
把点数放进uint16_t Sine12bit[POINT_NUM]
STM32的PWM和DAC练习_第8张图片
烧录用示波器观察结果

三、将一段数字音频歌曲数据转换为模拟音频波形输出

用Adobe Audition打开一段音频,设置采样8khz,量化16bit,单通道,保存下来
STM32的PWM和DAC练习_第9张图片
打开STM32的PWM和DAC练习_第10张图片打开文件,生成代码

STM32的PWM和DAC练习_第11张图片

工程文件
STM32的PWM和DAC练习_第12张图片
把点数放进uint16_t Sine12bit[POINT_NUM]
STM32的PWM和DAC练习_第13张图片
结果
STM32的PWM和DAC练习_第14张图片

你可能感兴趣的:(stm32,单片机,嵌入式,matlab)