当前位置: 首页 > news >正文

stm32f4xx-PWM输出

文章目录

  • 一、STM32PWM工作过程
  • 二、库函数
    • 1、GPIO引脚映射
    • 2、定时器通道1配置
    • 3、定时器通道1比较值
  • 三、PWM1和PWM2模式
    • 1、定义
    • 2、PWM输出配置步骤:
  • 四、test

一、STM32PWM工作过程

PWM(pulse width modulation)脉冲宽度调制

脉冲:方波,频率

宽度:高电平的宽度,占空比

占空比:0% 高电平一点都不占

占空比:25% 占1/4

占空比:50% 占1/2

占空比:75% 占3/4

占空比:100%

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

CCMR1: OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

二、库函数

1、GPIO引脚映射

在这里插入图片描述

在这里插入图片描述

2、定时器通道1配置

在这里插入图片描述

注意:

通道1:TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

通道2:TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

通道3:TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

通道4:TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

3、定时器通道1比较值

在这里插入图片描述

注意:

通道1:TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);

通道2:TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2);

通道3:TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3);

通道4:TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4);

三、PWM1和PWM2模式

在这里插入图片描述

《STM32f4xx中文参考手册.pdf》477页

1、定义

PWM 模式 1——只要 TIMx_CNT(计数值)< TIMx_CCR1(捕获/比较值),通道 1 便为有效状态,否则为无效状态。

PWM 模式 2——只要 TIMx_CNT (计数值)< TIMx_CCR1(捕获/比较值),通道 1 便为无效状态,否则为有效状态

TIMx_CNT由TIM_TimeBaseStructure.TIM_Period决定

TIMx_CCR1由TIM_SetComparex(x:1 2 3 4);函数决定

有效状态由TIM_OCInitStructure.TIM_OCPolarity决定

频率值:由计数值决定

占空比:由比较值决定

2、PWM输出配置步骤:

在这里插入图片描述

四、test

呼吸灯
注意:高级定时器 tim1要TIM_CtrlPWMOutputs()使能

#include "stm32f4xx.h"
//e 13  tim1_ch3 14  tim1_ch4
void TIM1_UP_init(uint32_t arr,uint32_t psc)
{
#if 1
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	//使能GPIOE的硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE , ENABLE);
	//使能TIM1的硬件时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);//GPIOE 13 复用为定时器1
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13  ;           //GPIOE 13 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOE,&GPIO_InitStructure);              //初始化GPIOE 13 
	
	
	
	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
	//TIM_TimeBaseStructure.TIM_Period = (10000/100)-1;	//计数值100hz/
	//TIM_TimeBaseStructure.TIM_Prescaler = 16800-1;	//预分频值 16800-1 + 1 = 16800 
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定时器1
	
	
	//初始化TIM1 Channel3    PWM模式	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
	//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平有效状态,无效状态则为低电平
	//TIM_OCInitStructure.TIM_Pulse = 250;			//比较值
	
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC1

	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器
    TIM_ARRPreloadConfig(TIM1,ENABLE);//ARPE使能 
	TIM_CtrlPWMOutputs(TIM1, ENABLE);//tim1 pwm使能	---------------------------------
	//使能定时器1工作
	TIM_Cmd(TIM1, ENABLE);
#else
	//此部分需手动修改IO口设置
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);  	//TIM14时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 	//使能PORTF时钟	
	
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
	  
	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
	
	//初始化TIM14 Channel1 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
	TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1

	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 
	
	TIM_Cmd(TIM14, ENABLE);  //使能TIM14
#endif
}

int main(void)
{	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
#if 1
	TIM1_UP_init(500-1,168-1);//168M/168=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.   
#else
	TIM1_UP_init(500-1,84-1);//84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.    
#endif
	uint32_t led0pwmval=0;    
	uint8_t dir=1;
	
	while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
	{
 		delay_xms(10);	 
		if(dir)led0pwmval++;//dir==1 led0pwmval递增
		else led0pwmval--;	//dir==0 led0pwmval递减 
 		if(led0pwmval>300)dir=0;//led0pwmval到达300后,方向为递减
		if(led0pwmval==0)dir=1;	//led0pwmval递减到0后,方向改为递增
#if 1
		TIM_SetCompare3(TIM1,led0pwmval);	//修改比较值,修改占空比
#else 
		TIM_SetCompare1(TIM14,led0pwmval);	//修改比较值,修改占空比
#endif
	}
}

相关文章:

  • 【博客474】为什么k8s控制面pod使用的ip是node ip,而非pod cidr中的ip
  • 2022 华为 Java 高级面试题及答案
  • SpringCloud集成RocketMQ
  • 计算机java毕业设计选题汇总(2022)
  • Ruby on Rails 实践:课程导读
  • OpenGL基本架构知识
  • 神奇的卡尔曼滤波,行人追踪的福音
  • 第三章 教育法律法规
  • MATLAB | 全网唯一,使用MATLAB绘制好看的韦恩图(venn)
  • 2D Transpose算子GPU实现和优化
  • 软件复杂性的来源与应对
  • 11.9 表达式求值
  • 09-排序3 Insertion or Heap Sort(浙大数据结构)
  • java-python+vue社区防疫服务管理系统网站
  • sparksql insertinto 源码解析
  • 时间复杂度分析经典问题——最大子序列和
  • 03Go 类型总结
  • Android组件 - 收藏集 - 掘金
  • js算法-归并排序(merge_sort)
  • mysql常用命令汇总
  • Python 反序列化安全问题(二)
  • vue-router 实现分析
  • Zepto.js源码学习之二
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于springcloud Gateway中的限流
  • 基于遗传算法的优化问题求解
  • 前端临床手札——文件上传
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何合理的规划jvm性能调优
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 入手阿里云新服务器的部署NODE
  • 我建了一个叫Hello World的项目
  • 找一份好的前端工作,起点很重要
  • NLPIR智能语义技术让大数据挖掘更简单
  • Semaphore
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #13 yum、编译安装与sed命令的使用
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $refs 、$nextTic、动态组件、name的使用
  • (C++17) optional的使用
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (pytorch进阶之路)扩散概率模型
  • (六)c52学习之旅-独立按键
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十五)使用Nexus创建Maven私服
  • (转)用.Net的File控件上传文件的解决方案
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET gRPC 和RESTful简单对比
  • .net操作Excel出错解决
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET中的Exception处理(C#)
  • .sh
  • ::前边啥也没有