STM32的PWM和DAC练习

一、用STM32输出一路PWM波形

我们使用的是野火开发板自带的PWM输出波形工程文件
在这里插入图片描述
main.c:

int main(void)
{	
	/* 定时器初始化 */
	ADVANCE_TIM_Init();
	
  while(1)
  {      
  }
}

相关辅助代码:

static void ADVANCE_TIM_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道
	RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);

  // 输出互补通道
	RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1N_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);
  
	// 默认输出低电平
	GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);	
}

Main函数很简单,调用了ADVANCE_TIM_Init() 函 数 ,该函数调用了ADVANCE_TIM_GPIO_Config()和 ADVANCE_TIM_Mode_Config()这两个函数完成了定时器 GPIO 引脚和工作模式的初始化。这时,相应的 GPIO 引脚上就可以检测到互补输出的PWM 信号

我们把程序烧录到芯片中,使用示波器进行波形观测,如下图:
在这里插入图片描述

二、STM32的DAC功能

1.输出周期为2KHz的正弦波

指南者开发板DAC输出通道为PA4PA5,所以我们可以使用这两个引脚来观测输出波形在这里插入图片描述
这里PA5 引脚连接到 FLASH 芯片的 CLK 引脚中,这可能会干扰 DAC 实验输出的电压信 号,导致得不到正确的波形。所以DAC 和 SPI-FLASH 不能同时使用。
在实际中,我们可以通过工程里的正弦波点数和定时器配置生成特定频率的正弦波,这里我们需要输出一个周期为2kHz的正弦波,通过计算公式,我们可以得到,一共需要3600个采样点
首先,我们打开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,'.')                     %把这些点画出来 

运行后得到3600个采样点,这些点就存在.c文件中,我们直接复制即可
我们使用野火自带的DAC输出代码,然后进行一些修改
在这里插入图片描述
进入工程后,我们需要找到存放数据的数组,将我们之前取到的3600个采样点,放进去
在这里插入图片描述
main.c:

int main(void)
{
			/*DAC初始化*/
	 while(1)
		{	
			DAC_Mode_Init();

}
  	  
}

DAC_Mode_Init:

void DAC_Mode_Init(void)
{
	uint32_t Idx = 0;  

	DAC_Config();
	DAC_TIM_Config();	
	
	/*填充正弦波波形*/
  for (Idx = 0; Idx < POINT_NUM; Idx++)
  {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
  }
	
	DAC_DMA_Config();
}

我们将程序烧录查看运行结果,如下图:可以看到输出了一个周期为2kHz的正弦波
在这里插入图片描述
接上蜂鸣器,可以听到滴滴滴的声音

2.将一段数字音频转换为模拟音频波形输出

1.准备一段音频文件,截取几秒钟,输出wav文件
在这里插入图片描述
2.用UltraEdit打开这个wav文件,前面的一段是固定格式,然后新建文件保存
在这里插入图片描述
3.用notepad++打开上面保存文件,编辑–列块编辑–插入文本 ,生成如下文件。
在这里插入图片描述
然后我们将十六进制放到刚才的数组中,查看输出即可
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值