舵机

舵机,网上已经有很多关于舵机介绍的文章了,这里就不再赘述。舵机主要有三根线,GND、VCC和信号线。

PWM

一般的,舵机接收到的信号为50Hz,也就是周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。这里只是适用于180°的舵机,而360°的舵机与180°舵机的区别是给舵机一个pwm信号,舵机会以一个特定的速度转动,速度控制稳定。
//
/*180°舵机与pwm信号
0.5ms~0°
1ms~45°
1.5ms~90°
2ms~135°
2.5ms~180°
*/
//
/*360°舵机与pwm信号
0.5ms~正向最大转速
1.5ms~速度为0
2.5ms~反向最大速度
*/
//
那么我们如何用产生一个频率为50Hz的pwm脉冲呢?首先,PWM(Pulse Width Modulation),即脉冲宽度调制,也就是在一个周期内,高电平占据整个周期的时间。STM32f103zet6总共有8个定时器,TIM1~TIM8,其中,TIM6和TIM7是基本定时器,是只能向上计数的16位定时器,没有外部IO,so,没有捕获和比较通道,不能用来产生特定频率的PWM波。TIM2 ~TIM5是通用定时器,是既可以向上计数也可向下计数的16位定时器,可定时、输出比较、输入捕获,每个定时器具有4个外部IO口。而TIM1和TIM8是高级定时器,既可以向上计数也可以向下计数,可以定时、输出比较、输入捕获和输出三相电机互补信号,且每个定时器有8个IO口。

那么我们要怎么计算定时器时间呢从而得到我们想要的频率呢

直接上公式:Fpwm=主频/(自动重装载值+1)(分频+1)
Fpwm=72M/(200
7200)=50Hz=0.02s
从角度来看:周期=(自动重装载值+1)(分频+1)/主频(单位为s)
也就是:T=(200
7200)/72M=0.02s=20ms
然后占空比靠设置CCR也就是比较寄存器的值来改变,TIM_SetCompareX(TIMx,arr)

转动的角度

转动角度所对应的值=(x+1)*(1-占空比)(将PWM1极性设置为TIM_OCPolarrity_Hight时)

下面附代码块,我用的是TIM2和TIM3

PWM.C

#include <stm32f10x.h>
#include <pwm.h>
/*
用通用定时器2和3产生6路pwm控制六个舵机
传入函数的参数uint16_t arr,uint16_t psc确定了PWM信号的周期,
使用void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);函数改变ccr,从而改变PWM信号的占空比。
TIM2:PA0,PA1(不重映射)  TIM3:PC6,7,8,9(全部重映射)
*/
void TIM2and3_PWM_Init( uint16_t arr,uint16_t psc )//产生6路pwm控制6路舵机
{/* 初始化结构体 */TIM_OCInitTypeDef TIM_OCInitStruct;GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE );RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE );GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);//开启TIM3的引脚重映射的全部复用到PC6,PC7,PC8,PC9/* PA0,PA1:复用推挽输出    */GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOA, &GPIO_InitStruct );/* PC6,PC7,PC8,PC9:复用推挽输出  */GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOC, &GPIO_InitStruct );/* 初始化TIM2 基本配置 */TIM_DeInit( TIM2 );TIM_TimeBaseInitStruct.TIM_Period = arr;//arr:自动重装值TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//psc:时钟预分频数TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStruct );  /* 初始化TIM3 基本配置 */TIM_DeInit( TIM3 );TIM_TimeBaseInitStruct.TIM_Period = arr;//arr:自动重装值TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//psc:时钟预分频数TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStruct );/* 初始化TIM2 通道1,2 PA0,PA1;TIM3通道1,2,3,4 PC6,PC7,PC8,PC9 PWM配置 */
/* TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState 和 TIM_OCNIdleState 是
高级定时器 TIM1 和 TIM8 才用到的。 */TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性——高极性TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//输出使能TIM_OCInitStruct.TIM_Pulse = 199;//比较值CCR,可以不用配置,因为后期肯定要改TIM_OC1Init( TIM3, &TIM_OCInitStruct );//PC6TIM_OC4Init( TIM3, &TIM_OCInitStruct );//PC9TIM_OC1Init( TIM2, &TIM_OCInitStruct );//PA0//  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1
//  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;//输出极性——高极性
//  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//输出使能
//  TIM_OCInitStruct.TIM_Pulse = 199;//比较值CCR,可以不用配置,因为后期肯定要改    TIM_OC2Init( TIM3, &TIM_OCInitStruct );//PC7    TIM_OC3Init( TIM3, &TIM_OCInitStruct );//PC8TIM_OC2Init( TIM2, &TIM_OCInitStruct );//PA1/* 使能预装载寄存器 */TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable );TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable );TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );  TIM_OC1PreloadConfig( TIM2, TIM_OCPreload_Enable );TIM_OC2PreloadConfig( TIM2, TIM_OCPreload_Enable );/* 使能自动装载的预装载寄存器 */TIM_ARRPreloadConfig( TIM3, ENABLE );TIM_ARRPreloadConfig( TIM2, ENABLE );/* 使能TIM2,TIM3 */TIM_Cmd( TIM2, ENABLE );TIM_Cmd( TIM3, ENABLE );/*从这里开始TIM2,TIM3已经开始输出PWM了此时PWM输出的频率和占空比都是固定的,可以通过void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);函数来调整比较值,从而调整占空比(通道2)
*/
}

