基于STM32F103的PWM波形及DAC波形输出


前言

本篇文章简单介绍了PWM波形输出的基本原理和DAC波形输出的基本原理,在Keil5中如何观察输出波形,以及在示波器中观察波形。

PWM简介

脉冲宽度调制( PWM),是英文 Pulse Width Modulation 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 。简单一点,就是对脉冲宽度的控制。

我们要利用TIM3 的 CH2 输出 PWM 来控制 DS0 的亮度,要使用TIM3,我们必须先开启 TIM3 的时钟,这点相信大家看了这么多代码,应该明白了。这里我们还要配置 P B5 为复用输出,这是因为 TIM3_CH2 通道 将重映射到 PB5 上,此时, PB5属于复用功能输出 。

输出PWM波形

  • 芯片:STM32F103ZET6
  • 环境:Keil5
  • 例程:正点原子官方例程

烧录 PWM 例程

主要函数:
Tips:这里给出的是定时器3(即Time3)的函数。

void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		LED1=!LED1;
		}
}

定时器的函数中包含了定时器初始化的函数,以及定时器中断服务函数。

  • 显而易见,定时器初始化函数就是实现了定时器的初始化工作;
  • 中断服务函数里面就实现了开启定时中断后需要执行的任务。

以上函数都是正点原子官方库给出的定时器的例程,此函数一般在例程中会有,所以不会自己编写。

主函数:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
 
 int main(void)
 {		
 	u16 led0pwmval=0;
	u8 dir=1;	
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();			     //LED端口初始化
 	TIM3_PWM_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
   	while(1)
	{		
 		delay_ms(10);	 
		if(dir)led0pwmval++;
		else led0pwmval--;
 		if(led0pwmval>300)dir=0;
		if(led0pwmval==0)dir=1;										 
		TIM_SetCompare2(TIM3,led0pwmval);				
		}	 
 }

主函数里的内容主要编写的是变化输出的PWM波形。利用延时函数实现波形的变化。
在这里插入图片描述

函数分析:

延时10毫秒之后,对变量进行加一操作,直到变量值达到300之后,再将变量值置为0,重新开始计数。这样就可以实现输出的PWM波形占空比的变化。

在Keil中查看PWM波形

在小魔术棒中进行如下配置
在这里插入图片描述
点击调试在这里插入图片描述点击设置在这里插入图片描述

进行如下设置
在这里插入图片描述
注意:不同的板子输出PWM波形的引脚可能不一样,这里的配置也会不一样。

配置完成之后,可以观察到波形。
在这里插入图片描述

示波器中观察波形

在这里插入图片描述
OK!完成PWM波形的输出。

DAC简介

STM32的 DAC 模块 数字 模拟转换模块 是 12 位数字输入,电压输出型的 DAC。

STM32的 DAC 模块主要特点有:

  • 2 个 DAC 转换器:每个转换器对应 1 个输出通道
  • 8 位或者 12 位单调输出
  • 12 位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双 DAC 通道同时或者分别转换
  • 每个通道都有 DMA 功能

设置 DAC 模块的通道 1 来输出模拟电压,其详细设置步骤如下:

  1. 开启 PA 口时钟,设置 PA4 为模拟输入。
  2. 使能 DAC1时钟。
  3. 初始化 DAC, 设置 DAC 的工作模式。
  4. 使能 DAC 转换通道。
  5. 设置 DAC 的输出值。

输出DAC波形

  • 芯片:STM32F103ZET6
  • 环境:Keil5
  • 例程:正点原子官方例程

输出DAC正弦波

首先,需要先用软件生成一个2KHz的正弦波

在这里插入图片描述
这里使用的是Adobe Audition CS6这个软件。
在这里插入图片描述

点击新建一个文件

在这里插入图片描述

设置相关参数

在这里插入图片描述

点击“效果”,“生成基本音色”

在这里插入图片描述

设置频率为2KHz

在这里插入图片描述

生成波形为2KHz正弦波

在这里插入图片描述

导出为wav文件

在这里插入图片描述
在这里插入图片描述

利用程序将WAV文件生成.c文件

在这里插入图片描述

点击打开文件并选择所需要转换的文件

在这里插入图片描述

左边的参数就会自动生成,点击生成代码并保存代码

在这里插入图片描述

生成代码如下图所示

在这里插入图片描述

将生成的C语言代码放到程序当中去

在这里插入图片描述
即可生成正弦波,以下是用示波器观察结果。
在这里插入图片描述

输出DAC音频

输出音频的步骤与输出正弦波的步骤是类似的,所以这里不再重复过多步骤。
给出以下不同的部分。

生成音频wav文件

在这里插入图片描述

生成WAV文件后转换成.c文件

在这里插入图片描述

输出波形

在这里插入图片描述

总结

PWM波形的输出是利用定时器3来控制输出的,输出引脚为PB5。需要观察PWM波形的时候,需要根据相关规则配置PB5来观察波形。在用示波器观察波形的时候,需要一个引脚连接PB5,一个引脚接地,这样的波形会更加平稳。
DAC输出波形的引脚为PA4。DAC简单来说就是将数字输出转换成模拟输出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值