**分三個文件。
1.parameter.h 檔案
#ifndef __parameter_h
#define __parameter_h
/*#define arr 10
#define psc 84
#define length 100
#define fre_max 60000
#define fre_min 1000
#define flexible 8*/
int arr=1000;
int psc=8;
float fre_max=400;//小於或等於300啟動容易卡死。最佳選取400
float fre_min=10;
int flexible=32;
#define length 100
#define f_flex (200*flexible)
#define pi 3.1415926
#define lengthd 1000
#define kesai 1
#endif
2.stepper_motor_driver.h 檔案
#ifndef __stepper_motor_driver_h
#define __stepper_motor_driver_h
#include "stm32f4xx_tim.h"
#include "misc.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "math.h"
#include "sys.h"
#define array_length 100
//定時器頻率
#define f_t 2100000
//電機執行狀態
#define stop 0
#define accel 1
#define run 2
#define decel 3
//執行方向
#define left 1
#define right 0
//一圈步數
#define spr 6400
#define alpha (2*3.14159/spr) //步距角
#define a_t_x100 ((long)(alpha*f_t*100)) // 用於計算最大速度時的匹配值 步距角*脈衝數*100
#define t1_freq_148 ((int)((f_t*0.676)/100)) // 用於計算首脈衝 c0
/**結構體 steppermotorpara
*摘要 步進電機所需要引數
*引數 fre[100] 儲存s型曲線頻率
period[100] 儲存s型曲線週期
pulse 脈衝個數
point 計數器
*/typedef struct
steppermotorpara;
void tim4_configuration(int arr,int psc);
void moter_gpio_configuration(void);
void tim4_irqhandler(void);
void motor_init(void);
void jdugedir(void);
void speed_parameter(int steps,unsigned int accel,unsigned int decel,unsigned int speeds);
void onestep(void);
void set_speeds(int speeds,double angle);
void swingup(float adc);
#endif
3. stepper_motor_driver.c 檔案
#include "stepper_motor_driver.h"
#include "parameter.h"
#include "led.h"
#include "delay.h"
#include "monitor.h"/*
*/steppermotorpara motorpara;
steppermotorpara* pmotorpara;
unsigned int step_count = 0;
unsigned int new_step_delay; //新的匹配值
unsigned int rest = 0; //餘數
extern int pluse;
int n=1;
float delta;
int s=0;
/**函式 motor_init
*摘要 初始化變數、tim4、gpiod、s型曲線。
*引數 無
*返回值 無
*/void motor_init(void)
/**函式 speed_parameter
*摘要 t型曲線引數計算
*引數 steps:執行步數
accel:加速度
length:取點總數
decel:減速帶
speeds:速度
*返回值 無
*/void speed_parameter(int steps,unsigned int accel,unsigned int decel,unsigned int speeds)
accel_lim = ((long)steps*decel) / (accel+decel);//加速度段n1
if(accel_lim == 0)
// 可以達到最大速度
if(accel_lim <= max_s_lim)
else
//0的情況 必須從減速到停止
if(pmotorpara->decel_val == 0)
// 找到何時開始減速的步數
pmotorpara->decel_start = steps + pmotorpara->decel_val;
//速度太低了,直接執行
if(pmotorpara->step_delay <= pmotorpara->min_delay)
else
}/**函式 tim4_configuration
*摘要 tim4配置,設定為比較輸出模式。
*引數 arr:下乙個更新事件,自動過載暫存器週期值.
psc:預分頻值
*返回值 無
*/void tim4_configuration(int arr,int psc)
/**函式 gpio_configuration
*摘要 i/o口配置
*引數 無
*返回值 無
*/void moter_gpio_configuration(void)
/**函式 swingup
*摘要 倒立擺起擺,週期性運動,直到擺桿達到設定值時,使用pid控制器穩定倒立擺。
*引數 無
*返回值 無
*/void swingup(float speeds)
speeds=10.0/speeds;
if(pmotorpara->pulse>=80000)//判斷是否向右側運動
else if(pmotorpara->pulse<60000)//判斷是否向左側運動
}/**函式 jdugedir
*摘要 判斷當前距離,決定是否換向。
*引數 無
*返回值 無
*/void jdugedir(void)
else if(pmotorpara->pulse<100)//判斷是否向左側運動
}/**函式 set_speeds
*摘要 設定速度
*引數 無
*返回值 無
*/void set_speeds(int speeds,double angle)
else //判斷是否向左側運動
}/**函式 onestep
*摘要 執行一步
*引數 無
*返回值 無
*/void onestep(void)
void tim4_irqhandler(void)
case accel:
else if(new_step_delay <= pmotorpara->min_delay)
break;
} case run:
break;
} case decel:
break;
} }
pmotorpara->step_delay = new_step_delay; //獲取新的一次的匹配值
if(pmotorpara->dir==left)//向左側運動,脈衝數增加。
if(pmotorpara->dir==right)//向右側運動,脈衝數減少。
pluse--;
} }
電機控制6 步進電機模型及控制 3
步進電機的控制從控制形式上看,有開環控制和閉環控制。開環控制 步進電機系統的主要特點是能實現精確位移 精確定位,且無積累誤差。這是因為步進電機的運動受輸入脈衝控制,其位移是斷續的,總的位移量嚴格地等於輸入的指令脈衝數或其平均轉速嚴格正比於輸入指令脈衝的頻率 若能準確控制輸入指令脈衝的數量或頻率,就能...
電機控制6 步進電機模型及控制 3
步進電機的控制從控制形式上看,有開環控制和閉環控制。開環控制 步進電機系統的主要特點是能實現精確位移 精確定位,且無積累誤差。這是因為步進電機的運動受輸入脈衝控制,其位移是斷續的,總的位移量嚴格地等於輸入的指令脈衝數或其平均轉速嚴格正比於輸入指令脈衝的頻率 若能準確控制輸入指令脈衝的數量或頻率,就能...
stm32步進電機控制策略
1.中斷 計數 2.主從定時器方式。主定時器用來傳送脈衝控制速度,從定時器的自動過載暫存器為該次該次執行脈衝個數限制值用來控制電機轉動角度。從定時器的時鐘源為主定時器產生中斷的時鐘,也就是說主定時器溢位一次,從定時器計數值加一,從定時器中斷後手動關閉主定時器。3.dma pwm。dma傳輸的資料中最...