基于STM32F1的舵机控制

这篇具有很好参考价值的文章主要介绍了基于STM32F1的舵机控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SG90舵机介绍

SG90是有三个版本的,90度版、180度版和360度版,前两个只是舵机旋转角度的范围不一样,可以在这个范围内任意的控制舵机所转的角度,而360版本的是一直旋转的,我们不能控制它旋转的角度,只能控制它旋转的速度,这里我们在买的时候就要注意一点,根据自己的需求选取不同的版本,以免买错。这里我们介绍180度版本的。三个控制原理基本相同。

单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。

脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分,所以是利用一个占空比来控制舵机转动的角度。PWM占空比是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。占空比 = t / T 相关参数如下:

t = 0.5ms——————-舵机会转动 0 °

t = 1.0ms——————-舵机会转动 45°

t = 1.5ms——————-舵机会转动 90°

t = 2.0ms——————-舵机会转动 135°

t = 2.5ms——————-舵机会转动180°

当你需要转动135°时,他的占空比就是2.0ms/20ms=10%,所以 TIMx 捕获比较寄存器值就为200-200*10% = 180。

二、与单片机的连接:

SG90分别有三根线。棕色,红色,橙色

棕色接地(GND)

红色接电源(+5V)

橙色接输出PWM信号的引脚

三、PWM

因为舵机的控制主要用到的就是定时器的pwm功能,所以我们先聊一聊pwm

PWM的输出其实就是对外输出脉宽可调(即占空比调节)的方波信号,信号频率是由自动重装寄存器 ARR 的值决定,占空比由比较寄存器CCR的值决定。

基于STM32F1的舵机控制

  当TIMx_CR1寄存器中的 DIR 位为低时执行递增计数,计数器CNT从0计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始数并生成计数器上溢事件。

 以PWM 模式 1 为例。只要TIMx_CNT < TIMx_CCRx, PWM 参考信号OCxREF 便为有高电平,否则为无效的低电平。如果 TIMx_CCRx 中的比较值大于自动重载值(TIMx_ARR 中),则 OCxREF 保持为“ 1”。果比较值为 0, 则 OCxREF 保持为“ 0”。

  我们控制舵机主要是产生一个以20ms为周期的pwm信号,然后通过改变pwm的占空比就可以控制舵机的转角。

四、程序设计

主函数如下:

int main() 

{

u8 i;

SysTick_Init(72);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组

LED_Init();

Sg90_Init();

USART1_Init();

while(1)

   {

   i++;

// TIM_SetCompare2(TIM3, 195);  // 0度    t = 0.5ms           修改TIMx_CCRx的值控制占空比

// delay_ms(1000);

// TIM_SetCompare2(TIM3, 190);  //45度   t = 1.0ms——————-舵机会转动 45°  占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190

// delay_ms(1000);

// TIM_SetCompare2(TIM3, 185);  //90度      t = 1.5ms

// delay_ms(1000);

// TIM_SetCompare2(TIM3, 180);  //135度        t = 2.0ms

// delay_ms(1000);

// TIM_SetCompare2(TIM3, 175);  //180度         t = 2.5ms

// delay_ms(1000);

// Sg90_Return(0);

// delay_ms(1000);

//    Sg90_Return(45);

// delay_ms(1000);

//    Sg90_Return(90);

// delay_ms(1000);

//    Sg90_Return(135);

// delay_ms(1000);

//    Sg90_Return(180);

// delay_ms(1000);

   

   if(i%20==0)

   {

   led1=!led1;

   }

   delay_ms(10);

   

   }

}

在主函数中我们控制舵机以此转过45、90、135、180度,这里之所以会注销掉这些,是因为我在工程文件中增添了通过串口控制舵机的功能,我们可以直接在串口中向单片机发送控制数据,舵机就会转过相应的角度。

  先看看sg90.c文件:

void Sg90_Init()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;     //输出比较结构体

GPIO_InitTypeDef GPIO_InitStructure; 

/* 开启时钟 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//初始化GPIOB端口使能

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启定时器3的时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

/*  配置GPIO的模式和IO口 */

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;                   // 选择你要设置的IO口

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;          //选择输出模式(复用推挽输出)

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);  //设置管脚复用映射(部分重映射)

TIM_TimeBaseInitStructure.TIM_Period=199;    //自动装载值      定时器定时时间计算公式

TIM_TimeBaseInitStructure.TIM_Prescaler=7199; //分频系数      ((per)*(psc+1))/Tclk

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //计数模式(向上计数模式)

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; //设置输出极性(底)

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; // 比较输出使能

TIM_OC2Init(TIM3,&TIM_OCInitStructure);   //输出比较通道2初始化

TIM_Cmd(TIM3,ENABLE); //开启定时器

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器

TIM_ARRPreloadConfig(TIM3,ENABLE); //使能TIM3在ARR上的预装载寄存器允许位

}

void Sg90_Return(u8 angle)

