暗网下载 STM32 PWM控制舵机

舵机简介

有一种执行部件,它被称作舵机,是在自动驾驶仪里用于操纵能使飞机改变飞行姿态的舵面转动的,分为电动舵机且包含电动机、传动部件以及离合器,其工作是接受自动驾驶仪发出的指令信号,当处于人工驾驶飞机的情况时,因离合器维持脱开状态致使传动部件不起作用;还有液压舵机,它由液压作动器和旁通活门构成,在人工驾驶飞机时,旁通活门开启,因作动器活塞两边的液压相互连通所以不妨碍人工操纵;另外,存在电动液压舵机,简称为“电液舵机”。

在这里插入图片描述

舵机工作原理

舵机主要的组成部分是伺服电机,所谓那伺服就是依照信号的要求去动作,在信号到来之前,转子处于停止不动的状态,信号抵达之后,转子马上开始运动,所以我们能够给舵机输入不一样的信号,用以控制它旋转到不同的角度。

舵机接收PWM信号,信号进入内部电路,产生一个偏置电压,触发电机,电机通过减速齿轮带动电位器移动,当电压差为零,电机停转,达到伺服效果,简单讲,给此舵机一个特定PWM信号,它就能旋转到指定位置。

在这里插入图片描述

舵机之上存在三根线,它们分别为GND、VCC以及SIG,换而言之也就是地线、电源线和信号线,而其中的PWM波是经由信号线输入至舵机的 。

通常来讲,舵机所接收的PWM信号,其频率是50HZ,也就是周期之际为20ms。当高电平的脉宽处于0.5ms至2.5ms范围之内时,舵机便能够对应着旋转至不一样的角度。

在这里插入图片描述

舵机经高电平的占空比去调节输出轴弧度,给舵机传来的驱动信号是频率为50Hz的方波信号,方波信号的每个周期时长是20ms,那个高电平其时长取值在0.5ms至2.5ms之间 。

占空比 = t/T

t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°

因为舵机的驱动信号时50HZ,就能得到周期

T=  1/f=1/50=0.02s=20ms

因而,能够算出TIM_Period的值,还能够算出TIM_Prescaler的值。

PWM的周期是20毫秒,它等于(将7200乘以200)的结果再除以72000000,最终得出的值是0.02。

什么是PWM

简介

英文“Pulse Width Modulation”的缩写是脉冲宽度调制,也就是脉宽调制,它是一种借助微处理器数字输出去控制模拟电路的极为有效的技术。简单来讲,就是针对脉冲宽。

对其进行度之把控,STM32的定时器之中,除了TIM6以及7之外,别的定时器皆能够用以生成PWM输出,当中高级定时器TIM1与TIM8能够同时生成多达7路的PWM输出,而通用定时器同样能够同时生成多达4路的PWM输出,如此一来,STM32最多能够同时生成30路PWM输出!

PWM的频率

指的是,一秒钟里暗网下载,信号从高电平转变到低电平,接着又回到高电平所经历的次数,这被称作一个周期;换句话讲,就是一秒钟之内,PWM拥有多少个这样的周期 。

PWM的周期

T=1/f
周期=1/频率

依据舵机,50Hz等于20ms属于一个周期,要是频率是50Hz,这意味着一个周期为20ms,如此一来,一秒钟便存在50次PWM周期。

PWM占空比

这是指,在一个周期之内,信号处在高电平的时间,占据整个信号周期的百分比,因为PWM周期是20ms,所以,以舵机会转动45°作为例子,占空比就应当是1ms/20ms = 5%,所以,TIM_SetCompare1的TIMx捕获比较1寄存器值就是200 - 200*5% = 190。

单位: % (0%-100%)

硬件连线

舵机红线-----------5V

舵机棕线-----------GND

舵机黄线-----------PA6

代码

servo.c

