STM32f1之舵机驱动+转动角度调整(含主代码和计算)

目录

前言

一、舵机的“自白”

二、代码部分

三、如何计算得到该要控制的角度


前言

哈哈趁热打铁,上讲介绍到L298N电机驱动还有PWM调速,这里我就趁这个点再介绍一下舵机驱动以及它转向的角度控制,如何计算得到,这里将一一讲解,希望能帮到你,同时希望与大家一起交流探讨,求点赞哈哈!!!这里我还是用STM32f1控制,好了,直奔主题。

这里主讲180°舵机控制角度,360°舵机只能控制速度,这里不细讲!


一、舵机的“自白”

我(舵机)是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。

那么问题来了?我们用舵机来干嘛呢,当然是控制方向了,如今,基本上飞机或者智能车又或是机器人等等都会用到舵机这个东西,所以说,认识舵机,并且运用舵机就成为我们必不可少的知识学习了,下面附图:

这里我用的是S3003舵机,其他类型的舵机应该也是大同小异。 

其中,有三条线,一条接电源(5V即可),一条接地,最后一条接控制(即单片机输出的PWM控制),下面会给上具体实现代码,总的来说跟上一讲区别不大,主要就是PWM周期输出控制,利用 TIM_SetComparex()  函数来设置占空比实现,但是多出的是计算问题,因为舵机有对应角度的时间计算,下面具体讲解:

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度为例,的其控制关系是这样的:

   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;

基本上,我们学生党所需要的舵机的控制角度对应就是上述关系了,至于360度舵机这里简单提一下,主要是我这个舵机做不到(哈哈哈,这舵机180°的)

这里讲一下360°舵机的 

   0.5ms--------------0度;正向持续转(最大速度)

   1.5ms------------90度;停止转动,速度无

   2.5ms-----------180度;逆向持续转(最大速度)

调整PWM周期即可改变转动速度和方向。 

言归正传,到了这里基本上对控制舵机角度其实有了一定概念了,下面就直接附上代码部分了


二、代码部分

#include "sys.h"
#include "duoji.h"

void duoji_Pwm_Init()
{
	GPIO_InitTypeDef GPIO_InitTypeStruce;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruce;
	TIM_OCInitTypeDef TIM_OCInitTypeStruce;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	GPIO_InitTypeStruce.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitTypeStruce.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//这里是我之前的代码,主要是控制到4个舵机,这里大家只用一个输出口即可
	GPIO_InitTypeStruce.GPIO_Speed=GPIO_Speed_50MHz;
	
	TIM_TimeBaseInitTypeStruce.TIM_Period=1999;//这里是自动重装值设置
	TIM_TimeBaseInitTypeStruce.TIM_Prescaler=719;//这里是预分频系数
	TIM_TimeBaseInitTypeStruce.TIM_ClockDivision=0;
	TIM_TimeBaseInitTypeStruce.TIM_CounterMode=TIM_CounterMode_Up;
	
	TIM_OCInitTypeStruce.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitTypeStruce.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitTypeStruce.TIM_OCPolarity=TIM_OCPolarity_High;
	
	GPIO_Init(GPIOB,&GPIO_InitTypeStruce);
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitTypeStruce);
	TIM_OC1Init(TIM4,&TIM_OCInitTypeStruce);
	//TIM_OC2Init(TIM4,&TIM_OCInitTypeStruce);//这些是TIM4其他通道初始化
	//TIM_OC3Init(TIM4,&TIM_OCInitTypeStruce);
	//TIM_OC4Init(TIM4,&TIM_OCInitTypeStruce);
	
	TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
	//TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
	//TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
	//TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
	
	TIM_Cmd(TIM4,ENABLE);
	
}

主函数部分

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "duoji.h"


int main()
{

	delay_init();	    	   
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	uart_init(115200);	 //
 	LED_Init();			     //
	KEY_Init();          //
	duoji_Pwm_Init();
	while(1)
	{
		LED0 = !LED0;          

		TIM_SetCompare1(TIM4,50);//这里设置占空比改变角度,用TIM4定时器,可以自己更换
		TIM_SetCompare2(TIM4,50);
        delay_ms(5000);
        delay_ms(5000);
		TIM_SetCompare1(TIM4,250);
		TIM_SetCompare2(TIM4,250);
        delay_ms(5000);
        delay_ms(5000);
	
	}
	
}

这里的代码是其他地方用的,拿来简单修改一下而已,基本上就是这样了。


三、如何计算得到该要控制的角度

这里直接上纸描述,字丑谅解哈哈哈

 其中的arr和psc可以自己设置,再计算出相应角度的占空比值即可。大家可以自己调试一番,定会有所收获。

有什么问题欢迎随时评论指正,有其他问题也欢迎一起探讨交流!哈哈哈。

如果觉得写得还入眼,给个赞可还行,感谢感谢!

赠人点赞,手有余香哈哈哈

题外话:

挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”

学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈

  • 123
    点赞
  • 230
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
这里提供一个简单的示例代码,用于驱动一个舵机。该代码使用了STM32F1系列的PWM输出功能,并且假设使用的是定频定占空比的PWM模式。 ```c #include "stm32f10x.h" #define SERVO_PIN GPIO_Pin_8 #define SERVO_PORT GPIOB #define SERVO_TIMER TIM4 #define SERVO_CHANNEL TIM_Channel_3 void servo_init(void) { // 启用GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置GPIO为推挽输出模式 GPIO_InitTypeDef gpio; gpio.GPIO_Pin = SERVO_PIN; gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SERVO_PORT, &gpio); // 启用TIM4时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); // 配置TIM4为PWM输出模式 TIM_TimeBaseInitTypeDef tim; tim.TIM_Period = 20000; // PWM周期为20ms tim.TIM_Prescaler = 72; // 时钟预分频为72,即72MHz/72=1MHz的计数频率 tim.TIM_ClockDivision = 0; tim.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(SERVO_TIMER, &tim); // 配置TIM4的输出通道为PWM模式 TIM_OCInitTypeDef oc; oc.TIM_OCMode = TIM_OCMode_PWM1; oc.TIM_OutputState = TIM_OutputState_Enable; oc.TIM_Pulse = 1500; // 初始占空比为1500us/20000us=7.5% oc.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(SERVO_TIMER, &oc); // 启动TIM4计数器 TIM_Cmd(SERVO_TIMER, ENABLE); } void servo_set_angle(int angle) { // 根据角度计算占空比 int pulse = 500 + angle * 10 / 9; // 设置PWM占空比 TIM_SetCompare3(SERVO_TIMER, pulse); } int main(void) { servo_init(); while (1) { servo_set_angle(0); // 转到0度位置 delay_ms(1000); servo_set_angle(90); // 转到90度位置 delay_ms(1000); servo_set_angle(-90); // 转到-90度位置 delay_ms(1000); } } ``` 上述代码中,`servo_init()`函数用于初始化PWM输出和GPIO口,`servo_set_angle()`函数用于根据角度设置PWM占空比,`main()`函数中则演示了如何驱动舵机转到不同的角度。需要注意的是,舵机角度控制范围通常在-90度到+90度之间,对应的PWM占空比范围为500us到2500us。在实际使用中,需要根据舵机参数和实际情况进行调整

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不说二话的自家人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值