axis_motion.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #ifndef __axis_H__
  2. #define __axis_H__
  3. #include "axis_motion_config.h"
  4. //===================================修改记录=================================//
  5. //2020.05.12 11:48 LXZ
  6. // 1、取消speed_unit参数,所以参数外部自己需要知道倍率,内部只管真实频率
  7. // 2、增加了设置正反转与高速回零的参数设置
  8. // 3、回零增加信号管脚、滤波次数的设置项目
  9. //2020.05.14 00:18 LXZ
  10. // 1、增了设置软件限位点的接口,修改软件限位开启接口
  11. // 2、增加了若干对外的参数读写类型
  12. // 3、修改报警反馈方式为位标志
  13. //2020.05.18 15:40 LXZ
  14. // 1、增加设置编码器回零的接口
  15. // 2、去除对编码器管脚的参数设置,要求必须用接口去操作
  16. // 3、增加了设置齿轮比的对应接口
  17. // 4、增加了设置与读取现实位置的参数对象
  18. // 5、增加了位置与脉冲单位转换接口
  19. // 6、增加了转速与频率单位转换接口
  20. // 7、增加方向读取对象
  21. //2020.05.21 15:17 LXZ
  22. // 1、修正加减速状态值的定义
  23. // 2、修改加减速缓冲为400,会占用更多的内存,但是适配更大的速度
  24. // 3、修改多段速定义
  25. //2020.05.26 14:48
  26. // 1、axis_pp函数与axis_start_pp_task函数增加返回值来表示定向运动是否正常启动
  27. // 2、增加axis_clear_alarm来清除部分非实时报警
  28. // 3、统一一下报警接口名称
  29. //2020.06.17 11:21
  30. // 1、将预览版本的比例开关并入驱动,增加比例开关接口
  31. // 当比例开关打开时,所有的位置相关移动与限位设置都会经过比例计算
  32. // 当开关关闭时,所有定位相关的接口与限位设置都以脉冲为单位,但是位置与脉冲的转换接口是可用的。
  33. // 2、修正软件限位报警自动清零功能。
  34. // 3、增加减速设置项目
  35. //2020.06.20 00:54
  36. // 1、修改齿轮比接口,增加一个放大比例参数
  37. // 2、定位接口平滑倍率改成宏定义,并加大
  38. // 3、修改了脉冲、位置转换计算方法,采用预比例计算方式,提升运算速度
  39. //2020.06.28 00:54
  40. // 1、根据侧孔钻应用定向修改了齿轮比设置接口
  41. // 2、根据侧孔钻增加速度转频率接口
  42. // 3、为了剥离硬件IO接口,修改原点获取硬件信号方式为指针地址加掩码的方式
  43. // 4、对应修改回零管脚的注册管脚接口
  44. // 5、将配置信息从头文件移到配置文件中,避免不同后期的头文件修改导致应用配置变动
  45. //============================================================================//
  46. /*
  47. #define axis_MODE_PP 1 //位置模式
  48. #define axis_MODE_PV 2 //速度模式
  49. #define axis_MODE_STOP 3 //减速停止
  50. #define axis_MODE_EMGSTOP 4 //急停
  51. */
  52. typedef struct
  53. {
  54. unsigned short steps; //脉冲需要加减速度时保证加减周期需要的脉冲个数
  55. unsigned short period; //脉宽
  56. } axis_accdec_t;
  57. typedef enum
  58. {
  59. AXIS_OUT_ENABLE,
  60. AXIS_OUT_ERRCLEAR
  61. }axis_output_name;
  62. typedef enum
  63. {
  64. MV_SERVO_ALARM = (int)(1<<0), //脉冲需要加减速度时保证加减周期需要的脉冲个数
  65. MV_HWLM_P_ALARM = (int)(1<<1), //脉宽
  66. MV_HWLM_N_ALARM = (int)(1<<2),
  67. MV_SWLM_P_ALARM = (int)(1<<3),
  68. MV_SWLM_N_ALARM = (int)(1<<4),
  69. MV_SWLM_P_PRE_ALARM = (int)(1<<5),
  70. MV_SWLM_N_PRE_ALARM = (int)(1<<6),
  71. } axis_alarm_enum;
  72. typedef enum
  73. {
  74. AXIS_MODE_PP, //PP定位模式
  75. AXIS_MODE_PV, //连续运动模式
  76. AXIS_MODE_PP_TASKS, //多段定位模式
  77. AXIS_MODE_INTERP, //插补模式,该模式下不进行加减速,只管将脉冲当量发完后停止
  78. AXIS_MODE_STOP, //停止模式
  79. AXIS_MODE_EMGSTOP //急停模式
  80. }axis_mode;
  81. typedef enum
  82. {
  83. AXIS_ALARM_NONE, //没有报警
  84. AXIS_ALARM_ERROR, //报警信号
  85. AXIS_ALARM_HW_POSITIVE, //硬件正限位信号
  86. AXIS_ALARM_HW_NEGATIVE, //硬件负限位信号
  87. AXIS_ALARM_SW_POSITIVE, //软件正限位信号
  88. AXIS_ALARM_SW_NEGATIVE //软件负限位信号
  89. }axis_alarm_code_t;
  90. typedef enum
  91. {
  92. AXIS_ACCDEC_STATUS_ACC = 0,
  93. AXIS_ACCDEC_STATUS_MID = 1,
  94. AXIS_ACCDEC_STATUS_DEC = 2
  95. }axis_accdec_status;
  96. typedef struct
  97. {
  98. int position;
  99. int speed;
  100. unsigned short dst_speed_index;
  101. unsigned short dec_speed_index;
  102. unsigned short reg_value;
  103. int target_position;
  104. int dec_position;
  105. } axis_tasks_data_t;
  106. typedef enum
  107. {
  108. AXIS_AXIS_NO = 0, //设置轴号
  109. AXIS_POSITION = 1, //设置脉冲位置计数寄存器
  110. AXIS_PULSENUMBER = 1,
  111. AXIS_CLOCK = 2, //设置时钟
  112. AXIS_PERIOD = 3, //加减速周期
  113. AXIS_MIN_STEP = 4, //设置最小步进
  114. AXIS_START_SPEED = 5, //设置最小速度
  115. AXIS_ACCDEC_MODE = 6, //设置加减速模式
  116. AXIS_AAC_LMT = 7, //设置加加速度限制
  117. AXIS_ACC_LMT = 8, //设置加速度限制
  118. AXIS_DEC_LMT = 9, //设置速度倍数
  119. AXIS_ACC_TIME = 10, //加速时间
  120. AXIS_DEC_TIME = 11, //减速时间
  121. AXIS_HOME_SPACE = 12, //零点限位的距离
  122. AXIS_HOME_OFFSET = 13, //零点偏移
  123. AXIS_HOME_FIND_SPEED = 14, //零点查找速度
  124. AXIS_HOME_HIGH_SPEED = 15, //高速回零速度
  125. AXIS_HOME_LOW_SPEED = 16, //低速回零速度
  126. AXIS_HOME_HIGH_SPEED_ENABLE = 17, //高速回零使能
  127. AXIS_FIN_SGN = 18, //伺服就绪信号
  128. AXIS_HOME_SGN = 21, //回零信号
  129. AXIS_HOME_SLOW_SGN = 22, //回零减速信号
  130. AXIS_ERROR_SGN = 23, //故障信号
  131. AXIS_HW_POSI_SGN = 24, //硬件正限位
  132. AXIS_HW_NEGA_SGN = 25, //硬件软限位
  133. AXIS_DIR_LEVEL = 26, //运动方向,1为反转
  134. AXIS_POSI_SOFT_LMT=27, //正软件限位
  135. AXIS_NEGA_SOFT_LMT=28, //负软件限位
  136. AXIS_CYCLE_LENGTH =29, //一圈距离
  137. AXIS_CYCLE_PLUSE = 30, //一圈脉冲数
  138. AXIS_REAL_POSITION = 31, //经过齿轮比转换后的位置
  139. AXIS_DIST_POSITION = 31,
  140. AXIS_CURRENT_DIR = 32, //获取当前方向
  141. AXIS_RATIO_ENABLE = 33, //齿轮比定位使能
  142. //AXIS_GEAR_RATIO = 35, //齿轮放大比例
  143. AXIS_ENABLE_SGN_LEVEL = 34, //使能信号电平
  144. }axis_paramter_t;
  145. //轴对象的数据结构
  146. typedef struct
  147. {
  148. unsigned char axis_no; //轴号,也是硬件脉冲号
  149. unsigned char accdec_mode; //加减速模式,0是直线加减速,1是S加减速
  150. axis_mode run_mode; //当前模式
  151. //输入信号
  152. struct axis_input_struct {
  153. int alarm_sgn : 1; //报警信号 1表示有信号
  154. int fin_sgn: 1; //脉冲发送完后到位信号
  155. int dir_reverse:1; //伺服方向调转,该位能直接让硬件正反方向调换,但是不会影响软件
  156. int en_reverse:1; //使能方向调转,该位能直接让硬件使能电平反转,但是不会影响软件
  157. int hw_positive_lmt : 1; //正极限位 1表示有信号
  158. int hw_home_sgn : 1; //零点 1表示有信号
  159. int hw_negative_lmt : 1; //负极限位 1表示有信号
  160. int hw_slow_lmt:1; //减速信号 1表示有信号
  161. int sw_lmt_enable:1; //软件限位功能使能 1表示有信号,这时候软件限位功能才有效
  162. int home_high_speed_enable:1; //回零高速使能
  163. int home_encode_sgn_enable:1; //编码器回零信号使能
  164. int manual_cw:1; //手动正转信号
  165. int manual_ccw:1; //手动反转信号
  166. int ratio_enable:1; //使能齿轮比
  167. int enable_sgn_level; //使能信号点评
  168. } inputs;
  169. //输出运算信号,用户不应该直接修改该区域,由软件自动判断
  170. struct axis_out_struct {
  171. int enable:1; //使能信号
  172. int error_clear:1; //报警清除信号
  173. int error_alarm : 1; //故障报警
  174. int hw_positive_alarm : 1; //硬件正极限位报警
  175. int hw_negative_alarm : 1; //硬件负极限位报警
  176. int sw_positive_alarm : 1; //软件正极限位报警
  177. int sw_negative_alarm : 1; //软件负极限位报警
  178. int sw_positive_pre_alarm:1;//软件正限位预报警
  179. int sw_negative_pre_alarm:1;//软件负限位预报警
  180. int sw_feed_zero_alarm:1; //进给点为0报警
  181. int dir:1; //方向 1时是正方向,0时是反方向
  182. int on:1; //开关状态,0时是关,1时是开
  183. int homing:1; //回零标志位
  184. int manual_action : 1; //手动动作标志,当手动有动作的时候,该标志软件会置1,急停时强制清0
  185. } outputs;
  186. unsigned long cycle_pluse; //一圈脉冲数
  187. unsigned long cycle_length; //一圈脉冲距离
  188. unsigned long length_rate; // 一圈距离相对系统距离计算的倍数,即小数点位数差
  189. long sw_positive_limit; //正极软件限位
  190. long sw_negative_limit; //负极软件限位
  191. void (*handle)(); //回调事件
  192. //加减速配置
  193. unsigned short period; //时间单位,ms
  194. int clock; //轴的基础频率
  195. unsigned short max_aac; //最大加加速
  196. unsigned short max_acc; //最大加速值
  197. unsigned short max_dec; //最大减速值
  198. unsigned short min_steps; //最小步限制,保证有最小执行计数
  199. unsigned short acc_time; //加速时间单位个数
  200. unsigned short dec_time; //减速时间单位个数
  201. unsigned short accdec_count; //加减速的计数寄存器
  202. //速度配置
  203. #if defined(AXIS_SPEED_UNIT)
  204. unsigned short speed_unit; //速度单位,真实设置速度必须乘以该单位才是真正的频率
  205. #endif
  206. int start_speed; //启动速度
  207. unsigned short target_speed_reg; //目标速度寄存器值
  208. //加减速度表
  209. int acc_table_size; //加速表大小
  210. int dec_table_size; //减速表大小
  211. unsigned short acc_number_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  212. unsigned short acc_reg_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  213. #ifndef AXIS_USING_ACC_TABLE_ONLY
  214. unsigned short dec_number_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  215. unsigned short dec_reg_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  216. #endif
  217. #ifdef AXIS_USING_DEBUG
  218. unsigned int acc_speed_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  219. #ifndef AXIS_USING_ACC_TABLE_ONLY
  220. unsigned int dec_speed_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  221. #endif
  222. #endif
  223. //软件自动计算,用户一般情况不应该去修改
  224. long dec_position; //开始减速度的脉冲位置
  225. long position; //当前的脉冲位置
  226. long target_position; //目标的脉冲位置
  227. long feed; //只能是-1或者1,用于去掉读取方向的复杂运算
  228. long encoder; //编码器输入值
  229. unsigned short cur_speed_index; //当前速度编号,针对的是脉冲表
  230. unsigned short acc_speed_index; //目标速度编号,针对的是脉冲表
  231. unsigned short dec_speed_index; //目标速度编号,针对的是脉冲表
  232. unsigned short dst_period; //目标速度的寄存器值
  233. unsigned char cur_accdec_status; //当前加减速状态,0表示正在加速,1表示正在减速
  234. //回零参数配置
  235. unsigned char home_method; //回零模式,为0是默认的常规回零模式,后续可能根据需要进行添加
  236. unsigned char home_step; //回零状态步
  237. volatile unsigned short * home_sgn_register; //回零信号脚寄存器
  238. unsigned short home_sgn_mask; //回零信号位掩
  239. unsigned short home_sgn_level; //回零信号有效电平
  240. unsigned char home_sgn_filter; //回零信号滤波
  241. unsigned char home_sgn_count; //回零信号计数
  242. volatile unsigned short * home_encoder_sgn_register; //编码零信号脚寄存器
  243. unsigned short home_encoder_sgn_mask; //编码零信号位掩
  244. unsigned short home_encoder_sgn_level; //编码零信号有效电平
  245. unsigned char home_encoder_sgn_filter; //编码零信号滤波
  246. unsigned char home_encoder_sgn_count; //编码零信号计数
  247. int home_high_speed; //回零速度
  248. int home_low_speed; //回零低速,一般当有碰到减速信号时才会用到
  249. int home_find_speed; //查找零点的速度
  250. int home_offset; //原点偏移,回零可以根据该参数再进行一次移动
  251. int home_space; //离开零点需要的至少空间
  252. long negative_space; //离开限位需要的至少空间
  253. #ifdef AXIS_PP_TASK_NUMBER
  254. char cur_task_index; //当前任务位置
  255. char task_number; //任务数
  256. axis_tasks_data_t tasks[AXIS_PP_TASK_NUMBER]; //任务缓冲池
  257. #endif
  258. short interp_feed; //插补位置;
  259. unsigned short interp_reg; //插补寄存器值
  260. } axis_object_t;
  261. typedef struct
  262. {
  263. char index; //编号,辅助识别用,意义不大
  264. int posi; //阶段位置
  265. unsigned short speed; //该阶段期望的速度
  266. //计算变量
  267. unsigned short dst_speed_index; //目标速查表编号
  268. unsigned short reg; //该阶段速度对应的寄存器值
  269. int decposition; //减速位置
  270. } axis_stage_task_t;
  271. #if 0
  272. //硬件正极限信号
  273. #define AXIS_HW_POSITIVE_SGN(axis) axis->inputs.hw_positive_lmt
  274. //硬件负极限信号
  275. #define AXIS_HW_NEGATIVE_SGN(axis) axis->inputs.hw_negative_lmt
  276. //方向反向信号
  277. #define AXIS_REVERSE_SGN(axis) axis->inputs.dir_reverse
  278. //软件极限保护使能信号
  279. #define AXIS_SW_PROTECCT_SGN(axis) axis->inputs.sw_lmt_enable
  280. //减速信号
  281. #define AXIS_SLOW_SGN(axis) axis->inputs.hw_slow_lmt
  282. //报警信号
  283. #define AXIS_ALARM_SGN(axis) axis->inputs.alarm_sgn
  284. //回零时使能高速,当有减速信号开关时才使用
  285. #define AXIS_HOMING_HIGH_SPEED_ENABLE(axis) axis->inputs.home_high_speed_enable
  286. #endif
  287. //是否正在回零点
  288. #define AXIS_IS_HOMING(axis) (axis->outputs.homing)
  289. //是否正在自动运行
  290. #define AXIS_IS_RUNNING(axis) (axis->outputs.on)
  291. //是否停止状态
  292. #define AXIS_IS_STOP(axis) (axis->outputs.on == 0)
  293. //是否出现错误
  294. #define AXIS_IS_ERROR(axis) (axis->outputs.error_alarm)
  295. //硬件正极限信号
  296. #define AXIS_EXCEED_HW_POSITIVE(axis) (axis->outputs.hw_positive_alarm)
  297. //硬件负极限信号
  298. #define AXIS_EXCEED_HW_NEGATIVE(axis) (axis->outputs.hw_negative_alarm)
  299. //软件正极限信号
  300. #define AXIS_EXCEED_SW_POSITIVE(axis) (axis->outputs.sw_positive_alarm)
  301. //软件负极限信号
  302. #define AXIS_EXCEED_SW_NEGATIVE(axis) (axis->outputs.sw_negative_alarm)
  303. //硬件使能信号
  304. #define AXIS_IS_ENABLE(axis) (axis->outputs.enable)
  305. //硬件清除报警信号
  306. #define AXIS_IS_ERRCLEAR(axis) (axis->outputs.error_clear)
  307. void axis_run(axis_object_t *axis);
  308. void axis_start(axis_object_t *axis);
  309. void axis_stop(axis_object_t *axis);
  310. void axis_emgstop(axis_object_t *axis);
  311. int axis_pp(axis_object_t *axis, int rel, int position, int speed);
  312. void axis_pv(axis_object_t *axis, int dir, int speed);
  313. void axis_pv_change_speed(axis_object_t *axis, int speed);
  314. void axis_stop_at(axis_object_t *axis, int postion);
  315. void axis_interp(axis_object_t *axis, int position, int period);
  316. void axis_init_pp_task(axis_object_t *axis, int dir);
  317. void axis_add_pp_task(axis_object_t *axis, int feed, int speed);
  318. int axis_start_pp_task(axis_object_t *axis);
  319. void axis_ccw(axis_object_t *axis);
  320. void axis_cw(axis_object_t *axis);
  321. void axis_home_run(axis_object_t *axis);
  322. void axis_home(axis_object_t *axis, int method, int home_speed, int find_speed);
  323. void axis_home_enable_high_speed(axis_object_t *axis, int high_speed);
  324. void axis_home_disable_high_speed(axis_object_t *axis);
  325. void axis_set_home_sgn(axis_object_t *axis, void * reg, unsigned short mask,unsigned short value, char filter);
  326. void axis_set_home_encoder_sgn(axis_object_t *axis, void * reg, unsigned short mask,unsigned short value, char filter);
  327. void axis_stop_all(axis_object_t *axis);
  328. void axis_set_ouput(axis_object_t *axis, axis_output_name type, int value);
  329. void axis_it_handle(void *handle);
  330. int axis_cw_lmt(axis_object_t *axis);
  331. int axis_ccw_lmt(axis_object_t *axis);
  332. int axis_get_error(axis_object_t *axis);
  333. void axis_clear_error(axis_object_t *axis);
  334. void axis_enable(axis_object_t *axis);
  335. void axis_disable(axis_object_t *axis);
  336. void axis_set_parameter(axis_object_t *axis, int cmd, int argv);
  337. int axis_get_parameter(axis_object_t *axis, int cmd);
  338. void axis_set_software_lmt(axis_object_t *axis, int positive, int negative);
  339. void axis_enable_software_lmt(axis_object_t *axis);
  340. void axis_disable_software_lmt(axis_object_t *axis);
  341. void axis_register_irq_callback(axis_object_t *axis, void (*handle)());
  342. void axis_unregister_irq_callback(axis_object_t *axis);
  343. void axis_set_accdec(axis_object_t *axis, int accdec_mode, int acc_time, int dec_time);
  344. void axis_calc_speed_table(axis_object_t *axis, int target_speed);
  345. // void axis_set_ratio(axis_object_t *axis, int cycle_pluse, int cycle_length);
  346. void axis_set_ratio(axis_object_t *axis, int cycle_pluse, int cycle_length,int lenrate);
  347. void axis_enable_ratio(axis_object_t *axis);
  348. void axis_disable_ratio(axis_object_t *axis);
  349. int axis_pluse_to_position(axis_object_t *axis, int value);
  350. int axis_position_to_pluse(axis_object_t *axis, int value);
  351. int axis_revs_to_freq(axis_object_t *axis, int value);
  352. int axis_freq_to_revs(axis_object_t *axis,int value);
  353. int axis_speed_to_freq(axis_object_t *axis, int value);
  354. #endif