使用STM32产生PWM实现正弦波输出

本文使用STM32-G070RB的定时器TIM1产生PWM波,并外接一阶低通滤波器,实现DAC效果,最终在示波器上显示正弦输出。主要分为两步:实现PWM输出,实现DAC功能。

实现PWM输出

实验用具

STM32-G070RB

STM32CubeMX

STM32CubeIDE

PWM输出正弦波原理

1个PWM波形假设为500Hz(目标定时器频率),等效正弦波为50Hz时,那么10个PWM周期为一个正弦波周期。改变占空比的频率为500Hz,每次升高36°,10次为一个正弦波周期。

配置STM32CubeMX

RCC这里高速时钟源设置为Crystal/Ceramic Resonator,并进行系统时钟设置。本系统时钟源频率为64mHz。

 打开TIM1的channel1,设为PWM Genaration CH1

接下来设置TIM1的相关参数,参数设置参考下列公式(这里的目标定时器就是TIM1),自动重载值设置为一个变量,方便后续调整。

打开TIM1的中断捕捉器,这点很关键,因为PWM就是通过TIM1中断的回调函数实现占空比变化。

进行文件设置后,即可生成代码。

STM32CubeIDE代码实现

在main.c首部进行相关参数的定义

/* USER CODE BEGIN Includes */
#include <math.h>
#define PI 3.1415926
uint8_t stat;
/* USER CODE END Includes */

main.c初始化定时器以后,打开定时器和通道1

  /* USER CODE BEGIN 2 */
  	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
  /* USER CODE END 2 */

 main.c重写TIM1回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	extern uint8_t stat;

    if (htim->Instance == TIM1)
		{
		if (stat<10)
//		增加个数可以减小载波对赋值衰减带来的影响
			stat++;
		else  stat=0;

		 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (period/2)*(sin((((float)stat*36)/360)*2*PI)+1));

		}
}
/* USER CODE END 4 */

实现DAC功能

搭建一阶低通滤波器和STM32相接

R = 5.1kΩ, C = 100nF , Fc = 1/(2∗π∗R∗C) = 312Hz

因为硬件限制,低通滤波器截止频率已固定,出现纹波过大的问题时,只能通过调节载波频率和基波频率改善滤波效果,本文是通过降低预分配系数以增加载波频率的方法,达到改善滤波效果的目的。 

第一次做STM32文章,欢迎讨论,指正!

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32产生PWM实现正弦波输出

发表评论