STM32F407控制舵机运行

 使用STM32F407控制舵机,首先来看下舵机图片


[黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)]
舵机需要信号的周期为20ms,即频率为50Hz。
接下来正式操作:
步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到)

#include "pwm.h"void TIM14_CH1_PWM_Init(u16 per,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//使能TIM14时钟GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//管脚复用GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用输出模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//管脚设置GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100MGPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化结构体TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure);  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OC1Init(TIM14,&TIM_OCInitStructure); //输出比较通道1初始化TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器TIM_ARRPreloadConfig(TIM14,ENABLE);//使能预装载寄存器TIM_Cmd(TIM14,ENABLE); //使能定时器}

程序内将定时器14的初始化放在函数内方便在主程序内调用。
注意1:舵机需要PWM信号为500微妙到2500微秒,500对应舵机-90度,2500对应舵机+90度,那么1500微秒就是舵机的0度了(按我的理解不同型号舵机也是这样的数据控制,并且试验验证过)。

注意2:程序内的这条语句会影响到实验结果:
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
你可以选择等号后面写TIM_OCPolarity_Low,或者TIM_OCPolarity_High。
按照我程序里为TIM_OCPolarity_Low,那么主程序内赋给PWM函数的值如下
TIM_SetCompare1(TIM14,500); //舵机-90度 delay_ms(2000);//延时2秒,好观察现象 TIM_SetCompare1(TIM14,1500); //舵机0度 delay_ms(2000); TIM_SetCompare1(TIM14,2500); //舵机+90度 delay_ms(2000);
如果等号后面写TIM_OCPolarity_High,
即TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
那么主程序内赋给PWM函数的值如下

     TIM_SetCompare1(TIM14,19500); delay_ms(2000);TIM_SetCompare1(TIM14,18500); delay_ms(2000);TIM_SetCompare1(TIM14,17500); delay_ms(2000);

下面看主程序。

#include "system.h"
#include "SysTick.h"
#include "pwm.h"int main()
{SysTick_Init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组TIM14_CH1_PWM_Init(20000-1,84-1); //50Hzwhile(1){TIM_SetCompare1(TIM14,500);delay_ms(2000);TIM_SetCompare1(TIM14,1500); delay_ms(2000);TIM_SetCompare1(TIM14,2500); delay_ms(2000);            }
}

注意1:定时器14产生的PWM信号的周期即频率由:
TIM14_CH1_PWM_Init(20000-1,84-1); //50Hz来产生
先讲第二个参数,84-1,为84分频,(假如你是72-1,那就是72分频的意思),我的TIM14在APB1总线上,而我设置APB1总线上即为82MHz,(你要移植到你的程序里,参考你自己的PWM程序的分频数即可),82MHz分频82,即为1MHz,即为1微秒,那么第一个参数20000-1即为1微秒乘以20000的意思,那么就是20ms即50Hz了,那么PWM的周期频率就可以了(注意:大家必须调到20ms,50Hz)。
你需要通过之前的学习,和F4的rcc头文件来确定不同定时器挂接在哪个总线上,例如TIM14在我F4的stm32f4xx_rcc.h文件里如下:

#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
#define RCC_APB1Periph_I2C1              ((uint32_t)0x00200000)
#define RCC_APB1Periph_I2C2              ((uint32_t)0x00400000)
#define RCC_APB1Periph_I2C3              ((uint32_t)0x00800000)
#define RCC_APB1Periph_CAN1              ((uint32_t)0x02000000)
#define RCC_APB1Periph_CAN2              ((uint32_t)0x04000000)
#define RCC_APB1Periph_PWR               ((uint32_t)0x10000000)
#define RCC_APB1Periph_DAC               ((uint32_t)0x20000000)
#define RCC_APB1Periph_UART7             ((uint32_t)0x40000000)
#define RCC_APB1Periph_UART8             ((uint32_t)0x80000000)
#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0x09013600) == 0x00) && ((PERIPH) != 0x00))
/*** @}*/ /** @defgroup RCC_APB2_Peripherals * @{*/
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000001)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00000002)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00000010)
#define RCC_APB2Periph_USART6            ((uint32_t)0x00000020)
#define RCC_APB2Periph_ADC               ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00000400)
#define RCC_APB2Periph_SDIO              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_SPI4              ((uint32_t)0x00002000)
#define RCC_APB2Periph_SYSCFG            ((uint32_t)0x00004000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00040000)
#define RCC_APB2Periph_SPI5              ((uint32_t)0x00100000)
#define RCC_APB2Periph_SPI6              ((uint32_t)0x00200000)
#define RCC_APB2Periph_SAI1              ((uint32_t)0x00400000)
#define RCC_APB2Periph_LTDC              ((uint32_t)0x04000000)

