STM32F407控制舵机
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控制舵机相关推荐
- pwm控制舵机转动角度程序_01 舵机旋转控制基础
从今天开始,我们将学习Python代码控制舵机专题.第一节课我们将学习舵机的旋转控制基础,探究180度舵机的图形化编程控制. 一.舵机 1.舵机简介 舵机也叫伺服电机,最早用于船舶上实现其转向功能,由 ...
- Arduino 控制舵机
Arduino 控制舵机 #include <Servo.h> Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句吧. 1.attach(接口)--设定舵机的接 ...
- python舵机控制程序_树莓派PWM控制舵机的两种方式
PWM控制舵机简介 通常情况下,伺服电机(舵机)是由一个标准的直流系统和一个内部反馈控制装置(一个减速齿轮和电位计)来组成的.伺服电机(舵机)的主要作用是将齿轮轴旋转到一个预定义的方向上.伺服电机(舵 ...
- arduino定时器控制舵机_Arduino学习经验(一)之解决舵机库和pwm输出冲突
一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...
- STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时
参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...
- STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值
参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...
- 探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino)
** ------------探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino) 一. 初始化设置 在初始化这里要先设置波特率.并且把初始超 ...
- 【STM32】数码管显示按键控制舵机转动的角度(二)
舵机使用及原理介绍: 1.1 模块外观 1.2 模块概述 在机器人机电控制系统中,舵机控制效果是性能的重要影响因素.舵机可以在微机电系统和航模中作为基本 的输出执行机构,其简单的控制和输出使得单片机系 ...
- micropython控制舵机,Micropython之pwm控制舵机
Micropython的定时器Timer 舵机原理可以参考这篇文章(侵删)51单片机PWM双舵机控制详解 简单例子 from pyb import Pin, Timer p = Pin('X1') # ...
- php控制舵机,分享一个关于SG90舵机的实验(+串口控制)
新手第一次做实验,如果有写的不对的地方,还希望各位大佬多多指导. --------第一次做实验,也发现了自己学习过的东西掌握的不是很好,大佬们有啥入门级别的模块也可以推荐一下,分享当然更好了. --- ...
最新文章
- 树莓派~ubuntu开机自启动
- 干货|浅谈强化学习的方法及学习路线
- java编写交通灯思路
- DataGrid中页导航栏的自定义样式
- 什么是 XML Web Service
- 学习计划2016//12/12
- POJ 1904 King's Quest(强连通图)题解
- 如何通过OpenFace实现人脸识别框架
- java收获_java学习收获
- “约见”面试官系列之常见面试题第十五篇之jsonp(建议收藏)
- leetcode1085. 最小元素各数位之和 py不止是字符串的神!
- 牛客14607 递推(矩阵快速幂构造)
- iOS CoreData简单入门 - Swift版
- STM32F103mini教程学习总结与心得(三)---->中断
- 基于图灵api的Python机器人
- SpringBoot+thymeleaf 发送邮件
- maven多层项目配置
- 使用@Transactional(SUPPORTS)和不加@Transactional 有什么区别?
- HCDA day1
- 全文六万字《计算智能》智能优化算法 张军【Python】