当前位置:   article > 正文

【硬石科技】电机系列教学(基于STM32)——舵机的控制_硬石stm

硬石stm

舵机的控制

舵机内部结构和工作原理

在这里插入图片描述
舵机本身就是一个闭环的控制系统。可调电阻就充当传感器,反馈舵机的当前位置角度。

在这里插入图片描述
在这里插入图片描述

实现舵机的控制

在这里插入图片描述
大部分舵机的控制信号的周期都是20ms,也有少部分例外。
在这里插入图片描述

代码

控制舵机的定时器配置

#include "bsp_SteerTim.h" 

static void STEER_TIM_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 输出比较通道1 GPIO 初始化
	RCC_APB2PeriphClockCmd(STEER_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  STEER_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(STEER_TIM_CH1_PORT, &GPIO_InitStructure);
	

}



static void STEER_TIM_Mode_Config(void)
{
  // 开启定时器时钟,即内部时钟CK_INT=72M
	STEER_TIM_APBxClock_FUN(STEER_TIM_CLK,ENABLE);

/*--------------------时基结构体初始化-------------------------*/
	// 配置周期,这里配置为100K
	
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
	TIM_TimeBaseStructure.TIM_Period=STEER_TIM_Period;	
	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
	TIM_TimeBaseStructure.TIM_Prescaler= STEER_TIM_Prescaler;	
	// 时钟分频因子 ,配置死区时间时需要用到
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
	// 计数器计数模式,设置为向上计数
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
	// 重复计数器的值,没用到不用管
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
	// 初始化定时器
	TIM_TimeBaseInit(STEER_TIM, &TIM_TimeBaseStructure);

	/*--------------------输出比较结构体初始化-------------------*/	
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	// 配置为PWM模式1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	// 输出使能
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	// 输出通道电平极性配置	
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	
	// 输出比较通道 1
	TIM_OCInitStructure.TIM_Pulse = 50;//50对应的脉宽为0.5ms,让舵机初始位置为最左(右)边
	TIM_OC1Init(STEER_TIM, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(STEER_TIM, TIM_OCPreload_Enable);
	

	// 使能计数器
	TIM_Cmd(STEER_TIM, ENABLE);
}

void STEER_TIM_Init(void)
{
	STEER_TIM_GPIO_Config();
	STEER_TIM_Mode_Config();		
}

/*********************************************END OF FILE**********************/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

相关头文件

#ifndef __BSP_STEERTIME_H
#define __BSP_STEERTIME_H


#include "stm32f10x.h"


#define            STEER_TIM                   TIM3
#define            STEER_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            STEER_TIM_CLK               RCC_APB1Periph_TIM3
#define            STEER_TIM_Period            (2000 - 1)
#define            STEER_TIM_Prescaler         (720 - 1) 
// TIM3 输出比较通道1
#define            STEER_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            STEER_TIM_CH1_PORT          GPIOA
#define            STEER_TIM_CH1_PIN           GPIO_Pin_6

/**************************函数声明********************************/

void STEER_TIM_Init(void);


#endif	/* __BSP_STEERTIME_H */



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

舵机控制函数

#include "Steercontrol.h"
#include "bsp_SteerTim.h"
u32 full = 2000;
/************************************************************************************
*函数名称:SteerAngle
*输入参数:angle 角度, which
*输出参数:错误代号
*功能;设置舵机角度
*************************************************************************************/
unsigned char SteerAngle(float angle,unsigned char which)
{
	///
	//截止判断,角度0-180,which是1-4
	if(angle<0||angle>180)
	{
		return 1;
	}
	if(which<1||which>4)
	{
		return 2;
	}
	
	///
	//角度转换
	u32 rate=(u32)((angle/180.0*0.1+0.025)*full);
	switch(which)
	{
		case 1:TIM_SetCompare1(STEER_TIM ,rate);break;
		case 2:TIM_SetCompare2(STEER_TIM ,rate);break;
		case 3:TIM_SetCompare3(STEER_TIM ,rate);break;
		case 4:TIM_SetCompare4(STEER_TIM ,rate);break;
		default:break;
	}
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/281131
推荐阅读
相关标签
  

闽ICP备14008679号