如何用RobomasterC610820R电调组成伺服电机控制系统(附STM32F407源...

如何⽤RobomasterC610820R电调组成伺服电机控制系统(附
STM32F407源。。。
写在前⾯,因为代码在⼀个⼯程⾥很混乱,难以单独剥离出来,所以求源码的我就不⼀⼀回复发送了,请⼤家见谅。但可以参考Robomaster官⽅提供的DEMO,官⽅的代码条理性更强,更适合拿来参考,传送门:
---------------------------------------------------------------- 正⽂开始 ----------------------------------------------------------------
前段时间⼊⼿了⼤疆为Robomaster⽐赛推出的⼀套输出系统,C610⽆刷直流电机调速器以及M2006 P36直流⽆刷减速电机。⾸先简单讲解⼀下伺服电机控制系统的基本常识,随后会贴出源代码并结合代码分析控制原理。
伺服电机控制系统三环控制
⼀、电流环:
根据⽆刷电机的原理,其转动⼒矩和电机输⼊的转⼦电流成正⽐。因此对电机的电流闭环,实际上就是
对电机输出的转动⼒矩实现精确的闭环控制,同时电流环也是伺服电机三环控制中最底层或者说是最内层的⼀环。不过电流环实际上不涉及到⽤户的编程实现,因为电流的闭环正是电调的⼯作,即C610已经帮我们做好了底层的电流闭环。当然了,对物理稍了解⼀些的也都知道,⼒和加速度成正⽐,其商为物体的质量,同样的,⼒矩与物体转动的⾓加速度也成正⽐,其商为系统的转动惯量。因此,我个⼈对电流环的理解其实更倾向于将其认为是电机的加速度环。
⼆、速度环:
速度环是嵌套在电流环外的⼀个闭环,该环的控制对象是电机转速,电机的转速通常是由编码器的反馈经过运算得来的,其输出的控制量为电流值。速度环可理解为通过调节电流达到反馈控制电机转速的闭环。通常速度环使⽤的反馈控制算法就是简单的PID,在本篇博客中使⽤的是PD控制,对C610来讲已经能有⽐较好的效果。
三、位置环:
位置环是伺服电机三环中最外层的⼀环,其控制对象是电机的位置即编码器数值,输出的控制量为预期转速。位置环的反馈⽅式有很多种,其中最简单的是直接采⽤PID算出当前期望的转速。当然,还可以使⽤前馈来规划未来⼀段时间内电机每个时刻需要到达的转速,同时将PID复合进来实现闭环。本博客中附带的代码使⽤的是最简单的PID闭环。
其实不难看出,伺服电机的三环:加速度、速度、位置,从内到外实际上是两次对时间的积分,通过控制加速度来达到预期的转速,通过控制转速来达到预期的位置。同时从闭环算法的⾓度来看,我们在软件上实现的其实是串级PID,外级是对位置的闭环,内级是对转速的闭环。
源代码分析
沥青透水混凝土
⾸先,明确⼀下C610电调的驱动⽅式,这些实际上在C610电调使⽤说明书上都有。
头⽂件:Include
#ifndef _820R_H_
#define _820R_H_
/**
******************************************************************************
* @file          : 820R.h
* @brief          : RM820R Driver's header file
* @author        : Cui
* @date          : 2018/3/22
******************************************************************************
* DJI Robomasters RM820R Motor governor Driver, using STM32F407VGT6 Std
* Peripherals DriversLib.
*/
/* Includes ------------------------------------------------------------------*/
#include <stm32f4xx.h>
#include <stdlib.h>
#include <string.h>
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "usart.h"
#include "cuiPid.h"
#include "can2.h"
包含了⼀份⾃⼰写的CAN总线驱动、串⼝外设驱动、PID实现,以及FreeRTOS的头⽂件。
头⽂件:宏、结构体
/* Macro definitions ---------------------------------------------------------*/
#define MOTOR_ID 0x201    ///< 电调ID
#define CNT_PER_ROUND 8192    ///< 外转⼦转⼀圈的脉冲数
#define REDUCTION_RATIO 36    ///< 减速⽐
#define MOTOR_TOLERANCE 8192 ///< 位置环容差
#define CNT_PER_ROUND_OUT (CNT_PER_ROUND * REDUCTION_RATIO) ///< 电机轴转⼀圈的脉冲数
/* Struct or Class definitions -----------------------------------------------*/
typedef struct{
int16_t Current;
int16_t Angle;
int16_t Speed;
int32_t CNT_ABS;
}
RM820R_TypeDef;
/* Extern global variables ---------------------------------------------------*/
extern SemaphoreHandle_t RM820R_RX_SEM;
extern RM820R_TypeDef RM820R[4];
extern int32_t RM820R_Target;
电机的主要参数⽤宏定义定义出来,⽅便后续修改。
头⽂件:函数声明
自动平开门/
* Function declarations -----------------------------------------------------*/
/**
* @brief  Function to Initialize params for Position loop PID
* @param  pid : pointer of PPM Pid struct
* @retval None
*/
void RM820RPPM_pid_init(pid_t* pid);
抑制的生活/**
* @brief  RM820R Can Init Function
* @param  CANx : CAN Num which mounts the RM820R
* @retval None
*/
void RM_CAN_Init(CAN_TypeDef* CANx);
/**
* @brief  Independent Can message transmit function used by RM820R  * @param  msg : pointer of msg buf
*  len : length of msg buf
*  id  : CAN ID of Target RM820R
* @retval None
*/
u8 RM_CAN_Send(u8* msg,u8 len,int16_t id);
/**
* @brief  Set all four RM820Rs' Current
* @param  c1 : Current for RM820R ID 1
* @retval None
*/
void RM_Set_All_Current(int16_t c1, int16_t c2, int16_t c3, int16_t c4);
/**
* @brief  Set one selected RM820R's Current
* @param  Current : Current for selected RM820R
* @retval -1 : Using error
*  0 : Right
*/
int RM820R_SetCurrentSingle(uint8_t ID,int16_t Current);
/
**
* @brief  Function to exchange MSB and LSB
* @param  pData : Target data pointer
* @retval None
*/
void exchange_HL(uint8_t* pData);
/**
* @brief  Function to update feedback from CAN Bus to Varibles RM820R[]  * @param  None
针织牛仔布
* @retval None
*/
投币饮水机
void RM820R_GetFeedBack(void);
/
**
* @brief  Function to Set target Speed.
* @param  None
* @retval None
*/
void RM820R_PVM(int32_t spd);
/**
* @brief  Function to Set target Position.
* @param  None
* @retval None
*/
void RM820R_PPM(int32_t cnt);
/**
/**
* @brief  Unit conversion Function
* @param  ang : cnt of Motor
* @retval angle of Motor
*/
double RM820R_Cnt2Ang(int32_t cnt);
/**
* @brief  Thread/Task Function in FreeRTOS to handle The control of RM820R
* @param  pvParameters : None
* @retval None
*/
void vRM820R_PPMTask(void* pvParameters);
void vRM820R_PVMTask(void* pvParameters);
除了CAN总线的驱动函数以及⾓度换算函数外,最后两个Task函数是我们在驱动电机时,需要创建的任务,这两个任务就是真正执⾏速度闭环与位置闭环的任务。
源⽂件:全局变量
kawd-445

本文发布于:2024-09-21 22:38:59,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/265732.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:电机   控制   转速   闭环
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议