摇杆按键+SG90 实现舵机云台(STM32F103C8T6)

这篇具有很好参考价值的文章主要介绍了摇杆按键+SG90 实现舵机云台(STM32F103C8T6)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.材料准备

  • STM32F103C8T6最小系统板*1
  • SG90舵机(180°)*2
  • 摇杆按键*1
  • 舵机支架*1
  • 面包板*1(非必须)
  • 杜邦线若干
    stm32控制云台,stm32,单片机,嵌入式硬件
    类似这种的支架,不过需要自己裁切嵌入的部分

代码部分

代码很简单,主要使用ADC双通道读取两个电位器的值(实际上就是电压),通过获取到的值的范围来确定上下左右,从而来改变两个舵机的角度。

ps2_joystick.c

#include "ps2_joystick.h"

void Joystick_Init(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA2和PA3引脚为模拟输入模式
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 使能ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

    // 配置ADC1参数
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 配置ADC1通道2(电位器1)为采样序列1
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);

    // 配置ADC1通道3(电位器2)为采样序列2
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 2, ADC_SampleTime_55Cycles5);

    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);
}

uint16_t Read_ADC_Value(uint8_t channel) {
    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADC1);
}

void Servo_Configuration(void) {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOB时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    // 配置PB8和PB9引脚为复用推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 使能TIM4时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    // 配置定时器4的基本参数
    TIM_TimeBaseStructure.TIM_Period = 19999; // 20ms周期
    TIM_TimeBaseStructure.TIM_Prescaler = 71; // 分频系数,72MHz时钟
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    // 配置定时器4的通道3和通道4为PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 1500; // 初始脉冲宽度为1.5ms(中间位置)
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC3Init(TIM4, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_OC4Init(TIM4, &TIM_OCInitStructure);
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

    // 启动定时器4
    TIM_Cmd(TIM4, ENABLE);
}

void Set_Servo_Angle(u8 angle1, u8 angle2){
	u16 position1 = 500 + (2000 /180 * angle1);
	u16 position2 = 500 + (2000 /180 * angle2);
	TIM_SetCompare3(TIM4, position1); // 设置通道3的脉冲宽度
    TIM_SetCompare4(TIM4, position2); // 设置通道4的脉冲宽度
}

ps2_joystick.h

#ifndef __PS2_JOYSTICK_H_
#define __PS2_JOYSTICK_H_

#include "stm32f10x.h"
#include "sys.h"

void Joystick_Init(void);//摇杆按键初始化
uint16_t Read_ADC_Value(uint8_t channel);//获取AD转换数据

void Servo_Configuration(void);
void Set_Servo_Angle(u8 angle1, u8 angle2);	

#endif /* __PS2_JOYSTICK_H_ */


main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "ps2_joystick.h"
/********IO配置*******
A2 - URy
A3 - URx

B8 - 舵机下
B9 - 舵机上

**********************/
// 定义全局变量用于保存摇杆的X和Y轴数值
volatile int16_t VRxData = 0;
volatile int16_t VRyData = 0;
u8 Angle1 = 90;
u8 Angle2 = 90;
u8 AngleSpeed = 5;//每次改变舵机的角度,需要保证改后的范围在0-180度

int main(void)
{
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	LedInit();  
	Joystick_Init();
	Servo_Configuration();
    // 进入主循环
    while (1)
    {
        // 读取X轴和Y轴的数值 5V电源读取的数值范围为0-5000
		VRyData = Read_ADC_Value(ADC_Channel_3);
		VRxData = Read_ADC_Value(ADC_Channel_2);
      
        // 处理摇杆的数值
		if(VRxData < 1500){ //右
			//--
			if(Angle1 < 180) Angle1 += AngleSpeed;	//控制舵机
		}
		else if(VRxData > 3500){//左
			//++			
			if(Angle1 > 0) Angle1 -= AngleSpeed;	
		}
		if(VRyData < 1500){ //上
			if(Angle2 > 0) Angle2 -= AngleSpeed;		
		}
		else if(VRyData > 3500){ //下			
			if(Angle2 < 180) Angle2 += AngleSpeed;			
		}
		Set_Servo_Angle(Angle1,Angle2);
        // ...
		delay_ms(50);
    }
}
//改变if语言与VRyData等 比较的值可以提高摇杆按键的灵敏度(即小幅度变化即可触发舵机运行)

通过改变if语言中与VRyData等 比较的值可以提高摇杆按键的灵敏度(即小幅度变化即可触发舵机运行)

演示视频

摇杆控制舵机云台文章来源地址https://www.toymoban.com/news/detail-628415.html

到了这里,关于摇杆按键+SG90 实现舵机云台(STM32F103C8T6)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32外设系列—sg90(舵机)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! 首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。 舵机的工作原理比较简

    2024年02月15日
    浏览(42)
  • STM32+SG90舵机详解(详细)

    上一次使用舵机只是草草了解,只大概知道是pwm控制的,这次又使用到了舵机,本以为复制上次代码就可以调试成功,没想到却弄了很久。 我使用的是STM32f103c8t6,用的是定时器4。这个f1板子的定时器各个通道io口如下图所示: 在开始之前我们要了解控制舵机需要的一个周期

    2024年02月08日
    浏览(50)
  • 基于STM32 SG90 9g舵机控制

    产品参数 名称:9克舵机180度 尺寸:23mm X 12.2mm X 29mm 重量:9克 扭矩:1.5kg/cm 工作电压:4.2 - 6V 温度范围:0 - 55℃ 运行速度:0.3s/60℃ 死带宽:10ms 舵机有三条线定义: 暗灰:GND 红色:VCC 4.8V - 7.2V 橙黄线:脉冲输入 在机器人机电控制系统中,舵机控制效果是性能的重要影响

    2024年02月14日
    浏览(48)
  • STM32第七课:PWM控制SG90舵机

            学习完上一课的PWM控制LED小灯实现呼吸灯的效果,我们就可以进一步学习PWM控制舵机的效果了。PWM控制舵机相信会是一个更有意思的小实验的。          舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档

    2024年04月17日
    浏览(34)
  • STM32---SG90舵机控制(HAL库,含源码)

    写在前面: 在嵌入式的项目中,舵机是一个十分常见的元器件模块,其主要的功能是实现机械转动,实质上舵机是一个伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。例如在机器人的电控制器系统中,飞行器设计,遥控机器人等。舵机的使用需要PWM信号

    2024年04月13日
    浏览(35)
  • 小白入门STM32(2)---控制SG90舵机---基础工作原理详解

    本人一枚软件编程人员,有一定C语言基础,目前自学STM32单片机,写下此篇一巩固所学二交流分享。 按照惯例,先介绍理论再实战上手,穿插习题,最后给出我的愚见。 SG90属于一种舵机,最适合小白入门,可直接由单片机驱动。另外,单片机中给我们封装了很多东西,所以

    2023年04月10日
    浏览(44)
  • 【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

    我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。 换句话说,我们要用单片机产生一个 周期(20ms) 的PWM波,然后获得对应这些时长(分别是 0.5ms 、 1ms 、 1.5ms 、 2ms 、 2.5ms )的 高电

    2024年02月13日
    浏览(57)
  • 关于四足行走机器人步态分析STM32+SG90舵机控制

    最近逛某站看了很多国赛大佬的赛车,下面评论区一堆大佬在感叹“老师看到赛车都摇头。”作为一个初入STM32坑的萌新,我在某些站上查阅了相关资料后,确定给我自己的机器人搞成四足行走(ps,其实是L298N烧了)。 目前手上的板子是C8T6,学习的视频是江科协,主要代码

    2024年01月21日
    浏览(72)
  • SG90舵机的使用--STM32F103C8T6

    SG90带有一个3P的接头 根据颜色分为 黄线(信号线) 红线(电源线) 棕色 (地线) 舵机的 工作电压 在 4.8V-6V ,接在STM32系统板上驱动不了,所以需要接电源模块单独的5V供电,我使用的是如图所示的电源模块 注: 如果STM32系统板供电和舵机供电不为同一模块,则需要共地,

    2024年02月03日
    浏览(47)
  • 正点原子STM32F103精英版+HAL库实现4×4矩阵按键检测

    首先声明,本人小白一枚,所做的工作都是借鉴网上的大佬+自己摸索,但是都是亲测实际有效的。 因为所需要的功能开发板自带按键不够用,所以购买了4×4矩阵按键,当时购买的时候以为一个按键对应一个IO口,后来发现不是这样的,会浪费太多的IO口,4×4矩阵键盘用8个

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包