目录

  • 舵机简介
  • 舵机工作原理
  • 什么是PWM
  • 硬件连线
  • 代码
  • 实现结果
  • 总结

舵机简介

舵机是指在自动驾驶仪中操纵飞机舵面(操纵面)转动的一种执行部件。分有:①电动舵机,由电动机、传动部件和离合器组成。接受自动驾驶仪的指令信号而工作,当人工驾驶飞机时,由于离合器保持脱开而传动部件不发生作用。②液压舵机,由液压作动器和旁通活门组成。当人工驾驶飞机时,旁通活门打开,由于作动器活塞两边的液压互相连通而不妨碍人工操纵。此外,还有电动液压舵机,简称“电液舵机”。

舵机工作原理

舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。


舵机上有三根线,分别是GND、VCC和SIG,也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。

舵机是通过高电平的占空比来调节输出轴的角度,舵机的驱动信号是50Hz的方波信号,每个周期为20ms,其中高电平的占比在0.5ms-2.5ms之间。
占空比 = t/T

t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°

因为舵机的驱动信号时50HZ,就能得到周期

T=  1/f=1/50=0.02s=20ms

因此可以计算出TIM_Period和TIM_Prescaler的值。
PWM周期为20ms = (7200*200)/72000000=0.02

什么是PWM

简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制。STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!
PWM的频率
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期。
PWM的周期

T=1/f
周期=1/频率

根据舵机50Hz = 20ms 一个周期,如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期。
PWM占空比
是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190
单位: % (0%-100%)

硬件连线

舵机红线-----------5V
舵机棕线-----------GND
舵机黄线-----------PA6

代码

servo.c

#include "servo.h"/*我这里采用通用计时器3*/
static void Servo_GPIO_Config()
{GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIO时钟*/RCC_APB2PeriphClockCmd(BASIC_GPIOA_CLK,ENABLE);/*配置GPIO*/GPIO_InitStructure.GPIO_Pin           = GPIOA_CH1_PIN;//TIM_CH1 GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;/*初始化*/GPIO_Init(GPIOA_CH1_PORT,&GPIO_InitStructure);}
static void Servo_TIM2_Config()
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/*开启定时器时钟*/RCC_APB1PeriphClockCmd(BASIC_TIM_CLK,ENABLE);/*TIM2时基单元配置重要配置:TIM_Prescaler(预分频值)TIM_Period(定时周期)将TIM_Period设置成999,则计数器会数1000个(TIM_Period+1)节拍为一个定时器的周期。这个和后面需要配置的TIM_Pulse共同控制着定时器输出波形的占空比。TIM_Prescaler用来指定TIM时钟的分频值。也就是说它是进一步来分频TIM clock的。 简单来说也就是定时器每一次数数的时间间隔是多少。*//*配置TIM3,一般的驱动PWM信号都是周期20毫秒,频率为50HZ。所以我们设定周期为20ms*//*时基结构体成员配置*///自动重装载值寄存器的值TIM_TimeBaseInitStructure.TIM_Period                   = BASIC_TIM_Period;//时钟预分频数TIM_TimeBaseInitStructure.TIM_Prescaler             =  BASIC_TIM_Prescaler;//时钟分频因子TIM_TimeBaseInitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;//计数器计数模式,设置向上计数,TIM_TimeBaseInitStructure.TIM_CounterMode            = TIM_CounterMode_Up;/*初始化结构体*/TIM_TimeBaseInit(BASIC_TIM,&TIM_TimeBaseInitStructure);/*定时器输出比较结构体成员初始化*/TIM_OCInitStructure.TIM_OCMode                = TIM_OCMode_PWM2;// 输出使能TIM_OCInitStructure.TIM_OutputState       = TIM_OutputState_Enable;//TIM_OCInitStructure.TIM_OutputNState    = TIM_OutputNState_Enable;// 设置占空比大小,主要取主函数里设置占空比这边先设置成0TIM_OCInitStructure.TIM_Pulse                  = 0;// 输出通道电平极性配置TIM_OCInitStructure.TIM_OCPolarity        = TIM_OCPolarity_High;//TIM_OCInitStructure.TIM_OCNPolarity        =  TIM_OCNPolarity_High;// 输出通道空闲电平极性配置TIM_OCInitStructure.TIM_OCIdleState     = TIM_OCIdleState_Set;//TIM_OCInitStructure.TIM_OCNIdleState  = TIM_OCNIdleState_Reset;/*初始化结构体*/TIM_OC1Init(BASIC_TIM,&TIM_OCInitStructure);//使能TIMx在CCR2上的预装载寄存器TIM_OC1PreloadConfig(BASIC_TIM,TIM_OCPreload_Enable);// 使能计数器TIM_Cmd(BASIC_TIM, ENABLE);    // 主输出使能,当使用的是通用定时器时,这句不需要TIM_CtrlPWMOutputs(BASIC_TIM, ENABLE);}void initServo(void)
{Servo_GPIO_Config();Servo_TIM2_Config();}

main.c


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "beep.h"
#include "servo.h"int main(void){ u16 i;delay_init();LED_Init();   LED0 = 0;LED1 = 0;initServo();LED1 = 1;while(1){delay_ms(300);TIM_SetCompare1(BASIC_TIM, 175); //对应180度delay_ms(300);TIM_SetCompare1(BASIC_TIM, 180); //对应135度delay_ms(300);TIM_SetCompare1(BASIC_TIM, 185); //对应90度delay_ms(300);TIM_SetCompare1(BASIC_TIM, 190); //对应45度delay_ms(300);TIM_SetCompare1(BASIC_TIM, 195); //对应0度for(i = 195; i > 174; i--){TIM_SetCompare1(BASIC_TIM, i);}delay_ms(100);for(i = 175; i < 195; i++){TIM_SetCompare1(BASIC_TIM, i);}}
}