可以看到TIM14在APB1总线上,如果你想用其它定时器如TIM2到TIM13,你就可以不用注意时钟频率问题,因为它们都是和TIM14一样在AHB1上的,你只需要在代码内将有TIM14的地方改成TIMx你想要的那个定时器。当然多个定时器一起用也行,只要配置起来就OK。

TIM14映射在PF9上,我们将PF9连接在舵机的数据线上(白色线),给STM32F4开发板烧录程序,就可以按照自己想法操作舵机了。按照主程序里的参数设置500,即-90度,1500,即0度,2500,即+90度。那么舵机就会90度的间断转动。头文件该添加函数名的不要忘记。

请勿转载

STM32F407控制舵机相关推荐

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

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

  2. Arduino 控制舵机

    Arduino 控制舵机 #include <Servo.h> Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句吧. 1.attach(接口)--设定舵机的接 ...

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

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

  4. arduino定时器控制舵机_Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

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

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

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

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

  7. 探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino)

    ** ------------探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino) 一. 初始化设置 在初始化这里要先设置波特率.并且把初始超 ...

  8. 【STM32】数码管显示按键控制舵机转动的角度(二)

    舵机使用及原理介绍: 1.1 模块外观 1.2 模块概述 在机器人机电控制系统中,舵机控制效果是性能的重要影响因素.舵机可以在微机电系统和航模中作为基本 的输出执行机构,其简单的控制和输出使得单片机系 ...

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

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

  10. php控制舵机,分享一个关于SG90舵机的实验(+串口控制)

    新手第一次做实验,如果有写的不对的地方,还希望各位大佬多多指导. --------第一次做实验,也发现了自己学习过的东西掌握的不是很好,大佬们有啥入门级别的模块也可以推荐一下,分享当然更好了. --- ...

最新文章

  1. 树莓派~ubuntu开机自启动
  2. 干货|浅谈强化学习的方法及学习路线
  3. java编写交通灯思路
  4. DataGrid中页导航栏的自定义样式
  5. 什么是 XML Web Service
  6. 学习计划2016//12/12
  7. POJ 1904 King's Quest(强连通图)题解
  8. 如何通过OpenFace实现人脸识别框架
  9. java收获_java学习收获
  10. “约见”面试官系列之常见面试题第十五篇之jsonp(建议收藏)
  11. leetcode1085. 最小元素各数位之和 py不止是字符串的神!
  12. 牛客14607 递推(矩阵快速幂构造)
  13. iOS CoreData简单入门 - Swift版
  14. STM32F103mini教程学习总结与心得(三)---->中断
  15. 基于图灵api的Python机器人
  16. SpringBoot+thymeleaf 发送邮件
  17. maven多层项目配置
  18. 使用@Transactional(SUPPORTS)和不加@Transactional 有什么区别?
  19. HCDA day1
  20. 全文六万字《计算智能》智能优化算法 张军【Python】

热门文章

  1. 64qam带宽计算_64QAM有效传输速率计算
  2. 51单片机蓝牙模块的使用方法
  3. gsp计算机管理制度,GSP飞检项目——质量体系文件
  4. Recyclerview-BRVAH使用
  5. linux 安装.gz文件,linux安装gz文件命令
  6. tftpd64-SE使用
  7. 最优化内外点法matlab实现
  8. 记录一次破解移动吉比特光猫H2-2超管密码的过程
  9. 悟空CRM测试用例执行,项目评审
  10. BarTender对单个二维码/文本添加多个域(数据库字段)/嵌入的数据,并对数据添加后缀等处理;扩展更多域