本文使用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
因为硬件限制,低通滤波器截止频率已固定,出现纹波过大的问题时,只能通过调节载波频率和基波频率改善滤波效果,本文是通过降低预分配系数以增加载波频率的方法,达到改善滤波效果的目的。
文章来源:https://www.toymoban.com/news/detail-735783.html
第一次做STM32文章,欢迎讨论,指正!文章来源地址https://www.toymoban.com/news/detail-735783.html
到了这里,关于STM32产生PWM实现正弦输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!