实现结果

总结

通过这次舵机学习,让我初步了解到了STM32 PWM调制相关的知识,期间还是遇到问题。我本次采用的是TIM3通道1,但是我修改代码改成TIM3通道2就不能实现了,希望好心人能帮我解答一下。
接下来打算配合昨天写的超声波测距代码,两者整合形成一个基于STM32的感应垃圾桶。

参考:https://blog.csdn.net/qq_42866708/article/details/113355329

STM32 PWM控制舵机相关推荐

  1. STM32 PWM控制舵机——原理、接线、源程序

    STM32--PWM 控制舵机 通用定时输出PWM PWM的工作原理 PWM的模式 TIM_OCMode_PWM1 (边沿对齐模式) TIM_OCMode_PWM2(中央对齐模式) 占空比 舵机 实物 ...

  2. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  3. STM32 F767控制舵机

    STM32 F767 控制舵机 前两天用阿波罗f7的开发板做了一下舵机控制,写个笔记做个记录以便以后复习,有错误的地方希望大家批评指正. 1. 舵机介绍 2. PWM信号产生原理 3. STM32 F ...

  4. python舵机控制程序_树莓派PWM控制舵机的两种方式

    PWM控制舵机简介 通常情况下,伺服电机(舵机)是由一个标准的直流系统和一个内部反馈控制装置(一个减速齿轮和电位计)来组成的.伺服电机(舵机)的主要作用是将齿轮轴旋转到一个预定义的方向上.伺服电机(舵 ...

  5. STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...

  6. pwm控制舵机转动角度程序_01 舵机旋转控制基础

    从今天开始,我们将学习Python代码控制舵机专题.第一节课我们将学习舵机的旋转控制基础,探究180度舵机的图形化编程控制. 一.舵机 1.舵机简介 舵机也叫伺服电机,最早用于船舶上实现其转向功能,由 ...

  7. micropython控制舵机,Micropython之pwm控制舵机

    Micropython的定时器Timer 舵机原理可以参考这篇文章(侵删)51单片机PWM双舵机控制详解 简单例子 from pyb import Pin, Timer p = Pin('X1') # ...

  8. HT32F52352 PWM控制舵机

    下面使用到的舵机控制针脚为 PA4 PA5 PA6 PA7 time.h #ifndef _TIME_H_ #define _TIME_H_ #include "ht32f5xxxx_bft ...

  9. 用stm32f103zet6产生6路pwm控制舵机

    舵机 舵机,网上已经有很多关于舵机介绍的文章了,这里就不再赘述.舵机主要有三根线,GND.VCC和信号线. PWM 一般的,舵机接收到的信号为50Hz,也就是周期为20ms.当高电平的脉宽在0.5ms ...

最新文章

  1. Delphi调用java开发的WebService,传入参数出错
  2. C和指针之删除字符串第一次出现的子串
  3. python3语音识别模块_零基础教你玩转语音控制,学习语音控制技术,打造智能生活很简单...
  4. DevExpress v17.2新版亮点—Analytics Dashboard篇(一)
  5. 两个月新手的几点 storyboard 心得
  6. java 内存机制(堆和栈),内存地址
  7. 总结windows下堆溢出的三种利用方式
  8. 学习C语言中的位操作
  9. MySQL学习日志(二)
  10. 轮廓系数的应用:kmeans聚类理论篇K的选择(轮廓系数)
  11. 一个正经的前端学习 开源 仓库(每日更新)-648道知识点
  12. DOS命令tree的用法
  13. 【特效】UE4 Niagara 制作爆炸特效
  14. SVN相关问题(svn:E175002错误)的解决方案
  15. python中result的用法_python中result的用法
  16. Google战略的深远意义
  17. 手机备忘录里的照片怎么保存到相册里
  18. shell运行python脚本报错没有包_脚本安装Discuz论坛(shell + Python 实现自动化安装)...
  19. 霍尔效应——ABS传感器
  20. 如何将英文的PDF文档翻译成中文简体?

热门文章

  1. 银达汇智 智慧综合管理平台 FileDownLoad.aspx 任意文件读取漏洞
  2. 史上最全APP推广渠道
  3. 【ISP】浅析Lens Shading
  4. JavaScript 面试题汇总
  5. html5 双指缩放图片,js实现移动端图片预览:手势缩放, 手势拖动,双击放大......
  6. 图片预览(原生js实现)
  7. 我当程序员一天,就多陪你一天吧
  8. MSI(Message Signaled Interrupt)
  9. Visio流程图模具:国标1526-89(V2.0.5)
  10. WSDM 2017精选论文