首页 > 其他分享 >stm32f103c8t6产生互补的pwm波,spwm(滤波后50hz正弦波)

stm32f103c8t6产生互补的pwm波,spwm(滤波后50hz正弦波)

时间:2024-10-30 22:47:04浏览次数:7  
标签:TIM1 TIM void spwm 50hz GPIOInitStruct stm32f103c8t6 GPIO TIMOCInitStruct

spwm需要代码关注私发

stm32f103c8t6产生互补的pwm波

main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"





void bspTIMInit(void)
{
	GPIOConfig();
	TIM1Config();
}

/************************************************************************
* 接线:
* PA8 CH1 | PB13 CH1N | PB12 BKIN
* 功能:
* 通过 PA8 和 PB13 输出互补的 PWM 波形;当 PB12 为高时,停止 PWM 输出
* 描述:
* PWM 周期 100ms;死区时间 12.8ms
*/

int main(void)
{
	bspTIMInit();
	
	while (1);
}

 

Timer.c
#include "stm32f10x.h"                  // Device header

 void GPIOConfig(void)
{
	GPIO_InitTypeDef		GPIOInitStruct;	

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);	/*使能GPIOA,GPIOB时钟*/
	
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_8;											/*PA8:CH1*/
	GPIO_Init(GPIOA, &GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;											/*PB13:CH1N*/
	GPIO_Init(GPIOB, &GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;				
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_12;											/*PB12:BKIN*/
	GPIO_Init(GPIOB, &GPIOInitStruct);

	GPIO_ResetBits(GPIOB, GPIO_Pin_12);												/*设置PB12*/
}

 void TIM1Config(void)
{
	TIM_TimeBaseInitTypeDef		TIMTimeBaseStruct;
	TIM_OCInitTypeDef			TIMOCInitStruct;
	TIM_BDTRInitTypeDef			TIMBDTRInitStruct;
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 							/*使能TIM1时钟*/
 
	/*时基结构体配置*/
	TIMTimeBaseStruct.TIM_Period = 1000 - 1;										/*从0开始 一个信号周期计数1000次*/ 
	/*定时器时钟:72MHz / 7200 = 10kHz;周期:(1 / 10kHz) * 1000 = 100us*/
	TIMTimeBaseStruct.TIM_Prescaler = 72 - 1;										/*计数器频率10kHz,每计数一次花费 100us*/
	/*一个信号周期花费时间:1000 * 100us = 100ms*/
	TIMTimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; 							/*时钟分频因子 = 1,tDTS=tCKINT*/
	TIMTimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; 						/*向上计数*/
	TIMTimeBaseStruct.TIM_RepetitionCounter = 0; 									/*禁用重复计数器*/
	TIM_TimeBaseInit(TIM1, &TIMTimeBaseStruct); 
 
	/*输出比较结构体配置*/
	TIMOCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;									/*PWM1模式*/
	TIMOCInitStruct.TIM_OutputState = TIM_OutputState_Enable;						/*输出使能*/
	TIMOCInitStruct.TIM_OutputNState = TIM_OutputNState_Enable;						/*互补输出使能*/
	TIMOCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;							/*输出有效电平为高电平*/
	TIMOCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_High;							/*互补输出有效电平为高电平*/
	TIMOCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Set;							/*输出空闲时为高电平*/
	TIMOCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset;						/*互补输出空闲时为低电平*/
 
	/*初始化TIM1的通道1*/
	TIMOCInitStruct.TIM_Pulse = 500 ; 											/*占空比 = 250 / 1000 = 25%*/
	TIM_OC1Init(TIM1,&TIMOCInitStruct);
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);								/*开启预装载,在更新时间后才会重新装载数值*/		
 
	/*刹车和死区结构体配置*/
	TIMBDTRInitStruct.TIM_OSSRState = TIM_OSSRState_Enable;							/*运行模式下“关闭模式”选择 = 1*/
	TIMBDTRInitStruct.TIM_OSSIState = TIM_OSSIState_Enable;							/*空闲模式下“关闭模式”选择 = 1*/
	TIMBDTRInitStruct.TIM_LOCKLevel = TIM_LOCKLevel_1;								/*锁定级别1,见参考手册*/
	TIMBDTRInitStruct.TIM_DeadTime = 0x80;											/*死区时间:12.8ms*/
	TIMBDTRInitStruct.TIM_Break = TIM_Break_Enable;									/*开启刹车功能*/
	TIMBDTRInitStruct.TIM_BreakPolarity = TIM_BreakPolarity_Low;					/*刹车输入低电平有效,如果引脚检测到高电平则会停止PWM的输出,不会产生任何波形*/
	TIMBDTRInitStruct.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;				/*开启自动输出*/
	TIM_BDTRConfig(TIM1, &TIMBDTRInitStruct);
 
	TIM_Cmd(TIM1, ENABLE);  														/*使能定时器,计数器开始计数*/
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE);												/*开启主输出*/
}

 

