文档章节

四轴飞控系列-电机PWM控制驱动

 土家二少
发布于 2016/10/19 17:41
字数 1105
阅读 28
收藏 0

四轴飞控系列-电机PWM控制


四轴

硬件原理

四轴通过定时器PWM来控制MOS管开关,从而控制电机的开关,通过调整其占空比来控制电机的转速,其原理图如下

原理图


软件部分

1.STM32定时器

定时器

2.常见寄存器

TIMx_CNT:脉冲计数器
TIMx_ARR:重载寄存器(保存定时器的溢出值)
TIMx_CCR:捕获/比较寄存器

3.基本定时器工作原理

工作时,脉冲计数器TIMx_CNT由时钟触发进行计数,当TIMx_CNT的计数值X等于重载寄存器 TIMx_ARR 中保存的数值N时,产生溢出事件,可触发中断或 DMA 请求。然后 TIMx_CNT 的值重新被置为 0,重新向上计数。

时钟源TIMx_CLK经过PSC预分频器输入至脉冲计数器TIMx_CNT,基本定时器只能工作在向上计数模式,在重载寄存器 TIMx_ARR 中保存的是定时器的溢出值。

4.PWM输出过程

若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当 TIMx_CNT的数值 X 大于 N 时,会重置TIMx_CNT 数值为 0 并重新计数。

而在 TIMx_CNT 计数的同时,TIMx_CNT 的计数值 X 会与比较寄存器 TIMx_CCR 预先存储的数值 A 进行比较。当脉冲计数器 TIMx_CNT 的数值 X 小于比较寄存器TIMx_CCR 的值 A 时,输出高电平(或低电平);相反地,当脉冲计数器的数值 X 大于或等于比较寄存器的值 A 时,输出低电平(或高电平)。

如此循环,得到的输出脉冲周期就为重载寄存器 TIMx_ARR 存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器 TIMx_CCR 的值 A 乘以触发脉冲的时钟周期,即输出 PWM 的占空比为 A/(N+1)

PWM 输出模式,图中为重载寄存器 TIMx_ARR 被配置为 N=8,向上计数 ;比较寄存器 TIMx_CCR 的值被设置为 4、8、大于 8、等于 0 时的输出时序图。图中OCxREF 即为 GPIO 引脚的输出时序、CCxIF 为触发中断的时序。

PWM输出

#####代码分析

moto.c

/**
  *----------------------------------------------------------------------------*
  * @file    moto.c
  * @author  Jerry.XL
  * @version V1.0
  * @date    2016-07-24
  * @brief   MOTO驱动
  *----------------------------------------------------------------------------*
  * @attention
  *		| PA0--MOTO1 | PA2--MOTO2 |
  *		| PB3--MOTO3 | PB4--MOTO4 |
  *
  *----------------------------------------------------------------------------*
  */
  
#include "moto.h"   
 
int16_t MOTO1_PWM = 0;
int16_t MOTO2_PWM = 0;
int16_t MOTO3_PWM = 0;
int16_t MOTO4_PWM = 0;
/**----------------------------------------------------------------------------*
  *	  函 数 名: MotorPwmFlash
  *	  功能说明: 更新四路PWM值
  *	  形    参:MOTO1_PWM,MOTO2_PWM,MOTO3_PWM,MOTO4_PWM
  *	  返 回 值: 无
  *----------------------------------------------------------------------------*
  *	  备	注:
  *			四路PWM由定时器2输出,输入范围0-999
***----------------------------------------------------------------------------*/
void MotorPwmFlash(int16_t MOTO1_PWM,int16_t MOTO2_PWM,int16_t MOTO3_PWM,int16_t MOTO4_PWM)
{	
	/* 限定输入不能小于0,大于999 */
     if(MOTO1_PWM>=Moto_PwmMax)	MOTO1_PWM = Moto_PwmMax;
     if(MOTO2_PWM>=Moto_PwmMax)	MOTO2_PWM = Moto_PwmMax;
     if(MOTO3_PWM>=Moto_PwmMax)	MOTO3_PWM = Moto_PwmMax;
     if(MOTO4_PWM>=Moto_PwmMax)	MOTO4_PWM = Moto_PwmMax;
     if(MOTO1_PWM<=0)	MOTO1_PWM = 0;
     if(MOTO2_PWM<=0)	MOTO2_PWM = 0;
     if(MOTO3_PWM<=0)	MOTO3_PWM = 0;
     if(MOTO4_PWM<=0)	MOTO4_PWM = 0;

    /* 修改CCR寄存器,调整PWM占空比 */
    TIM2->CCR1 = MOTO1_PWM;		
    TIM2->CCR2 = MOTO2_PWM;
    TIM2->CCR3 = MOTO3_PWM;
    TIM2->CCR4 = MOTO4_PWM;        //对定时器寄存器赋值
}

