暗网下载 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 ,句号。
鲁ICP备18019460号-4
我要评论