STM32——PWM(呼吸灯&舵机使用)

文章介绍了STM32中与PWM相关的函数配置,包括输出比较单元的初始化、极性设置、输出使能和模式修改等。同时,详细阐述了GPIO口的配置,特别是选择推挽输出模式的原因。此外,提到了PWM的输出比较通道函数和CCR寄存器的设置,以及在主程序中如何通过修改CCR值实现呼吸灯效果。
摘要由CSDN通过智能技术生成

目录

1、与pwm相关的函数介绍

1.1、输出比较函数配置

1.1.1、以下四个函数是配置图1中的四个比较单元

1.1.2、输出结构体赋默认值

1.2、单独修改参数的相关函数

1.2.1、单独设置极性相关函数

1.2.2、单独修改输出使能参数函数

1.2.3、单独修改输出比较模式函数

1.2.4、单独更改CCR寄存器的值(需掌握)

1.3、小功能函数配置(暂时仅需了解)

1.3.1、配置强制输出模式

1.3.2、配置CCR寄存器的预装功能(即影子寄存器)

1.3.3、配置快速使能

1.3.4、外部事件是清除REF信号

二、代码配置

2.1、输出PWM的GPIO口配置

部分代码展示

2..2、初始化输出比较单元

2.2.1、输出比较通道函数(即一、1.1函数),需要初始化那个通道就调用那个通道。

2.2.2、定义结构体变量以及结构体信息

2.2.3、 输出比较模式

2.2.4、结构体赋初值

部分代码展示

2.2.5、单独更改CCR的值

3、主程序代码


PWM配置流程图

1、与pwm相关的函数介绍

1.1、输出比较函数配置

1.1.1、以下四个函数是配置图1中的四个比较单元

参数1:选择定时器
参数2:结构体

TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
TIM_OC2nit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

1.1.2、输出结构体赋默认值

TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)

补充:在使用高级定时器时需要调用以下函数,否则PWM无法开启工作

 TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)

1.2、单独修改参数的相关函数

1.2.1、单独设置极性相关函数

TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
其中OCXN中的N代表高级定时器的互补通道配置。

1.2.2、单独修改输出使能参数函数

TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)
TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN)

1.2.3、单独修改输出比较模式函数

TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode)

1.2.4、单独更改CCR寄存器的值(需掌握)

TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)
TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)
TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)

1.3、小功能函数配置(暂时仅需了解)

1.3.1、配置强制输出模式

//在运行中停止输出波形并强制输出高/低电平
TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)

1.3.2、配置CCR寄存器的预装功能(即影子寄存器)

TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)

1.3.3、配置快速使能

TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)

1.3.4、外部事件是清除REF信号

TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)

二、代码配置

2.1、输出PWM的GPIO口配置

具体配置参数详见GPIO口的配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//选择推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA, &GPIO_InitStructure);
其中对于  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP  为什么选择推挽输出,原因如下:

 对于普通的开漏/推挽输出,其引脚控制权来自于输出数据寄存器;如果需要使用定时器控制引脚,需要复用开漏/推挽输出模式,此时输出数据寄存器被断开,输出控制权将移交给片上外设。

部分代码展示

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //开启时钟,TIM2是APB1总线的外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启时钟,选择GPIOkou 
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//选择推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);

2..2、初始化输出比较单元

2.2.1、输出比较通道函数(即一、1.1函数),需要初始化那个通道就调用那个通道。

参数1:选择定时器
参数2:结构体
TIM_OC1Init(TIM2,&TIM_OCInitStructure);

2.2.2、定义结构体变量以及结构体信息

//定义结构体变量
TIM_OCInitTypeDef TIM_OCInitStructure;

//选择输出模式
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;


图2

图2中分别对应着冻结模式、相等时置有效电平、相等时置无效电平(即低电平)、相等时电平翻转、PW1/PW2模式。

2.2.3、 输出比较模式

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;

上图对应着有效电平是高电平,REF有效时,输出高电平;低极性,REF电平取反, 

//输出状态,使能or失能
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

//设置CCR寄存器的值。
TIM_OCInitStructure.TIM_Pulse=50;

 例如要产生一个频率为1KHZ,占空比为50%,分辨率为1%的PWM波形,可以用下图计算公式得出CCR的值为50。

 相对应下图配置也需改变

2.2.4、结构体赋初值

如不赋初值,则可能导致后续程序出现不必要的错误,因此为了防止出现此状况,需赋初值避免出现错误,赋初值后可以引用函数对结构体信息单独赋值。

参数:结构体变量
TIM_OCStructInit(&TIM_OCInitStructure);

部分代码展示

    TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//整个结构体附初始值,避免出现错误
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;	//输出比较模式
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //输出比较极性
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出状态,使能or失能
	TIM_OCInitStructure.TIM_Pulse=0;  //设置CCR寄存器的值
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);

2.2.5、单独更改CCR的值

以便实现呼吸灯的效果。详见一中的2.4

PWM_SetCompare(uint16_t Compare);

用法:

void PWM_SetCompare(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

3、主程序代码

uint8_t i;

int main(void)
{
	OLED_Init();	//OLED初始化
	PWM_Init();
	
	while(1)
	{	
		for(i=0;i<=100l;i++)
		{
			PWM_SetCompare(i);
			Delay_ms(10);
		}
		for(i=0;i<=100l;i++)
		{
			PWM_SetCompare(100-i);
			Delay_ms(10);
		}
	}

三、舵机的使用

 由第一张图可以知道周期为20ms,则由公式 Freq=CK_PSC/(PSC+1)/(ARR+1)有:

Freq=72MHZ/72/20k=50Hz,其中(PSC+1)=72;(ARR+1)=20K;这两个值可以自己调整;

则由Duty=CCR/(ARR+1)有,CCR是500时,占空比为0.5ms,CCR为2500时,占空比为2.5ms.

由此可以知道以下参数应为

 对于如何控制CCR的值,我们使用一个函数去控制CCR的值,

TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
舵机驱动是STM32的一种应用方式,通过使用PWM输出信号来控制舵机的转动角度。PWM(脉冲宽度调制)是一种通过改变脉冲信号的高电平时间来控制电机或舵机的转动角度的技术。在STM32中,可以使用定时器模块来生成PWM信号,并通过改变占空比来控制舵机的位置。 具体来说,舵机驱动需要以下几个步骤: 1. 配置定时器:选择一个合适的定时器,并配置其工作模式和时钟源。 2. 配置输出通道:选择一个定时器的输出通道,并配置其工作模式为PWM输出模式。 3. 设置PWM周期:根据舵机的要求,设置定时器的重载值,确定PWM信号的周期。 4. 设置占空比:通过改变定时器的比较值,可以改变PWM信号的占空比,从而控制舵机的转动角度。 5. 启动定时器:使能定时器开始生成PWM信号。 通过以上步骤,可以实现对舵机的驱动控制。具体的代码实现可以参考引用\[3\]中的学习记录文章,其中详细介绍了如何在STM32使用PWM输出来驱动舵机。 #### 引用[.reference_title] - *1* *2* *3* [总结篇:STM32舵机、电机的驱动&OSBoat电路逻辑的梳理](https://blog.csdn.net/weixin_47723114/article/details/127727386)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橘洲青年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值