/**----------------------------------------------------------------------------*
  *	  函 数 名: MotorInit
  *	  功能说明: 输出PWM的定时器2初始化
  *	  形    参:无
  *	  返 回 值: 无
  *----------------------------------------------------------------------------*
  *	  备	注:
  *			调用该函数,即初始化定时器2为PWM输出模式
***----------------------------------------------------------------------------*/
void MotorInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
	
    uint16_t PrescalerValue = 0;    //控制电机PWM频率(预分频系数)
        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开外设A的时钟和复用时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);  //打开定时器2时钟  
     
    // 设置GPIO功能,设置PA0|1|2|3为推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
      
    // 复位定时器。
    TIM_DeInit(TIM2);
    
    // 配置计时器。
    PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) +1;
    
	/* 实际周期计算方法 */
    // T=TIM_Prescaler*TIM_Period/TIMx_CLK

	TIM_TimeBaseStructure.TIM_Period = 999;		            //计数上线(定时周期)	
    TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;	//定时器的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;	
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
    
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
    
    
    // 配置TIM2为PWM输出模式
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;    //0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    
    TIM_OC1Init(TIM2,&TIM_OCInitStructure);
    TIM_OC2Init(TIM2,&TIM_OCInitStructure);
    TIM_OC3Init(TIM2,&TIM_OCInitStructure);
    TIM_OC4Init(TIM2,&TIM_OCInitStructure);
    
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
    
    // 启动计时器。
    TIM_Cmd(TIM2,ENABLE);
}

/*********************************************END OF FILE**********************/

moto.h

#ifndef __MOTO_H
#define	__MOTO_H

#include "stm32f10x.h"

#include "moto.h" 

#define Moto_PwmMax 999
void MotorInit(void);
void MotorPwmFlash(int16_t MOTO1_PWM,int16_t MOTO2_PWM,int16_t MOTO3_PWM,int16_t MOTO4_PWM);

#endif /* __MOTO_H */

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 3
码字总数 2640
作品 0
深圳
四轴飞行器基本组成及其飞行原理详解

近日,自己组装了一台 ; 组装完后,便想深究其原理;避免只是 ; 查阅资料后,便在其他文章的基础上,将此文 出来; 文章末尾有参考文章列表,同时感谢原作者的创作; 先上一张自己组装的 ...

qq_35723367
03/29
0
0
采用超级电容器单独供电的BLDC调速控制系统设计分析与实现

摘要 本文针对第十二届全国大学生智能汽车竞赛电磁节能组,设计一种采用超级电容器单独供电的无刷直流电机(BLDC)调速控制系统。该装置在实现超级电容器充分放电及对电能的最大利用的前提下,...

qq_38593854
04/20
0
0
stm32制作的微型雕刻机 ,你可以不?

附上:点击参考 购买元器件附带3D封装:https://weidian.com/?userid=1238350417&wfr=c&ifr=shopdetail 看到网上有好多做微型激光雕刻机的DIY,手头正好有几个拆下来的笔记本光驱,把光驱里的...

javajava2017
04/05
0
0
使用者——初见Pixhawk

(是什么) Pixhawk简单介绍 PixHawk是著名飞控厂商3DR推出的新一代独立、开源、高效的飞行控制器,前身为APM飞控,不仅提供了丰富的外设模块和可靠的飞行体验,有能力的爱好者还可在其基础上...

CSDNhuaong
2017/09/11
0
0
【无人机】一文读懂无人机飞行原理

来源:小小马带你学 一、无人机的飞行原理 旋翼和轮子一样,是一项神奇的发明。 四旋翼无人机更是化作了航拍机,满足了许多普通人关于天空的想象。 旋翼之所以能飞,玩过竹蜻蜓的朋友应该都知...

np4rhi455vg29y2
01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
9
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部