舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180°角度伺服为例,那么对应的控制关系是:
舵机转动0°代表它的占空比是2.5%,转动180°代表它的占空比是12.5%。
设arr(自动重装载值)为x时
转动角度所对应的值=(x+1)*(1-占空比)(将pwm极性设置为TIM_OCPolarity_High时)
转动角度所对应的值=(x+1)*占空比(将pwm极性设置为TIM_OCPolarity_Low时)

PWM信号的周期计算公式:
周期=(arr+1)*(psc+1)/CLK。其中CLK为计数器的时钟频率,不分频情况是72MHz。

这里我使用的是正点原子的STM32F103ZET6,程序也是在它的基础上改的。已经跑过了,舵机可以实现0-180°转动。
timer.c

#include "timer.h"void TIM3_PWM_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//改变相应的引脚号和时钟号,就能有不同的引脚PWM输出,此处是PA.7,TIM3_CH1没有重映射//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //是否启用重映射RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIO_SetBits(GPIOA,GPIO_Pin_1);//初始为低电平,可有可无//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//是否启用重映射TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitstruct.TIM_Period=arr;TIM_TimeBaseInitstruct.TIM_Prescaler=psc;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1TIM_Cmd(TIM3, ENABLE);TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);}

main.c

#include "stm32f10x.h"
#include "delay.h"
#include "timer.h"int main()
{u16        delay_time = 1000;delay_init();//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       TIM3_PWM_Init(1999,719);//这里的arr的值和psc的值可以修改,只要在不分频情况下为72MHZwhile(1){delay_ms(delay_time);TIM_SetCompare2(TIM3, 1750); //对应180度delay_ms(delay_time);TIM_SetCompare2(TIM3, 1800); //对应135度delay_ms(delay_time);TIM_SetCompare2(TIM3, 1850); //对应90度delay_ms(delay_time);TIM_SetCompare2(TIM3, 1900);//对应45度delay_ms(delay_time);TIM_SetCompare2(TIM3, 1950); //对应0度delay_ms(delay_time);      }}

第一次写博客,记录自己的学习过程,希望能一直进步。

STM32F103控制舵机转动相关推荐

  1. stm32f103控制舵机(数字舵机和模拟舵机都一样)双通道(代码改与官方文档)

    #include "stm32f10x.h" #include "bsp_GeneralTim.h" void delay(uint32_t count) { ...

  2. arduino驱动MG996舵机+stm32f103驱动舵机

    2020/12/16更新stm32f103驱动舵机方式 舵机基本信息 舵机的控制信号周期为20MS的脉宽调制(PWM)信号,其中脉冲宽度从0.5-2.5MS,相对应的舵盘位置为0-180度.也就是说周 ...

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

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

  4. Arduino 控制舵机

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. .Net缓存小结(下)
  2. 听说有人解决了三体问题,我去做了一点微小的调查
  3. Excel VBA(宏):添加宏
  4. 三星sd卡无法删除数据_单反相机里的SD卡在电脑中突然无法识别提示要格式化怎么办?...
  5. 【CodeForces - 219D 】Choosing Capital for Treeland (树形dp)
  6. python atm作业详解_Python学习day5作业-ATM和购物商城
  7. 转:Oracle物理文件
  8. 互联网晚报 | 1月11日 星期二 | 恒大集团退租深圳总部大楼;荣耀发布首款折叠旗舰手机;虎牙拿下5年LPL独播权...
  9. 方便维护下拉框数据的UI设计
  10. matlab与c 接口与混合编程,Matlab与C/C++混合编程接口及应用方法解析
  11. 39岁程序员住进养老院,早6晚9的作息,网友羡慕哭了
  12. 使用了visual assist.net
  13. 【数据结构_浙江大学MOOC】第六七八讲 图
  14. 华为GPON设备ONU常见告警及处理
  15. 机器学习中的统计学基础知识
  16. linux c: 静态库和动态库的生成和使用
  17. 佛青云多少输出才能过鸿蒙,细节需慎重 现阶段佛青云多种路线选择
  18. c语言中小数乘整数,小数乘整数中的算法算理教学
  19. 5V的OVP过压保护IC,去掉不良率
  20. java怎样定义一个对象数组,java定义一个对象数组

热门文章

  1. Python——字符串转换与处理
  2. ​力扣解法汇总1037-有效的回旋镖
  3. 计算机如何分页打印,[计算机]Excel表格如何分页打印、自动分页、取消分页等技巧.doc...
  4. 你需要一款高效的搜索工具,Everything下载安装使用,快速上手,小工具推荐
  5. 精致树叶鼠标指针(两款)
  6. edx文件打开使用的软件免费下载
  7. 第十六届全国大学生智能车竞赛线上总决赛比赛时间与直播链接
  8. 编译openwrt到s3c2410(1)
  9. 【Proteus仿真】555组成的多谐振荡器电路
  10. 《信号与系统》笔记·第一章:信号与系统