PWM.h

#ifndef   __PWM__H
#define   __PWM__H
void TIM2and3_PWM_Init( uint16_t arr,uint16_t psc );
#endif 

Main.c

#include <stm32f10x.h>
#include <pwm.h>
#include <delay.h>
int main(void)
{TIM2and3_PWM_Init( 199,7199 );//  20ms周期脉冲delay_init();delay_ms(5000);TIM_SetCompare1( TIM3, 20 );delay_ms(500);
//      TIM_SetCompare2( TIM3, 20 );
//      delay_ms(500);
//      TIM_SetCompare3( TIM3, 20 );
//      delay_ms(500);
//      TIM_SetCompare4( TIM3, 20);
//      delay_ms(500);
//      TIM_SetCompare1( TIM2, 20 );
//      delay_ms(500);
//      TIM_SetCompare2( TIM2, 20 );
//    delay_ms(500);
}

最后,这是我自己学习记录的一点算是小笔记吧,以后复习起来也比较容易,当然参考了网上很多优秀的文章是不可避免的。感谢大佬前辈们的无私奉献,嘿嘿!

用stm32f103zet6产生6路pwm控制舵机相关推荐

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

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

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

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

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

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

  4. STM32 PWM控制舵机

    目录 舵机简介 舵机工作原理 什么是PWM 硬件连线 代码 实现结果 总结 舵机简介 舵机是指在自动驾驶仪中操纵飞机舵面(操纵面)转动的一种执行部件.分有:①电动舵机,由电动机.传动部件和离合器组成. ...

  5. PCA9685--16路 PWM模块舵机驱动板--STM32 IIC接口模块

    目录 一.概述和硬件 1.概述 2.硬件 1.电压 2.i2c地址 3.使能脚 二.寄存器功能 MODE1寄存器 外面调用的接口 PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出 ...

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

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

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

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

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

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

  9. HT32F52352 PWM控制舵机

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

最新文章

  1. 简历受HR欢迎的四大特点
  2. jquery中not方法失效的解决方案
  3. python多变量拟合_python-使用scipy拟合多个参数曲线
  4. UA MATH564 概率论 多项分布
  5. 华为手机输入键盘声音_华为手机键盘隐藏7个秘密,你只用来打电话?来一起解锁新玩法...
  6. oracle服务说明
  7. 一个多业务、多状态、多操作的交易链路?闲鱼架构这样演进
  8. java集合类(三)About Iterator Vector(Stack)
  9. 2021年MathorCup高校数学建模挑战赛——大数据竞赛赛道A -思路分享
  10. 子进程 已安装 pre-removal 脚本 返回了错误号 1或2 解决办法:
  11. 群晖服务器怎么做文件转移,群晖(黑) 篇五:群晖系统迁移:旧群晖数据和系统转移到新机器...
  12. Software.Cradle.Suite.V11 X64 热流体模拟软件
  13. bzoj4816 [Sdoi2017]数字表格(反演)
  14. 毕业设计超市进销存管理系统源码
  15. 崩坏三 夏日竞猜 7.21 第一场
  16. 【满分】【华为OD机试真题2023 JAVAJS】查找充电设备组合
  17. ps 导出矢量图为svg,并上传iconfont
  18. 人人转联盟官网?人人转联盟是真的吗?人人转联盟能赚钱吗?
  19. 追逐日月,不苟于山川。
  20. 62%中国AI毕业生赴美,机器学习人才最高产大学出炉

热门文章

  1. 水文数据库表结构及标识符---SL/T 324-2019
  2. ⑨电子产品拆解分析-触摸化妆镜
  3. mysql limit 算法_MySQL的Limit详解
  4. Android P 9 实现静默安装静默卸载
  5. MATLAB对轮胎图形做均值滑动处理
  6. 《数据采集与分析》期末考试爬虫部分重要知识点复习(详细版)
  7. 基于Web实现诗词欣赏网页——钱塘湖春行
  8. Powershell 中 报错Set-Location : 找不到接受实际参数
  9. 不影响XP系统,不重装XP系统下扩展C盘容量
  10. 【QT小记】QT中如何弹起菜单