#include "servo.h"
/*我这里采用通用计时器3*/
static void Servo_GPIO_Config()
{
通用输入输出初始化类型定义的通用输入输出初始化结构体,。;
	/*开启GPIO时钟*/
	RCC_APB2PeriphClockCmd(BASIC_GPIOA_CLK,ENABLE);
	/*配置GPIO*/
	GPIO_InitStructure.GPIO_Pin			= GPIOA_CH1_PIN;//TIM_CH1 
	GPIO_InitStructure.GPIO_Mode		= GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Speed		= GPIO_Speed_50MHz;
	/*初始化*/
	GPIO_Init(GPIOA_CH1_PORT,&GPIO_InitStructure);
	
}
static void Servo_TIM2_Config()
{
有一个名为TIM_TimeBaseInitTypeDef的结构体,它被称作TIM_TimeBaseInitStructure 。;
TIM的OC初始化类型定义,名为TIM_OCInitStructure。;
	/*开启定时器时钟*/
	RCC_APB1PeriphClockCmd(BASIC_TIM_CLK,ENABLE);
	
	/*
	TIM2时基单元配置
关键的配置有,TIM_Prescaler也就是预分频值,还有,TIM_Period即定时周期。
若将TIM_Period设为999,那此时计数器会进行计数,所计的数量是1000个,为(TIM_Period + 1) 。
节拍是一个定时器的周期,这一点,和后面需要去进行配置的TIM_Pulse共同发挥作用喽 , 。
	控制着定时器输出波形的占空比。
TIM_Prescaler用于明确TIM时钟的分频数值,这意味着它是在进一步地,对TIM时钟进行分频操作的具体设定 。
针对分频TIM clock而言,简单来讲,也就是针对定时器,其每一次进行数数相应的时间间隔究竟是多少呢。
	*/
	
	针对TIM3进行配置,通常情况下,驱动PWM信号时,其周期是20毫秒,频率是50HZ,因而我们将周期设定为20ms 。
	
	
											/*时基结构体成员配置*/
	//自动重装载值寄存器的值
	TIM_TimeBaseInitStructure.TIM_Period					= BASIC_TIM_Period;
	//时钟预分频数
	TIM_TimeBaseInitStructure.TIM_Prescaler				=	BASIC_TIM_Prescaler;
	//时钟分频因子
	TIM_TimeBaseInitStructure.TIM_ClockDivision		= TIM_CKD_DIV1;
	//计数器计数模式,设置向上计数,
	TIM_TimeBaseInitStructure.TIM_CounterMode			= TIM_CounterMode_Up;
	/*初始化结构体*/
	TIM_TimeBaseInit(BASIC_TIM,&TIM_TimeBaseInitStructure);
	
	
									/*定时器输出比较结构体成员初始化*/
	TIM_OCInitStructure.TIM_OCMode				= TIM_OCMode_PWM2;
	// 输出使能
	TIM_OCInitStructure.TIM_OutputState		= TIM_OutputState_Enable;
	//把TIM_OCInitStructure这个结构体里的TIM_OutputNState成员的值设置成TIM_OutputNState_Enable ,用于某种特定的配置或操作 。,用于某种特定的配置或操作 。
	设置占空比的大小,主要是在主函数里面将设置占空比的这一部分先设置为0 , 。
	TIM_OCInitStructure.TIM_Pulse					= 0;
	// 输出通道电平极性配置
	TIM_OCInitStructure.TIM_OCPolarity		= TIM_OCPolarity_High;
	//TIM的OC初始化结构体中的TIM的OCN极性,被设置为TIM的OCN极性为高。
	// 输出通道空闲电平极性配置
	TIM_OCInitStructure.TIM_OCIdleState		= TIM_OCIdleState_Set;
	TIM_OCInitStructure 的 TIM_OCNIdle_State 被设定为 TIM_OCNIdleState_Reset , 。
	/*初始化结构体*/
	TIM_OC1Init(BASIC_TIM,&TIM_OCInitStructure);
	
	//使能TIMx在CCR2上的预装载寄存器
	TIM_OC1PreloadConfig(BASIC_TIM,TIM_OCPreload_Enable);
	
	// 使能计数器
	TIM_Cmd(BASIC_TIM, ENABLE);	
	// 主输出使能,当使用的是通用定时器时,这句不需要
	TIM_CtrlPWMOutputs(BASIC_TIM, ENABLE);
}
void initServo(void)
{
	Servo_GPIO_Config();
	Servo_TIM2_Config();
	
}

main.c


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "beep.h"
#include "servo.h"
 int main(void)
 {	
	u16 i;
	delay_init();
	LED_Init();	 
	LED0 = 0;
	LED1 = 0;
	initServo();
	LED1 = 1;
	
	while(1){
		delay_ms(300);
		TIM_SetCompare1(BASIC_TIM, 175); //对应180度
		delay_ms(300);
		TIM_SetCompare1(BASIC_TIM, 180); //对应135度
		delay_ms(300);
		TIM_SetCompare1(BASIC_TIM, 185); //对应90度
		delay_ms(300);
		TIM_SetCompare1(BASIC_TIM, 190); //对应45度
		delay_ms(300);
		TIM_SetCompare1(BASIC_TIM, 195); //对应0度
		for(i = 195; i > 174; i--){
			TIM_SetCompare1(BASIC_TIM, i);
		}
		delay_ms(100);
		for(i = 175; i < 195; i++){
			TIM_SetCompare1(BASIC_TIM, i);
		}
	} 
}

实现结果

在这里插入图片描述

总结

由这次舵机学习,致使我刚初步知晓STM32 PWM调制关联的知识,在这期间仍旧碰到问题,我此次运用的是TIM3通道1,然而我将代码修改成TIM3通道2就无法达成了,期望好心的人能够帮我予以解答 。

而后计划去协同昨日所编写的超声波测距代码,将这两者予以整合,由此形成一个以STM32为基础的感应垃圾桶。

可供参考的内容为:https://blog.csdn.net/qq_42866708/article/details/113355329 ,句号。

关键词:

客户评论

我要评论