axis_motion.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. #ifndef __axis_H__
  2. #define __axis_H__
  3. #define AXIS_USING_FLOAT //使用浮点运算功能
  4. //#define AXIS_USING_DEBUG //使用调试
  5. //#define AXIS_IGNORE_REPEAT_STEP //去除重复步
  6. //#define AXIS_USING_ACC_TABLE_ONLY //使用加速表同时当减速表来减少内存,使能该选项将会减少内存占用,
  7. //但是减时间设置将无效化
  8. #define AXIS_MAX_ACCDEC_STEP 500 //加减速表的缓冲大小
  9. #define AXIS_TASK_NUMBER 5 //任务缓冲个数
  10. #define AXIS_CALC_ROUND(reg) 0
  11. #define PP_Stop 0
  12. #define PP_NoStop 1
  13. //任务数量必须大于1,不然就没有作用
  14. #if defined(AXIS_TASK_NUMBER) && (AXIS_TASK_NUMBER < 1)
  15. #error "axis tasks data buffer number must bigger 1!"
  16. #endif
  17. /*
  18. #define axis_MODE_PP 1 //位置模式
  19. #define axis_MODE_PV 2 //速度模式
  20. #define axis_MODE_STOP 3 //减速停止
  21. #define axis_MODE_EMGSTOP 4 //急停
  22. */
  23. typedef struct
  24. {
  25. unsigned short steps; //脉冲需要加减速度时保证加减周期需要的脉冲个数
  26. unsigned short period; //脉宽
  27. } axis_accdec_t;
  28. typedef enum
  29. {
  30. AXIS_OUT_ENABLE,
  31. AXIS_OUT_ERRCLEAR
  32. }axis_output_name;
  33. typedef enum
  34. {
  35. AXIS_MODE_PP, //PP定位模式
  36. AXIS_MODE_PV, //连续运动模式
  37. AXIS_MODE_PP_TASKS, //多段定位模式
  38. AXIS_MODE_STOP, //停止模式
  39. AXIS_MODE_EMGSTOP, //急停模式
  40. AXIS_MODE_HOLD, //保持状态
  41. AXIS_MODE_PLUS_STOP //运行指定脉冲数停止模式
  42. }axis_mode;
  43. typedef enum
  44. {
  45. AXIS_ALARM_NONE, //没有报警
  46. AXIS_ALARM_ERROR, //报警信号
  47. AXIS_ALARM_HW_POSITIVE, //硬件正限位信号
  48. AXIS_ALARM_HW_NEGATIVE, //硬件负限位信号
  49. AXIS_ALARM_SW_POSITIVE, //软件正限位信号
  50. AXIS_ALARM_SW_NEGATIVE //软件负限位信号
  51. }axis_alarm_code_t;
  52. typedef enum
  53. {
  54. AXIS_ACCDEC_STATUS_ACC,
  55. AXIS_ACCDEC_STATUS_DEC
  56. }axis_accdec_status;
  57. typedef struct
  58. {
  59. int position;
  60. int speed;
  61. unsigned short dst_speed_index;
  62. unsigned short dec_speed_index;
  63. unsigned short reg_value;
  64. int target_position;
  65. int dec_position;
  66. } axis_tasks_data_t;
  67. typedef enum
  68. {
  69. AXIS_AXIS_NO, //设置轴号
  70. AXIS_POSITION, //设置脉冲位置计数寄存器
  71. AXIS_CLOCK, //设置时钟
  72. AXIS_PERIOD, //加减速周期
  73. AXIS_MIN_STEP, //设置最小步进
  74. AXIS_START_SPEED, //设置最小速度
  75. AXIS_ACCDEC_MODE, //设置加减速模式
  76. AXIS_AAC_LMT, //设置加加速度限制
  77. AXIS_ACC_LMT, //设置加速度限制
  78. AXIS_SPEED_UNIT, //设置速度倍数
  79. AXIS_ACC_TIME, //加速时间
  80. AXIS_DEC_TIME, //减速时间
  81. AXIS_PP_STOP_SELECT, //数控到位是否停止
  82. AXIS_HOME_SPACE, //零点限位的距离
  83. AXIS_HOME_OFFSET, //零点偏移
  84. AXIS_HOME_FIND_SPEED, //零点查找速度
  85. AXIS_HOME_HIGH_SPEED, //高速回零速度
  86. AXIS_HOME_LOW_SPEED, //低速回零速度
  87. AXIS_DIR_REVERSE, //方向电平取反
  88. AXIS_EN_REVERSE, //使能电平取反
  89. AXIS_ALARM_REVERSE, //伺服告警极性转换
  90. AXIS_USE_ENCODE //使能使用编码器位置
  91. } axis_paramter_t;
  92. //轴对象的数据结构
  93. typedef struct
  94. {
  95. unsigned char axis_no; //轴号,也是硬件脉冲号
  96. unsigned char accdec_mode; //加减速模式,0是直线加减速,1是S加减速
  97. axis_mode run_mode; //当前模式
  98. //输入信号
  99. struct axis_input_struct {
  100. unsigned short alarm_sgn : 1; //报警信号 1表示有信号
  101. unsigned short fin_sgn: 1; //脉冲发送完后到位信号
  102. unsigned short dir_reverse:1; //伺服方向调转,该位能直接让硬件正反方向调换,但是不会影响软件
  103. unsigned short en_reverse:1; //使能方向调转,该位能直接让硬件使能电平反转,但是不会影响软件
  104. unsigned short alarm_reverse:1; //伺服告警极性设置,0位常开,1为常闭
  105. unsigned short hw_positive_lmt : 1; //正极限位 1表示有信号
  106. unsigned short hw_home_sgn : 1; //零点 1表示有信号
  107. unsigned short hw_negative_lmt : 1; //负极限位 1表示有信号
  108. unsigned short hw_slow_lmt:1; //减速信号 1表示有信号
  109. unsigned short sw_lmt_enable:1; //软件限位功能使能 1表示有信号,这时候软件限位功能才有效
  110. unsigned short home_high_speed_enable:1; //回零高速使能
  111. unsigned short manual_cw:1; //手动正转信号
  112. unsigned short manual_ccw:1; //手动反转信号
  113. } inputs;
  114. //输出运算信号,用户不应该直接修改该区域,由软件自动判断
  115. struct axis_out_struct {
  116. unsigned short enable:1; //使能信号
  117. unsigned short error_clear:1; //报警清除信号
  118. unsigned short error_alarm : 1; //故障报警
  119. unsigned short hw_positive_alarm : 1; //硬件正极限位报警
  120. unsigned short hw_negative_alarm : 1; //硬件负极限位报警
  121. unsigned short sw_positive_alarm : 1; //软件正极限位报警
  122. unsigned short sw_negative_alarm : 1; //软件负极限位报警
  123. unsigned short dir:1; //方向 1时是正方向,0时是反方向
  124. unsigned short on:1; //开关状态,0时是关,1时是开
  125. unsigned short homing:1; //回零标志位
  126. unsigned short manual_action : 1; //手动动作标志,当手动有动作的时候,该标志软件会置1,急停时强制清0
  127. } outputs;
  128. long sw_positive_limit; //正极软件限位
  129. long sw_negative_limit; //负极软件限位
  130. void (* handle)(); //回调事件
  131. //加减速配置
  132. unsigned short period; //时间单位,ms
  133. int clock; //轴的基础频率
  134. unsigned short max_aac; //最大加加速
  135. unsigned short max_acc; //最大加速值
  136. unsigned short max_dec; //最大减速值
  137. unsigned short min_steps; //最小步限制,保证有最小执行计数
  138. unsigned short acc_time; //加速时间单位个数
  139. unsigned short dec_time; //减速时间单位个数
  140. unsigned short accdec_count; //加减速的计数寄存器
  141. unsigned short PP_Stop_Select; //数控模式下到数停止选择,0正常停止,到数后继续直低速
  142. //速度配置
  143. unsigned short speed_unit; //速度单位,真实设置速度必须乘以该单位才是真正的频率
  144. unsigned short start_speed; //启动速度
  145. unsigned short stop_speed; //停止速度
  146. unsigned short target_speed_reg; //目标速度寄存器值
  147. //编码器配置
  148. unsigned char use_encode; //0表示不使用编码器位置,1表示使用编码器位置
  149. long plus_stop_position; //运行指定脉冲数停止位置
  150. //加减速度表
  151. int acc_table_size; //加速表大小
  152. int dec_table_size; //减速表大小
  153. unsigned short acc_number_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  154. unsigned short acc_reg_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  155. #ifndef AXIS_USING_ACC_TABLE_ONLY
  156. unsigned short dec_number_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  157. unsigned short dec_reg_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  158. #endif
  159. #ifdef AXIS_USING_DEBUG
  160. unsigned int acc_speed_table[AXIS_MAX_ACCDEC_STEP]; //当前速度满足周期的脉冲数
  161. #ifndef AXIS_USING_ACC_TABLE_ONLY
  162. unsigned int dec_speed_table[AXIS_MAX_ACCDEC_STEP]; //当前速度对应的寄存器值
  163. #endif
  164. #endif
  165. //软件自动计算,用户一般情况不应该去修改
  166. long dec_position; //开始减速度的脉冲位置
  167. long acc_position; //加速脉冲数量
  168. long position; //当前的脉冲位置
  169. long target_position; //目标的脉冲位置
  170. long feed; //只能是-1或者1,用于去掉读取方向的复杂运算
  171. long encoder; //编码器输入值
  172. unsigned short cur_speed_index; //当前速度编号,针对的是脉冲表
  173. unsigned short acc_speed_index; //目标速度编号,针对的是脉冲表
  174. unsigned short dec_speed_index; //目标速度编号,针对的是脉冲表
  175. unsigned short dst_period; //目标速度的寄存器值
  176. unsigned char cur_accdec_status; //当前加减速状态,0表示正在加速,1表示正在减速
  177. unsigned short cur_speed;//当前速度
  178. unsigned short cur_reg_value;//当前寄出器的值。
  179. //回零参数配置
  180. unsigned char home_method; //回零模式,为0是默认的常规回零模式,后续可能根据需要进行添加
  181. unsigned char home_step; //回零状态步
  182. unsigned home_high_speed; //回零速度
  183. unsigned home_low_speed; //回零低速,一般当有碰到减速信号时才会用到
  184. unsigned home_find_speed; //查找零点的速度
  185. int home_offset; //原点偏移,回零可以根据该参数再进行一次移动
  186. int home_space; //离开零点需要的至少空间
  187. long negative_space; //离开限位需要的至少空间
  188. #ifdef AXIS_TASK_NUMBER
  189. char cur_task_index; //当前任务位置
  190. char task_number; //任务数
  191. axis_tasks_data_t tasks[AXIS_TASK_NUMBER]; //任务缓冲池
  192. #endif
  193. } axis_object_t;
  194. typedef struct
  195. {
  196. char index; //编号,辅助识别用,意义不大
  197. int posi; //阶段位置
  198. unsigned short speed; //该阶段期望的速度
  199. //计算变量
  200. unsigned short dst_speed_index; //目标速查表编号
  201. unsigned short reg; //该阶段速度对应的寄存器值
  202. int decposition; //减速位置
  203. } axis_stage_task_t;
  204. //硬件正极限信号
  205. #define AXIS_HW_POSITIVE_SGN(axis) axis->inputs.hw_positive_lmt
  206. //硬件负极限信号
  207. #define AXIS_HW_NEGATIVE_SGN(axis) axis->inputs.hw_negative_lmt
  208. //方向反向信号
  209. #define AXIS_REVERSE_SGN(axis) axis->inputs.dir_reverse
  210. //软件极限保护使能信号
  211. #define AXIS_SW_PROTECCT_SGN(axis) axis->inputs.sw_lmt_enable
  212. //减速信号
  213. #define AXIS_SLOW_SGN(axis) axis->inputs.hw_slow_lmt
  214. //报警信号
  215. #define AXIS_ALARM_SGN(axis) axis->inputs.alarm_sgn
  216. //回零时使能高速,当有减速信号开关时才使用
  217. #define AXIS_HOMING_HIGH_SPEED_ENABLE(axis) axis->inputs.home_high_speed_enable
  218. //是否正在回零点
  219. #define AXIS_IS_HOMING(axis) (axis->outputs.homing)
  220. //是否正在自动运行
  221. #define AXIS_IS_RUNNING(axis) (axis->outputs.on)
  222. //是否停止状态
  223. #define AXIS_IS_STOP(axis) (axis->outputs.on == 0)
  224. //是否出现错误
  225. #define AXIS_IS_ERROR(axis) (axis->outputs.error_alarm)
  226. //硬件正极限信号
  227. #define AXIS_EXCEED_HW_POSITIVE(axis) (axis->outputs.hw_positive_alarm)
  228. //硬件负极限信号
  229. #define AXIS_EXCEED_HW_NEGATIVE(axis) (axis->outputs.hw_negative_alarm)
  230. //软件正极限信号
  231. #define AXIS_EXCEED_SW_POSITIVE(axis) (axis->outputs.sw_positive_alarm)
  232. //软件负极限信号
  233. #define AXIS_EXCEED_SW_NEGATIVE(axis) (axis->outputs.sw_negative_alarm)
  234. //硬件使能信号
  235. #define AXIS_IS_ENABLE(axis) (axis->outputs.enable)
  236. //硬件清除报警信号
  237. #define AXIS_IS_ERRCLEAR(axis) (axis->outputs.error_clear)
  238. extern long axispostion;
  239. void axis_run(axis_object_t *axis);
  240. void axis_start(axis_object_t *axis);
  241. void axis_stop(axis_object_t *axis);
  242. void axis_emgstop(axis_object_t *axis);
  243. void axis_pp(axis_object_t *axis, int rel, int position, int speed,long slowpos);
  244. void axis_pv(axis_object_t *axis, int dir, int speed);
  245. void axis_pv_change_speed(axis_object_t *axis, int speed);
  246. void axis_stop_at(axis_object_t *axis, int postion);
  247. void axis_init_task(axis_object_t *axis, int dir);
  248. void axis_add_pp_task(axis_object_t *axis, int feed, int speed);
  249. void axis_start_pp_task(axis_object_t *axis);
  250. void axis_ccw(axis_object_t *axis);
  251. void axis_cw(axis_object_t *axis);
  252. void axis_home_run(axis_object_t *axis);
  253. void axis_home(axis_object_t *axis, int method, int home_speed, int find_speed);
  254. void axis_home_enable_high_speed(axis_object_t *axis, int high_speed);
  255. void axis_stop_all(axis_object_t *axis);
  256. void axis_set_ouput(axis_object_t *axis, axis_output_name type, int value);
  257. void axis_it_handle(void *handle);
  258. int axis_cw_lmt(axis_object_t *axis);
  259. int axis_ccw_lmt(axis_object_t *axis);
  260. axis_alarm_code_t axis_alarm_code(axis_object_t *axis);
  261. void axis_enable(axis_object_t *axis);
  262. void axis_disable(axis_object_t *axis);
  263. void axis_set_parameter(axis_object_t *axis, axis_paramter_t cmd, int argv);
  264. int axis_get_parameter(axis_object_t *axis, axis_paramter_t cmd);
  265. void axis_enable_software_lmt(axis_object_t *axis, int positive, int negative);
  266. void axis_disable_software_lmt(axis_object_t *axis);
  267. void axis_enable_irq_callback(axis_object_t * axis, void(*handle)());
  268. void axis_disable_irq_callback(axis_object_t * axis);
  269. void axis_pv_change_speed_table(axis_object_t *axis, int target_speed);
  270. void axis_set_accdec(axis_object_t *axis, int accdec_mode, int acc_time, int dec_time);
  271. void axis_pp_change_speed (axis_object_t *axis, int rel,
  272. int position, int target_speed,long slowpos);
  273. void axis_change_speed_direct(axis_object_t *axis, int target_speed);
  274. void axis_plus_stop(axis_object_t *axis, unsigned short num);
  275. #endif