# 通用直流电机程序 **Repository Path**: zfqcode/general-DC-motor-program ## Basic Information - **Project Name**: 通用直流电机程序 - **Description**: 通用电机控制程序 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-04-21 - **Last Updated**: 2025-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用直流电机程序 所有使用的函数 ``` c //初始化 void Motor_Init(Motor_t* handle, uint16_t Speed_Max, void (*f_Motor_GetData_Func)(Motor_GetData_t* handle), void (*f_Motor_Set_Pwm_Func)(int16_t speed), float Wheel_R, uint16_t Encoder_OneCircle_Circle, uint16_t Timer_Set, float Postion_KP,float Postion_KI,float Postion_KD, float Pulse_KP,float Pulse_KI,float Pulse_KD, float Meter_KP,float Meter_KI,float Meter_KD,uint32_t maxout,uint32_t intergral_limit); //1ms Func void Motor_Func(Motor_t* handle); //模式设置 void Set_Motor_Mode(Motor_t* handle,uint8_t mode); //速度设置 void Set_Motor_Dir(Motor_t* handle,uint8_t dir); void Set_Motor_PWM_NoDir(Motor_t* handle,uint16_t speed); void Set_Motor_PWM_Dir(Motor_t* handle,int16_t speed); void Set_Motor_Speed_PID_Meter(Motor_t* handle,float speed); void Set_Motor_Speed_PID_Pulse(Motor_t* handle,int16_t speed); ``` ## 定义结构体 例:定义一个电机结构体 ```c Motor_t motor; ``` ​ ## 初始化函数 ```c void Motor_Init(Motor_t* handle, uint16_t Speed_Max, void (*f_Motor_GetData_Func)(Motor_GetData_t* handle), void (*f_Motor_Set_Pwm_Func)(int16_t speed), float Wheel_R, uint16_t Encoder_OneCircle_Circle, uint16_t Timer_Set, float Postion_KP,float Postion_KI,float Postion_KD, float Pulse_KP,float Pulse_KI,float Pulse_KD, float Meter_KP,float Meter_KI,float Meter_KD,uint32_t maxout,uint32_t intergral_limit); ``` ​ 输入: ​ 自定义的结构体: ``` c Motor_t* handle ``` ​ pwm输出的最大值限制: ```c uint16_t Speed_Max ``` ​ 输入输出的函数注册: ```c void (*f_Motor_GetData_Func)(Motor_GetData_t* handle), void (*f_Motor_Set_Pwm_Func)(int16_t speed) ``` ​ 轮子半径: ``` c float Wheel_R ``` ​ 速度测算周期(单位ms): ```c uint16_t Timer_Set ``` ​ 位置环PID(还没写位置环,暂时不能用): ``` c float Postion_KP,float Postion_KI,float Postion_KD ``` ​ 速度环PID(单位脉冲/20ms): ```c float Pulse_KP,float Pulse_KI,float Pulse_KD ``` ​ 速度环PID(单位m/s) ``` c float Meter_KP,float Meter_KI,float Meter_KD,uint32_t maxout,uint32_t intergral_limit); ``` 例: ``` Motor_Init(&motor, 320, get_speed,set_Speed, 72/2, 420, 20, 5,1,0, 5,1,0, 50,8,0,320,320); ``` ## 循环调用 ```c void Btn_Func(btn_t *handle); ``` 把这个函数放在1ms/次的定时器中 ## 模式设置 ```c //模式种类 enum{ Motor_Mode_SPEED_PWM=0, //速度控制模式 直接输入PWM模式 Motor_Mode_SPEED_PID_Pulse, //速度控制模式 输入脉冲模式 单位:脉冲/20ms Motor_Mode_SPEED_PID_Meter, //速度控制模式 输入速度模式 单位:m/s //还没写位置环 Motor_Mode_POSTION_PID_Pulse, Motor_Mode_POSTION_PID_Meter, }; void Set_Motor_Mode(Motor_t* handle,uint8_t mode); ``` ## 速度控制 ```c //速度设置 void Set_Motor_Dir(Motor_t* handle,uint8_t dir); void Set_Motor_PWM_NoDir(Motor_t* handle,uint16_t speed); void Set_Motor_PWM_Dir(Motor_t* handle,int16_t speed); void Set_Motor_Speed_PID_Pulse(Motor_t* handle,int16_t speed); void Set_Motor_Speed_PID_Meter(Motor_t* handle,float speed); ``` #### 无方向速度设置、以及设置方向 ```c //方向 enum { Motor_CW = 1, Motor_CCW = 0, }; void Set_Motor_Dir(Motor_t* handle,uint8_t dir); void Set_Motor_PWM_NoDir(Motor_t* handle,uint16_t speed); ``` 例:方向设置反转、速度设置100 ```c Set_Motor_Dir(&motor,Motor_CCW); Set_Motor_PWM_NoDir(&motor,100); ``` #### 有方向速度设置 ```c void Set_Motor_PWM_Dir(Motor_t* handle,int16_t speed); ``` 例:方向设置反转、速度设置100 ```c Set_Motor_PWM_Dir(&motor,-100); ``` #### PID速度控制 单位脉冲/20ms ```c void Set_Motor_Speed_PID_Pulse(Motor_t* handle,int16_t speed); ``` 例:方向设置正转、速度设置40脉冲/20ms ```c Set_Motor_Speed_PID_Pulse(&motor,40); ``` #### PID速度控制 单位m/s ```c void Set_Motor_Speed_PID_Meter(Motor_t* handle,float speed); ``` 例:方向设置正转、速度设置1m/s ```c Set_Motor_Speed_PID_Meter(&motor,1); ``` ## 例程 stm32: ```c #include "DCMotor.h" Motor_t motor; //can通讯获取电机驱动板上的所需的编码器脉冲值 void get_speed(Motor_GetData_t* handle) { handle->Encoder=-SLAVE_DCMotorMiniwatt_PlaceRead(&DCMotorMiniwatt_S[0]); if(SLAVE_DCMotorMiniwatt_SpeedRead(&DCMotorMiniwatt_S[0])>=0) { handle->Encoder_Dir=Motor_CW; } else { handle->Encoder_Dir=Motor_CCW; } } //can通讯设置电机驱动板输出的速度 void set_Speed(int16_t speed) { SLAVE_DCMotorMiniwatt_SpeedSet(&DCMotorMiniwatt_S[0],-speed); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM1) //1ms { Motor_Func(&motor); } } void Init() { HAL_TIM_Base_Start_IT(&htim1); Motor_Init(&motor, 320, //最大pwm速度 get_speed,set_Speed, //注册输入输出函数 72/2, //轮子半径 420, //单圈编码器脉冲值 20, //20ms记一次速 5,1,0, //位置环PID (暂时未写位置环) 5,1,0, //速度环PID (PWM与脉冲) 50,8,0,320,320); //速度环PID (m/s) } uint16_t mode=0; int16_t dir=Motor_CW;; uint16_t NoDirSpeed=100; int16_t Dirspeed=100 int16_t PulseSpeed=100 float MeterSpeed=1; void main() { Init(); while(1) { if(mode==0) { Set_Motor_Mode(&motor,Motor_Mode_SPEED_PWM); Set_Motor_Dir(&motor,dir); Set_Motor_PWM_NoDir(&motor,NoDirSpeed); } else if(mode==1) { Set_Motor_Mode(&motor,Motor_Mode_SPEED_PWM); Set_Motor_PWM_Dir(&motor,Dirspeed); } else if(mode==2) { Set_Motor_Mode(&motor,Motor_Mode_SPEED_PID_Pulse); Set_Motor_Speed_PID_Pulse(&motor,PulseSpeed); } else if(mode==3) { Set_Motor_Mode(&motor,Motor_Mode_SPEED_PID_Meter); Set_Motor_Speed_PID_Meter(&motor,MeterSpeed); } } } ```