{

u8 per;

if(angle==45)

{

per=190;

TIM_SetCompare2(TIM3, per);

}

else if(angle==90)

{

per=185;

TIM_SetCompare2(TIM3, per);

}

else if(angle==135)

{

per=180;

TIM_SetCompare2(TIM3, per);

}

else if(angle==180)

{

per=175;

TIM_SetCompare2(TIM3, per);

}

else

{

per=195;

TIM_SetCompare2(TIM3, per);

}

}

程序比较简单,就一个定时器初始化和直接输入角度的控制函数,(第二个是函数是我自己写的,比较烂,有能力的可以完善完善一起学习)主要思想还是通过TIM_SetCompare2()设置CCR的数值。

在看看如何通过串口控制:

void USART1_IRQHandler(void)     //中断服务函数

      { 

  

  u8 r;

u16 num;

static char pwm[4];

    static int i=0;

if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  //检查串口1的接收中断是否发生

{

r=USART_ReceiveData(USART1);      //返回 USART1 最近接收到的数据

if(r!='g'&&r!='m')

{

pwm[i]=r;

i++;

}

else

{

i=0;

num=(atoi(pwm));

TIM_SetCompare2(TIM3, num);

}

USART_SendData(USART1,r);         //通过外设 USART1 发送单个数据

while (USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);   //检查 USART1的 发送完成标志位 设置与否

}

USART_ClearFlag(USART1,USART_FLAG_TC);

       }

这里主要就是数据转化的问题,通过atoi()函数将字符串转化为整数然后再用于控制舵机。串口传输数据的时候要特别注意不同数据格式之间的转化。

 文章来源地址https://www.toymoban.com/news/detail-424983.html

到了这里,关于基于STM32F1的舵机控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 舵机控制(STM32F103C8T6)

            本文是以 STM32F103C8T6 作为主控芯片,通过PB6端口输出PWM,实现控制180°舵机。 (一)概述         舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就

    2023年04月09日
    浏览(56)
  • 基于STM32F1的自动追光云台(代码开源)

    前一段时间做了一个自动追光云台(大家感兴趣的也可以自己DIY一个呀),用来自动捕捉阳光供太阳板发电提高太阳板的发电效率,我用了一款STM32f103c8t6为主控来控制云台舵机的旋转。感光元器件使用的是光敏传感器(淘宝随便买一款啊很便宜)来感知光强,所以用ADC进行模

    2024年02月15日
    浏览(36)
  • 从零复刻平衡小车(基于STM32F1)

    本项目是对b站up主的开源项目进行了复刻,平衡车也特别适合作为入门单片机了解控制原理的一个小项目,这里主要记录复刻的过程与心得。         所需工具:焊烙铁、热风枪         首先焊单片机最小系统,包括原理图中的最小系统、电源以及串口通信部分。        

    2023年04月15日
    浏览(52)
  • STM32F103RCT6驱动SG90舵机-完成正反转角度控制

    SG90是一种微型舵机,也被称为伺服电机。它是一种小型、低成本的直流电机,通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点,因此在各种小型机械设备上得到了广泛应用。 SG90舵机通常用于

    2024年02月03日
    浏览(66)
  • STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程)

      最近假期比较闲,拿着之前剩下的模块做了一个小玩具, 先制定一下此次玩具的规划,也可以理解为简易项目书。 开发软件:keil 硬件选型:STM32F103C8T6、RFID读卡器、oled屏幕、按键模块、蓝牙通信模块、蜂鸣器、舵机; 上位机: 1.上位机可以对密码进行设置、重置 2.上位机可以

    2024年02月10日
    浏览(46)
  • 用正点原子STM32F103ZET6精英板控制舵机转动实验保姆教程

    正点原子精英板一块 Jlink4线SWD下载线一根 精英板usb供电/下载线一根(负责给开发板供电) SG90舵机一个(三线:其中红线接5V电压,棕线接GED,橙黄色为信号线接开发板PB5引脚,舵机所给为3pin杜邦线母头,可用单根杜邦线(一头子一头母)将舵机线飞开接到精英板上)。 以

    2023年04月15日
    浏览(60)
  • 基于STM32F1和MLX90640的红外热像仪

    STM32F103RCT6使用IIC接口与MLX90640采集数据,采集数据后使用LCD将温度转换为像素点输出到TFT-LCD屏幕,温度达到指定数值自动蜂鸣器报警,使用按键关闭报警声,源码文件文末自取。 默认参数时,MLX90640的工作流程如下: (1)上电,内部初始化(约40ms) (2)读取工作参数到控制

    2024年02月02日
    浏览(44)
  • 基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

    首先选好自己的板子并打开软件设置,本实验基于STM32F103ZET6实现,打开软件后如图: 打开外部高速晶振,然后接着配置时钟: 将时钟频率修改为72MHz,接着设置接线方式为SW 接下来需要使用串口中断通讯,打开我们的串口设置并打开中断 这里波特率设置为115200,数据位为

    2024年02月09日
    浏览(47)
  • 基于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)
  • STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    📌相关篇《【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》 ✨驱动效果就不做演示了,和上面的相关篇一样,主要是为了方便使用MDK Keil开发的使用。所以花了点时间从上面的工程当中做了分离,重新使用STM32CubeMX配置一个方便二次开发移植使用和配置的工程。本

    2024年02月03日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包