文章目录[隐藏]
数字舵机主要由马达、减速齿轮、控制电路等组成,只需要发送一次PWM信号就能保持在规定的某个位置。
而模拟舵机是相同于传统的舵机,是需要多次发送PWM信号才能够保持在规定的位置上,实现对舵机的控制,按照规定的要求进行的速度进行转动。
数字舵机在反应速度方面与模拟舵机相比是由优势的。因为数字舵机是拥有微处理器。
下面我们介绍的SG90舵机就是模拟舵机。
从下往上依次接 GND,+5V,PWM输出IO口(我选的是PC6)
我们选用定时器3的通道1的完全重映像输出。
控制原理及PWM配置
1)180度
模拟舵机的PWM频率为50HZ,对应的时基周期/PWM周期为20ms。我们的高电平脉宽是在0.5ms—2.5ms进行控制的。
PWM周期为20ms = (7200*200)/72000000=0.02
所以TIM_Period = 199 //自动重装载值
TIM_Prescaler = 7199 //预分频系数
占空比 = t / T 相关参数如下:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180°
比如说舵机旋转90度,对应高电平时间为1.5ms:
再附上我的参考代码:
#include timer.h
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);//使能 PC端口 时钟和 AFIO复用功能 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PC6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC.6
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE); //开启定时器3的部分重映射 改变定时器3的 输出通道 引脚 。比如:通道1的输出引脚为PC6
//初始化定时器3
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载
TIM_TimeBaseStructure.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //没多大关系
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//初始化 输出比较 参数 输出比较:通过比较来进行输出
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //pwm模式1:小于有效
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //通道输出极性 TIM3_CCER寄存器的CC2E位 0:低电平有效 1:高电平有效
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //通道1输出使能
TIM_OC1Init(TIM3,&TIM_OCInitStructure);//定时器3通道2输出的初始化 CNT小于比较值CCR 通道1输出低电平
//使能通道1 输出比较 预装载值
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
//使能定时器3
TIM_Cmd(TIM3,ENABLE);
}
#ifndef __TIMER_H
#define __timer_h
#include “sys.h”
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
#include “sys.h”
#include “delay.h”
#include “timer.h”
int main(void)
{
delay_init();
TIM3_PWM_Init(199,7199);
while(1)
{
delay_ms(100);
TIM_SetCompare1(TIM3, 195);//0度
delay_ms(100);
TIM_SetCompare1(TIM3, 190);//45度
delay_ms(100);
TIM_SetCompare1(TIM3, 185);//90度
delay_ms(100);
TIM_SetCompare1(TIM3, 180);//135度
delay_ms(100);
TIM_SetCompare1(TIM3, 175);//180度
delay_ms(100);
}
}
360度
360度舵机可以360度旋转,因此与180度舵机有相当大的区别,首先360度舵机不能够控制旋转角度,一般的舵机是给一个特定的PWM,舵机会转到相应的角度,而360度舵机是只能够控制方向和旋转转速,所以360度舵机给定一个PWM,会以特定的速度和方向转动。
所以有:
0.5ms----------------正向最大转速;
1.5ms----------------速度为0;
2.5ms----------------反向最大转速;
int main(void)
{
delay_init();
TIM3_PWM_Init(199,7199);
while(1)
{
TIM_SetCompare1(TIM3,195);//正向最大转速
delay_ms(500);
TIM_SetCompare1(TIM3,185);//速度为0
delay_ms(500);
TIM_SetCompare1(TIM3,175);//反向最大转速
delay_ms(500);
}
}
到此结束
版权声明:本文为CSDN博主「Blue噜噜噜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SHRtuji/article/details/113354315
暂无评论