Timer.h
#ifndef _TIMER_H
#define _TIMER_H

 void GPIOConfig(void);
 void TIM1Config(void);
#endif

 spwm波

滤波效果不好,实际只需要一阶低通电路即可(10k,0.33uf)产生50HZ正弦波

 实际效果

 

标签:TIM1,TIM,void,spwm,50hz,GPIOInitStruct,stm32f103c8t6,GPIO,TIMOCInitStruct
From: https://blog.csdn.net/2301_76617986/article/details/143313492

相关文章

  • 二、STM32F103C8T6-定时器
    STM32F103C8T6定时器概述STM32F103C8T6作为一款广泛使用的微控制器,内置多个定时器,能够支持多种计时和控制功能,如精确延时、脉冲宽度调制(PWM)、捕获比较(Capture/Compare)、输入捕获和输出比较等。这些功能在电机控制、信号测量、周期性事件触发等应用中非常常用。STM32F103C8T......
  • 一、STM32F103C8T6--GPIO
    STM32f103c8t632位Cortex-M3内核RISC处理器,最高主频72MHZ,Flash:64KB,SRAM:20KB片上外设:I/O端口:多达37个GPIO引脚(支持复用功能)。GPIO端口支持输入、输出、上拉/下拉功能。定时器:3个16位通用定时器(支持PWM输出)。********1个高级定时器(支持多通道PWM)。通信接口:......
  • STM32f103c8t6中PWM的配置
    1、PWM简介    PWM波形(PulseWidthModulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说,PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字......
  • 嵌入式项目:STM32平衡车详解 (基础知识篇) (基于STM32F103C8T6)
    前言:本文是基于B站草履虫编写的平衡车相关内容,包括模块和基础知识,结合代码进行讲解,将知识进行汇总(由于本篇内容较长,请结合目录使用)注:基于开源精神,本文仅供学习参考目录前言:本文是基于B站草履虫编写的平衡车相关内容,包括模块和基础知识,结合代码进行讲解,将知识进行汇总......
  • STM32F103C8T6+ESP8266+MQTT+EMQX完成数据上传和点灯环节
    本文参考以下文章:【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节_stm32如何连接emqx-CSDN博客STM32+ESP8266通过MQTT协议连接本地EMQX(保姆级教学!资料开放!)_stm32驱动esp8266本地emqx-CSDN博客 一、在windows环境下或Ubuntu搭建EMQX云平台 参看这篇文章:搭建自己的M......
  • 14.STM32F103C8T6+CUBEMX+循迹模块(定时器计数、测速)
        学习完b站keysking老师的视频后写了这篇笔记,主要是学习定时器外部时钟。    用的是TIM2(有ETR,TIM3和TIM4都没有)一、cubemx配置(没加无上限计数)1、开TIM2    选了外部时钟模式1,借助从模式ETR1;        下面改数值15是输入滤波器,因为抖动......
  • 10.STM32F103C8T6+CUBEMX+AHT20
            记录学习过程,看的是b站keysking的视频一、配置cubemx1、打开I2C1,设置模式2、打开串口23、生成文件二、写代码1、新建.c.h文件,注意要在对应的文件夹下2、对照AHT20手册进行写        把文字对应的注释在后面了,注意HAL_I2C_Master_Transmit......
  • 1030-基于51单片机的SPWM波(数码管)原理图、流程图、物料清单、仿真图、源代码
    1030-基于51单片机的SPWM波(数码管)原理图、流程图、物料清单、仿真图、源代码功能介绍:要求能够输出SPWM并且测量输入正弦波的频率并显示。直流电压通过DC-AC电路转为方波,搭建检测电路进行滤波和调节,得到正弦波,单片机采集该正弦波的频率,并显示。有哪些资料:1、仿真工程文......
  • STM32F103C8T6新建工程
    一、建立工程文件夹,keil中新建工程,选择型号首先在桌面新建一个STM32project的工程,以后我们的工程都存在这个文件夹下面,这样比较方便管理。 接下来双击keil5运行,点击Project中的NewuVisionProject。 接下来,在之前新建好的STM32Project中,新建2-1moban文件夹,在它里面来存放......
  • 超声波 HC-SR04 的使用 CubeMx + STM32F103C8T6 【含两个】
    HC-SR04的使用一、超声波模块介绍二、工作原理介绍三、接线方式四、驱动方式方法一方法二五、程序实现串口查看数据方法一HC_SR04.cHC_SR04.hmain.cmain.h串口数据显示方法二main.cmain.h六、数据处理一、超声波模块介绍HC-SR04是一种常用的超声波测距模块。......