stm32之pwm输出

1.定义

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。在这里插入图片描述

2.输出来源

以TIM3为例,STM32的通用定时器氛围TIM2,TIM3,TIM4,TIM5,每个定时器都有独立的四个通道可以用来作为: 输入捕获,输出比较,PWM输出,单脉冲模式输出等。
在这里插入图片描述

STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM波输出,高级定时器TIM1,TIM8可以同时产生7路PWM输出,而通用定时器可以同时产生4路PWM输出,这样STM32可以最多同时输出30路PWM输出!

3.pwm工作原理

以向上计数为例,讲述PWM原理:

①在PWM输出模式下除了CNT(计数器当前值),ARR(自动重装载值),CCRx(捕获/比较寄存器值)。

②当CNT小于CCRx时,TIMx_CHx通道输出低电平

③当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平
注:所谓脉宽调制信号(PWM波),就是一个TIMx_ARR自动重装载寄存器确定频率(由它决定PWM周期),TIM_CCRx寄存器确定占空比信号。
在这里插入图片描述

4.内部运作机制

在这里插入图片描述

5.pwm输出模式

模式一 边沿对齐模式
在这里插入图片描述

向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为有效电平,否则为无效电平;
向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为无效电平,否则为有效电平。

模式二 中央对齐模式
在这里插入图片描述

向上计数时: 当TIMx_CNT<TIMx_CCRx时通道1为无效电平,否则为无效电平;
向下计数时: 一旦TIMx_CNT>TIMx_CCRx,CCR1通道1为有效电平,否则为无效电平。
(与前面那个计数模式相反)

6.定时器输出PWM 结构体成员

在这里插入图片描述
说明:只用配置红色四个
typedef struct
{
uint16_t TIM_OCMode; //配置PWM模式1还是模式2
uint16_t TIM_OutputState; //配置输出使能/ OR失能
uint16_t TIM_OutputNState;
uint16_t TIM_Pulse; //配置比较值,CCRx
uint16_t TIM_OCPolarity; //比较输出极性,大于是高电平还是低电平
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;

7.自动加载预加载寄存器配置

在这里插入图片描述

8.相关库函数说明



void TIM_OCxInit                      //结构体初始化
(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_SetCompare1            //设置比较值函数
(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_OC1PreloadConfig     //使能输入比较预装载
(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_Cmd                            //开启定时器
 (TIM_TypeDef* TIMx, FunctionalState NewState)
void TIM_ARRPreloadConfig     //使能自动重装载的预装载寄存器允许位
(TIM_TypeDef* TIMx, FunctionalState NewState);
void TIM_OC1PolarityConfig      //配置修改极性
(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

9.配置步骤

1.GPIO结构体
2.配置通用定时器结构体,初始化
3.配置定时去输出PWM结构体,初始化
4.打开时钟 —> GPIO时钟,TIM定时器时钟,部分重映射时钟
5.配置PWM比较值

10.应用模块

在这里插入图片描述

硬件接线:
红线 : 3.3v/ 5v
黑线 : GND
黄线 : 信号线
附上代码
.c文件

#include "stm32f10x.h"
#include "motor.h"


void motor_config(void)
{
	GPIO_InitTypeDef GPIO_Motorinit;//gpio结构体变量名
	TIM_TimeBaseInitTypeDef TIMMotor;//定时器结构体变量名
	TIM_OCInitTypeDef TIMPWM_Motorinit;//pwm结构体变量名
	
	//1.打开gpio时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//打开定时器时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	//打开引脚复用AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  
	//2.选择重映射模式
	GPIO_PinRemapConfig( GPIO_PartialRemap_TIM3, ENABLE);//部分重映射

	//3.配置gpio结构体与初始化

	GPIO_Motorinit.GPIO_Speed	=GPIO_Speed_50MHz;//输出速率
	GPIO_Motorinit.GPIO_Mode	=GPIO_Mode_AF_PP;//采用复用推挽输出
	GPIO_Motorinit.GPIO_Pin		=GPIO_Pin_5;//5号引脚



 GPIO_Init( GPIOB,&GPIO_Motorinit );//gpio初始化


	//4.配置通用定时器结构体与初始化
	TIMMotor.TIM_Prescaler			=7200-1;//配置分配器计数值,预分频值,基本固定
	TIMMotor.TIM_CounterMode		=TIM_CounterMode_Up;//选择计数模式,选择向上计数模式
	TIMMotor.TIM_Period					=200-1;//配置下一个更新事件自动重装载值,200/10000s
	TIMMotor.TIM_ClockDivision	=TIM_CKD_DIV1;//选择分频模式,设置时钟分割,选择不分频模式
	
	TIM_TimeBaseInit(TIM3, &TIMMotor);//用通用定时器3,通道2


	//5.配置输出pwm波结构体与初始化

	TIMPWM_Motorinit.TIM_OCMode				=TIM_OCMode_PWM1;//配置pwm模式1/2,用模式1
	TIMPWM_Motorinit.TIM_OutputState	=TIM_OutputState_Enable;//配置输出使能
	TIMPWM_Motorinit.TIM_OCPolarity		=TIM_BreakPolarity_Low;//配置输出极性,比比较值小的为低电平,高为高电平
//只有配置这3个其他用默认值就好了
	TIM_OC2Init( TIM3,&TIMPWM_Motorinit);
//因为是定时器3通道2,选择oc2初始化

	//6.自动加载预加载寄存器配置
   TIM_OC2PreloadConfig( TIM3,  TIM_OCPreload_Enable);

	//7.开启定时器
	TIM_Cmd(TIM3, ENABLE);

	


}


main函数

#include "stm32f10x.h"
#include "motor.h"
void delay(uint16_t time)
{
	uint16_t i = 0;
	while(time--)
	{
	i=12000;
	while(i--);
	
	}
}


int  main()
{
	uint16_t pwmval= 155;//最大200,处于3/4
	
	motor_config();//舵机主函数调用
	
//通道几就用compare几
   while(1)
	 {
	
		 for(pwmval= 195;pwmval>=175;pwmval-=5)
	{
		TIM_SetCompare2(TIM3, pwmval);
		delay(500);
	}

	
		
	 }
		
}

		

	


  • 21
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打酱油的;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值