C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE MOTOR OBJECT MODULE PLACED IN ..\Output\motor.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\Apps\motor.c LARGE OBJECTADVANCED OPTIMIZE(8,SIZE) BROWSE INCDIR(..\F -WLib\SC92F_Lib\inc;..\User;..\Apps;..\Apps;..\User) DEFINE(SC92F836xB) DEBUG PRINT(..\List\motor.lst) OBJECT(..\Output\m -otor.obj) line level source 1 #include "motor.h" 2 3 #define STEP_LIN 16 //直行程步长单位数值(脉冲数) 4 #define STEP_ROT 20 //角行程步长单位数值(脉冲数) 5 #define DATA_LEN 10 //角行程步长单位数值(脉冲数) 6 7 bit Travle_Flag = 0; //0 直 1 角 8 char xdata Motor_Run = 0; //0 停止 1 运行 2 运行到起始点 3 运行到结束点 9 char xdata Run_Mode = 0; //0 点动 1 方案一 2 方案二 10 unsigned int xdata Run_Step = 0; //电机运行步长 11 unsigned int xdata Run_Inter = 0; //电机运行间隔时长 12 unsigned int xdata Run_Stop = 0; //到“结束点”后,停止时间 13 unsigned int xdata Run_mm = 0; //行进长度(mm)/转动角度(°) 14 unsigned int xdata Run_num = 0; //角行程电机转动圈数 15 unsigned int xdata ct_num = 0; //磁条长度 16 17 bit mov_flag = 0; //脉冲标志 18 bit send_flag = 0; //发送标志 19 bit seat_flag = 0; //位置标志 20 bit motor_dire = 1; //电机转动方向 21 bit flag = 0; 22 23 24 //步骤 25 unsigned char xdata Runmotor_step = 0; 26 27 //次数 28 unsigned int xdata Runmotor_Nums = 0; 29 30 //电机启动 31 void motor_start(void) 32 { 33 1 GPIO_Init(GPIO1, GPIO_PIN_7,GPIO_MODE_OUT_PP);//脉冲引脚设置为输出模式,电机可收到脉冲信号 34 1 GPIO_WriteHigh(GPIO1,GPIO_PIN_7); 35 1 motor_data[1] = 0x01;//电机启动,对应数据01 36 1 } 37 38 //电机停止 39 void motor_stop(void) 40 { 41 1 GPIO_WriteHigh(GPIO1,GPIO_PIN_7); 42 1 GPIO_Init(GPIO1, GPIO_PIN_7,GPIO_MODE_IN_HI);//脉冲引脚设置为输入模式,电机无法收到脉冲信号 43 1 motor_data[1] = 0x00;//电机停止,对应数据00 44 1 } 45 46 //正转 47 void FWD(void) 48 { 49 1 GPIO_WriteLow(GPIO1,GPIO_PIN_6);//引脚电平置低,电机正转 50 1 } 51 52 //反转 53 void REV(void) C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 2 54 { 55 1 GPIO_WriteHigh(GPIO1,GPIO_PIN_6);//引脚电平置高,电机反转 56 1 } 57 58 59 60 //清除电机标记 61 void ClrRunmotorStep(void) 62 { 63 1 //步骤 64 1 Runmotor_step = 0; 65 1 //次数 66 1 Runmotor_Nums = 0; 67 1 //脉冲标记清0 68 1 mov_flag = 0; 69 1 //发送标记清0 70 1 send_flag = 0; 71 1 //位置标记清0 72 1 seat_flag = 0; 73 1 } 74 75 //处理马达运行 76 void Deal_Motor(void) 77 { 78 1 //判断直行程还是角行程 79 1 if(Travle_Flag == 0)//直行程——电机旋转一圈,磁条水平位移5mm 80 1 { 81 2 motor_data[0] = 0x00;//00 直行程 01 角行程 82 2 //判断电机停止还是运行,运行到起始位还是结束位 83 2 if( Motor_Run == 0)//停止 84 2 { 85 3 motor_stop(); 86 3 } 87 2 else if(Motor_Run == 1)//运行 88 2 { 89 3 if(Motor_Run >= 1 && Runmotor_step == 0) 90 3 { 91 4 Runmotor_step = 1; 92 4 } 93 3 94 3 //判断电机运行方式是点动还是连续,点动为方案三,方案一和方案二为连续 95 3 if(Run_Mode == 0)//点动(方案三) 96 3 { 97 4 motor_data[2] = 0x00;//发送时反馈的数据 98 4 mov_step();//点动 99 4 } 100 3 else if(Run_Mode == 1)//连续(方案一)“步长过大可能会越过限位开关” 101 3 { 102 4 motor_data[2] = 0x01;//发送时反馈的数据 103 4 mov_loop1();//方案一 104 4 } 105 3 else if(Run_Mode == 2)//连续(方案二)“步长过大可能会越过限位开关” 106 3 { 107 4 motor_data[2] = 0x02;//发送时反馈的数据 108 4 //磁条循环“起始点-结束点-起始点”,一定次数后停在起始点 109 4 mov_loop2();//方案二 110 4 } 111 3 else//初始化 112 3 { 113 4 motor_stop(); 114 4 } 115 3 } C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 3 116 2 else if(Motor_Run == 2)//运行到起始位 117 2 { 118 3 mov_begin();//回到起始位 119 3 } 120 2 else if(Motor_Run == 3)//运行到结束位 121 2 { 122 3 mov_end();//移动至结束位 123 3 } 124 2 else//数据错误 125 2 SC_Init(); 126 2 } 127 1 else //角行程——电机旋转一圈,磁条旋转4° 128 1 { 129 2 motor_data[0] = 0x01;//00 直行程 01 角行程 130 2 //判断电机停止还是运行,运行到起始位还是结束位 131 2 if( Motor_Run == 0)//停止 132 2 { 133 3 motor_stop(); 134 3 } 135 2 else if(Motor_Run == 1)//运行 136 2 { 137 3 if(Motor_Run >= 1 && Runmotor_step == 0) 138 3 { 139 4 Runmotor_step = 1; 140 4 } 141 3 142 3 //判断电机运行方式是点动还是连续,点动为方案三,方案一和方案二为连续 143 3 if(Run_Mode == 0)//点动(方案三) 144 3 { 145 4 motor_data[2] = 0x00;//发送时反馈的数据 146 4 mov_step_ang();//电机点动运行 147 4 } 148 3 else if(Run_Mode == 1)//连续(方案一) 149 3 { 150 4 motor_data[2] = 0x01;//发送时反馈的数据 151 4 mov_loop1_ang();//磁条旋转一圈 152 4 } 153 3 else if(Run_Mode == 2)//连续(方案二) 154 3 { 155 4 motor_data[2] = 0x02;//发送时反馈的数据 156 4 if(seat_flag == 0) 157 4 { 158 5 if(GPIO_ReadPin(GPIO1,GPIO_PIN_4) == 0) //判断是否到达限位处 159 5 { 160 6 motor_stop(); //电机停止 161 6 Run_mm = 0; 162 6 seat_flag = 1;//位置标记 163 6 } 164 5 else 165 5 { 166 6 REV(); //反转 167 6 motor_start(); //运行 168 6 motor_mov(1); //提供脉冲信号 169 6 } 170 5 } 171 4 else 172 4 { 173 5 mov_loop2_ang();//磁条旋转一圈 174 5 } 175 4 } 176 3 else//初始化 177 3 { C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 4 178 4 motor_stop(); 179 4 } 180 3 } 181 2 else if(Motor_Run == 2 || Motor_Run == 3)//运行到起始位 182 2 { 183 3 mov_begin();//回到起始位 184 3 } 185 2 else//数据错误 186 2 SC_Init(); 187 2 } 188 1 } 189 190 191 /***************************************************** 192 *函数名称: motor_mov 193 *函数功能: 电机速度控制 194 *参数说明:speed 电机速度设定值,1为最快,5为最慢 195 *****************************************************/ 196 void motor_mov(unsigned int speed) 197 { 198 1 switch(speed)//控制电机速度,设定有五档速度 199 1 { 200 2 //脉冲周期2ms 201 2 case 1: 202 2 { 203 3 if(it_1ms_flag) //检查1ms定时标志 204 3 { 205 4 it_1ms_flag = 0;//定时标志清零 206 4 if(mov_flag) 207 4 { 208 5 mov_flag = 0; 209 5 GPIO_WriteHigh(GPIO1,GPIO_PIN_7);//P1.7引脚拉高 210 5 } 211 4 else 212 4 { 213 5 mov_flag = 1; 214 5 GPIO_WriteLow(GPIO1,GPIO_PIN_7);//P1.7引脚拉低 215 5 } 216 4 Runmotor_Nums++; //运行次数 217 4 } 218 3 } 219 2 break; 220 2 //脉冲周期4ms 221 2 case 2: 222 2 { 223 3 if(it_2ms_flag)//检查2ms定时标志 224 3 { 225 4 it_2ms_flag = 0;//定时标志清零 226 4 if(mov_flag) 227 4 { 228 5 mov_flag = 0; 229 5 GPIO_WriteHigh(GPIO1,GPIO_PIN_7);//P1.7引脚拉高 230 5 } 231 4 else 232 4 { 233 5 mov_flag = 1; 234 5 GPIO_WriteLow(GPIO1,GPIO_PIN_7);//P1.7引脚拉低 235 5 } 236 4 Runmotor_Nums++; //运行次数 237 4 } 238 3 } 239 2 break; C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 5 240 2 //脉冲周期6ms 241 2 case 3: 242 2 { 243 3 if(it_3ms_flag)//检查3ms定时标志 244 3 { 245 4 it_3ms_flag = 0;//定时标志清零 246 4 if(mov_flag) 247 4 { 248 5 mov_flag = 0; 249 5 GPIO_WriteHigh(GPIO1,GPIO_PIN_7);//P1.7引脚拉高 250 5 } 251 4 else 252 4 { 253 5 mov_flag = 1; 254 5 GPIO_WriteLow(GPIO1,GPIO_PIN_7);//P1.7引脚拉低 255 5 } 256 4 Runmotor_Nums++; //运行次数 257 4 } 258 3 } 259 2 break; 260 2 //脉冲周期8ms 261 2 case 4: 262 2 { 263 3 if(it_4ms_flag)//检查4ms定时标志 264 3 { 265 4 it_4ms_flag = 0;//定时标志清零 266 4 if(mov_flag) 267 4 { 268 5 mov_flag = 0; 269 5 GPIO_WriteHigh(GPIO1,GPIO_PIN_7);//P1.7引脚拉高 270 5 } 271 4 else 272 4 { 273 5 mov_flag = 1; 274 5 GPIO_WriteLow(GPIO1,GPIO_PIN_7);//P1.7引脚拉低 275 5 } 276 4 Runmotor_Nums++; //运行次数 277 4 } 278 3 } 279 2 break; 280 2 //脉冲周期10ms 281 2 case 5: 282 2 { 283 3 if(it_5ms_flag)//检查5ms定时标志 284 3 { 285 4 it_5ms_flag = 0;//定时标志清零 286 4 if(mov_flag) 287 4 { 288 5 mov_flag = 0; 289 5 GPIO_WriteHigh(GPIO1,GPIO_PIN_7);//P1.7引脚拉高 290 5 } 291 4 else 292 4 { 293 5 mov_flag = 1; 294 5 GPIO_WriteLow(GPIO1,GPIO_PIN_7);//P1.7引脚拉低 295 5 } 296 4 Runmotor_Nums++; //运行次数 297 4 } 298 3 } 299 2 break; 300 2 default : 301 2 break; C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 6 302 2 } 303 1 } 304 305 306 307 //电机连续运行,方案一(直行程) 308 void mov_loop1(void) 309 { 310 1 if(Run_Step == 0) return;//步长不能为0 311 1 312 1 switch(Runmotor_step) 313 1 { 314 2 case 1 : //电机运行准备 315 2 { 316 3 317 3 FWD(); //正转 318 3 motor_dire = 1; 319 3 Run_mm = 0; 320 3 Run_num = 0; 321 3 motor_data[2] = 0x00; //发送时反馈的数据 322 3 Runmotor_Nums = 0; //运行次数 323 3 mov_flag = 0; 324 3 Runmotor_step++; 325 3 } 326 2 break; 327 2 case 2 : //电机运行过程 328 2 { 329 3 if(GPIO_ReadPin(GPIO0,GPIO_PIN_5) == 0) //光栅信号判断 330 3 { 331 4 if(it_1s_flag) //检查1ms定时标志 332 4 { 333 5 it_1s_flag = 0;//定时标志清零 334 5 Runmotor_Nums++; 335 5 } 336 4 if(Runmotor_Nums >= Run_Stop)//时间 337 4 { 338 5 Runmotor_step++; 339 5 motor_data[8] = ((Run_mm * Run_Step) & 0xff00) >> 8;//磁条长度高8位 340 5 motor_data[9] = (Run_mm * Run_Step) & 0x00ff; //磁条长度低8位 341 5 motor_seat(); //读取电机当前位置 342 5 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 343 5 } 344 4 } 345 3 else 346 3 { 347 4 if(send_flag == 0) 348 4 { 349 5 send_flag = 1; 350 5 motor_seat();//读取电机当前位置 351 5 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 352 5 } 353 4 motor_start(); //运行 354 4 motor_mov(1); //运行1个脉冲 355 4 Run_mm = 1; //磁条移动距离清0 356 4 Runmotor_Nums = 0; //计数清零 357 4 Runmotor_step = 6; 358 4 } 359 3 } 360 2 break; 361 2 case 3 : //延时 362 2 { 363 3 if(motor_dire == 1) C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 7 364 3 { 365 4 motor_start(); //运行 366 4 motor_mov(1); //运行1个脉冲 367 4 if(Runmotor_Nums >= (Run_Step * STEP_LIN))//运行一个步长,脉冲数由驱动器的细分数决定 368 4 { 369 5 Runmotor_Nums = 0; //计数清零 370 5 motor_stop(); //马达停止 371 5 motor_data[1] = 0x01; //电机启动,对应数据01 372 5 motor_data[3] = 0x03; //电机方向——始终 373 5 Run_mm++; //磁条移动距离加1 374 5 ct_num = Run_mm; //磁条长度 375 5 motor_data[8] = ((Run_mm * Run_Step) & 0xff00) >> 8;//磁条长度高8位 376 5 motor_data[9] = (Run_mm * Run_Step) & 0x00ff; //磁条长度低8位 377 5 Runmotor_step++; 378 5 } 379 4 } 380 3 else 381 3 { 382 4 motor_start(); //运行 383 4 motor_mov(1); //运行1个脉冲 384 4 if(Runmotor_Nums >= (Run_Step * STEP_LIN))//运行一个步长,脉冲数由驱动器的细分数决定 385 4 { 386 5 Runmotor_Nums = 0; //计数清零 387 5 motor_stop(); //马达停止 388 5 motor_data[1] = 0x01; //电机启动,对应数据01 389 5 motor_data[3] = 0x04; //电机方向——终始 390 5 ct_num = ct_num - 1; //磁条长度 391 5 Run_mm = ct_num; //磁条移动距离减1 392 5 motor_data[8] = ((Run_mm * Run_Step) & 0xff00) >> 8;//磁条长度高8位 393 5 motor_data[9] = (Run_mm * Run_Step) & 0x00ff; //磁条长度低8位 394 5 Runmotor_step++; 395 5 } 396 4 } 397 3 } 398 2 break; 399 2 case 4 : //延时 400 2 { 401 3 if(it_1ms_flag) //检查1ms定时标志 402 3 { 403 4 it_1ms_flag = 0;//定时标志清零 404 4 Runmotor_Nums++; 405 4 } 406 3 if(Runmotor_Nums >= Run_Inter)//时间 407 3 { 408 4 409 4 Runmotor_Nums = 0; 410 4 Runmotor_step++; 411 4 send_flag = 0; 412 4 //motor_seat(); //读取电机当前位置 413 4 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 414 4 } 415 3 416 3 } 417 2 break; 418 2 case 5 : 419 2 { 420 3 if(GPIO_ReadPin(GPIO0,GPIO_PIN_5) == 1 )//光栅信号判断 421 3 { 422 4 if(flag == 0) 423 4 { 424 5 Runmotor_Nums = 0; 425 5 Runmotor_step = 3; C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 8 426 5 if(motor_dire == 1) 427 5 { 428 6 REV(); 429 6 flag = 1; 430 6 motor_dire = 0; 431 6 } 432 5 else 433 5 { 434 6 Motor_Run = 2; //运行标记改变,电机回到初始位 435 6 } 436 5 } 437 4 else 438 4 { 439 5 Runmotor_step = 3; 440 5 } 441 4 } 442 3 else 443 3 { 444 4 Runmotor_step = 3; 445 4 flag = 0 ; 446 4 } 447 3 } 448 2 break; 449 2 case 6 : 450 2 { 451 3 if(GPIO_ReadPin(GPIO1,GPIO_PIN_4) == 0)//起始点限位 452 3 { 453 4 FWD();//正转 454 4 motor_dire = 1;//电机转动方向 455 4 } 456 3 if(GPIO_ReadPin(GPIO1,GPIO_PIN_5) == 0)//结束点限位 457 3 { 458 4 REV();//反转 459 4 motor_dire = 0;//电机转动方向 460 4 } 461 3 Runmotor_step = 2; 462 3 } 463 2 break; 464 2 default : 465 2 { 466 3 467 3 } 468 2 break; 469 2 } 470 1 } 471 472 //电机连续运行,方案一(角行程) 473 void mov_loop1_ang(void) 474 { 475 1 if(Run_Step == 0) return;//步长不能为0 476 1 477 1 switch(Runmotor_step) 478 1 { 479 2 case 1 : //电机运行准备 480 2 { 481 3 FWD();//正转 482 3 motor_dire = 1; 483 3 motor_data[2] = 0x00;//发送时反馈的数据 484 3 Runmotor_Nums = 0; //运行次数 485 3 mov_flag = 0; 486 3 Run_mm = 0; 487 3 Run_num = 0; C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 9 488 3 Runmotor_step++; 489 3 } 490 2 break; 491 2 case 2 : //电机运行过程 492 2 { 493 3 if(motor_dire == 1) 494 3 { 495 4 FWD();//正转 496 4 motor_start(); //运行 497 4 motor_mov(1); //运行1个脉冲 498 4 if(Runmotor_Nums >= (Run_Step * STEP_ROT))//运行一个步长,脉冲数由驱动器的细分数决定 499 4 { 500 5 Runmotor_Nums = 0; //计数清零 501 5 motor_stop(); //马达停止 502 5 motor_data[1] = 0x01; //电机启动,对应数据01 503 5 motor_data[3] = 0x03; //电机方向——始终 504 5 Run_mm++; //磁条移动距离加1 505 5 Run_num = Run_mm * Run_Step; 506 5 motor_data[8] = (Run_num & 0xff00) >> 8;//磁条长度高8位 507 5 motor_data[9] = Run_num & 0x00ff; //磁条长度低8位 508 5 Runmotor_step++; 509 5 } 510 4 } 511 3 else 512 3 { 513 4 REV();//反转 514 4 motor_start(); //运行 515 4 motor_mov(1); //运行1个脉冲 516 4 if(Runmotor_Nums >= (Run_Step * STEP_ROT))//运行一个步长,脉冲数由驱动器的细分数决定 517 4 { 518 5 Runmotor_Nums = 0; //计数清零 519 5 motor_stop(); //马达停止 520 5 motor_data[1] = 0x01; //电机启动,对应数据01 521 5 motor_data[3] = 0x04; //电机方向——终始 522 5 Run_mm--; //磁条移动距离减1 523 5 Run_num = Run_mm * Run_Step; 524 5 motor_data[8] = (Run_num & 0xff00) >> 8;//磁条长度高8位 525 5 motor_data[9] = Run_num & 0x00ff; //磁条长度低8位 526 5 Runmotor_step++; 527 5 } 528 4 } 529 3 } 530 2 break; 531 2 case 3 : //延时 532 2 { 533 3 if(it_1ms_flag) //检查1ms定时标志 534 3 { 535 4 it_1ms_flag = 0;//定时标志清零 536 4 Runmotor_Nums++; 537 4 } 538 3 if(Runmotor_Nums >= Run_Inter)//时间 539 3 { 540 4 Runmotor_Nums = 0; 541 4 Runmotor_step++; 542 4 //motor_seat(); //读取电机当前位置 543 4 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 544 4 } 545 3 } 546 2 break; 547 2 case 4 : 548 2 { 549 3 if(Run_num >= Run_Stop * 10&& motor_dire == 1)//判断磁条是否转动设定的角度 C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 10 550 3 { 551 4 motor_dire = 0; 552 4 Runmotor_step = 2; 553 4 } 554 3 else if(Run_num <= 0 && motor_dire == 0) 555 3 { 556 4 //motor_dire = 1; 557 4 Motor_Run = 1; 558 4 } 559 3 else 560 3 { 561 4 Runmotor_step = 2; 562 4 } 563 3 } 564 2 break; 565 2 default : 566 2 { 567 3 568 3 } 569 2 break; 570 2 } 571 1 } 572 573 574 //电机连续运行,方案二(直行程) 575 void mov_loop2(void) 576 { 577 1 if(Run_Step == 0) return;//步长不能为0 578 1 579 1 switch(Runmotor_step) 580 1 { 581 2 case 1 : //电机运行准备 582 2 { 583 3 584 3 FWD();//正转 585 3 motor_dire = 1; 586 3 motor_data[2] = 0x00;//发送时反馈的数据 587 3 Runmotor_Nums = 0; //运行次数 588 3 mov_flag = 0; // 589 3 Runmotor_step++; 590 3 } 591 2 break; 592 2 case 2 : //电机运行过程 593 2 { 594 3 if(GPIO_ReadPin(GPIO0,GPIO_PIN_5) == 0)//光栅信号判断 595 3 { 596 4 597 4 if(it_1s_flag) //检查1ms定时标志 598 4 { 599 5 it_1s_flag = 0;//定时标志清零 600 5 Runmotor_Nums++; 601 5 } 602 4 if(Runmotor_Nums >= Run_Stop)//时间 603 4 { 604 5 Runmotor_step++; 605 5 motor_data[8] = ((Run_mm * Run_Step) & 0xff00) >> 8;//磁条长度高8位 606 5 motor_data[9] = (Run_mm * Run_Step) & 0x00ff; //磁条长度低8位 607 5 motor_seat(); //读取电机当前位置 608 5 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 609 5 }//Run_mm = 1; //磁条移动距离置1 610 4 611 4 } C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 11 612 3 else 613 3 { 614 4 if(send_flag == 0) 615 4 { 616 5 send_flag = 1; 617 5 motor_seat();//读取电机当前位置 618 5 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 619 5 } 620 4 motor_start(); //运行 621 4 motor_mov(1); //运行1个脉冲 622 4 Run_mm = 1; //磁条移动距离清0 623 4 Runmotor_Nums = 0; //计数清零 624 4 Runmotor_step = 6; 625 4 } 626 3 } 627 2 break; 628 2 case 3 : //延时 629 2 { 630 3 if(motor_dire == 1) 631 3 { 632 4 motor_start(); //运行 633 4 motor_mov(1); //运行1个脉冲 634 4 if(Runmotor_Nums >= (Run_Step * STEP_LIN))//运行一个步长,脉冲数由驱动器的细分数决定 635 4 { 636 5 Runmotor_Nums = 0; //计数清零 637 5 motor_stop(); //马达停止 638 5 motor_data[1] = 0x01; //电机启动,对应数据01 639 5 motor_data[3] = 0x03; //电机方向——始终 640 5 Run_mm++; //磁条移动距离加1 641 5 ct_num = Run_mm; //磁条长度 642 5 motor_data[8] = ((Run_mm * Run_Step) & 0xff00) >> 8;//磁条长度高8位 643 5 motor_data[9] = (Run_mm * Run_Step) & 0x00ff; //磁条长度低8位 644 5 Runmotor_step++; 645 5 } 646 4 } 647 3 else 648 3 { 649 4 motor_start(); //运行 650 4 motor_mov(1); //运行1个脉冲 651 4 if(Runmotor_Nums >= (Run_Step * STEP_LIN))//运行一个步长,脉冲数由驱动器的细分数决定 652 4 { 653 5 Runmotor_Nums = 0; //计数清零 654 5 motor_stop(); //马达停止 655 5 motor_data[1] = 0x01; //电机启动,对应数据01 656 5 motor_data[3] = 0x04; //电机方向——终始 657 5 ct_num = ct_num - 1; //磁条长度 658 5 Run_mm = ct_num; //磁条移动距离减1 659 5 motor_data[8] = ((Run_mm * Run_Step) & 0xff00) >> 8;//磁条长度高8位 660 5 motor_data[9] = (Run_mm * Run_Step) & 0x00ff; //磁条长度低8位 661 5 Runmotor_step++; 662 5 } 663 4 } 664 3 } 665 2 break; 666 2 case 4 : //延时 667 2 { 668 3 if(it_1ms_flag) //检查1ms定时标志 669 3 { 670 4 it_1ms_flag = 0;//定时标志清零 671 4 Runmotor_Nums++; 672 4 } 673 3 if(Runmotor_Nums >= Run_Inter)//时间 C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 12 674 3 { 675 4 676 4 Runmotor_Nums = 0; 677 4 Runmotor_step++; 678 4 send_flag = 0; 679 4 //motor_seat(); //读取电机当前位置 680 4 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 681 4 } 682 3 683 3 } 684 2 break; 685 2 case 5 : 686 2 { 687 3 if(GPIO_ReadPin(GPIO0,GPIO_PIN_5) == 1 )//光栅信号判断 688 3 { 689 4 if(flag == 0) 690 4 { 691 5 Runmotor_Nums = 0; 692 5 Runmotor_step = 3; 693 5 if(motor_dire == 1) 694 5 { 695 6 REV(); 696 6 flag = 1; 697 6 motor_dire = 0; 698 6 } 699 5 else 700 5 { 701 6 FWD(); 702 6 flag = 1; 703 6 motor_dire = 1; 704 6 } 705 5 } 706 4 else 707 4 { 708 5 Runmotor_step = 3; 709 5 } 710 4 } 711 3 else 712 3 { 713 4 Runmotor_step = 3; 714 4 flag = 0 ; 715 4 } 716 3 } 717 2 break; 718 2 case 6 : 719 2 { 720 3 if(GPIO_ReadPin(GPIO1,GPIO_PIN_4) == 0)//起始点限位 721 3 { 722 4 FWD();//正转 723 4 motor_dire = 1;//电机转动方向 724 4 } 725 3 if(GPIO_ReadPin(GPIO1,GPIO_PIN_5) == 0)//结束点限位 726 3 { 727 4 REV();//反转 728 4 motor_dire = 0;//电机转动方向 729 4 } 730 3 Runmotor_step = 2; 731 3 } 732 2 break; 733 2 734 2 default : 735 2 { C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 13 736 3 737 3 } 738 2 break; 739 2 } 740 1 } 741 742 //电机连续运行,方案二(角行程) 743 void mov_loop2_ang(void) 744 { 745 1 if(Run_Step == 0) return;//步长不能为0 746 1 747 1 switch(Runmotor_step) 748 1 { 749 2 case 1 : //电机运行准备 750 2 { 751 3 FWD();//正转 752 3 motor_dire = 1; 753 3 motor_data[2] = 0x00;//发送时反馈的数据 754 3 Runmotor_Nums = 0; //运行次数 755 3 mov_flag = 0; 756 3 Runmotor_step++; 757 3 } 758 2 break; 759 2 case 2 : //电机运行过程 760 2 { 761 3 if(motor_dire == 1) 762 3 { 763 4 FWD();//正转 764 4 motor_start(); //运行 765 4 motor_mov(1); //运行1个脉冲 766 4 if(Runmotor_Nums >= (Run_Step * STEP_ROT))//运行一个步长,脉冲数由驱动器的细分数决定 767 4 { 768 5 Runmotor_Nums = 0; //计数清零 769 5 motor_stop(); //马达停止 770 5 motor_data[1] = 0x01; //电机启动,对应数据01 771 5 motor_data[3] = 0x03; //电机方向——始终 772 5 Run_mm++; //磁条移动距离加1 773 5 Run_num = Run_mm * Run_Step; 774 5 motor_data[8] = (Run_num & 0xff00) >> 8;//磁条长度高8位 775 5 motor_data[9] = Run_num & 0x00ff; //磁条长度低8位 776 5 Runmotor_step++; 777 5 } 778 4 } 779 3 else 780 3 { 781 4 REV();//反转 782 4 motor_start(); //运行 783 4 motor_mov(1); //运行1个脉冲 784 4 if(Runmotor_Nums >= (Run_Step * STEP_ROT))//运行一个步长,脉冲数由驱动器的细分数决定 785 4 { 786 5 Runmotor_Nums = 0; //计数清零 787 5 motor_stop(); //马达停止 788 5 motor_data[1] = 0x01; //电机启动,对应数据01 789 5 motor_data[3] = 0x04; //电机方向——终始 790 5 Run_mm--; //磁条移动距离减1 791 5 Run_num = Run_mm * Run_Step; 792 5 motor_data[8] = (Run_num & 0xff00) >> 8;//磁条长度高8位 793 5 motor_data[9] = Run_num & 0x00ff; //磁条长度低8位 794 5 Runmotor_step++; 795 5 } 796 4 } 797 3 } C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 14 798 2 break; 799 2 case 3 : //延时 800 2 { 801 3 if(it_1ms_flag) //检查1ms定时标志 802 3 { 803 4 it_1ms_flag = 0;//定时标志清零 804 4 Runmotor_Nums++; 805 4 } 806 3 if(Runmotor_Nums >= Run_Inter)//时间 807 3 { 808 4 Runmotor_Nums = 0; 809 4 Runmotor_step++; 810 4 //motor_seat(); //读取电机当前位置 811 4 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 812 4 } 813 3 } 814 2 break; 815 2 case 4 : 816 2 { 817 3 if(Run_num >= Run_Stop * 10)//判断磁条是否转动设定的角度 818 3 { 819 4 motor_dire = 0; 820 4 Runmotor_step = 2; 821 4 } 822 3 else if(Run_num <= 0) 823 3 { 824 4 motor_dire = 1; 825 4 Runmotor_step = 2; 826 4 } 827 3 else 828 3 { 829 4 Runmotor_step = 2; 830 4 } 831 3 } 832 2 break; 833 2 default : 834 2 { 835 3 836 3 } 837 2 break; 838 2 } 839 1 } 840 841 //电机点动运行,方案三(直行程) 842 void mov_step(void) 843 { 844 1 if(Run_Step == 0) return;//步长不能为0 845 1 846 1 switch(Runmotor_step) 847 1 { 848 2 case 1 : //电机运行准备 849 2 { 850 3 motor_start(); //运行 851 3 if(GPIO_ReadPin(GPIO1,GPIO_PIN_4) == 0)//判断是否到达始限位 852 3 FWD(); //正转 853 3 if(GPIO_ReadPin(GPIO1,GPIO_PIN_5) == 0)//判断是否到达终限位 854 3 REV(); //反转 855 3 Runmotor_Nums = 0; //运行次数 856 3 mov_flag = 0; 857 3 Runmotor_step++; 858 3 } 859 2 break; C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 15 860 2 case 2 : //电机运行过程 861 2 { 862 3 motor_mov(1);//运行1个脉冲 863 3 if(Runmotor_Nums >= (Run_Step * STEP_LIN))//运行一个步长,脉冲数由驱动器的细分数决定 864 3 { 865 4 Runmotor_Nums = 0; 866 4 motor_stop(); //马达停止 867 4 Runmotor_step++; 868 4 Run_mm++; //磁条移动距离加1 869 4 Run_num = Run_mm * Run_Step; 870 4 motor_data[8] = (Run_num & 0xff00) >> 8;//磁条长度高8位 871 4 motor_data[9] = Run_num & 0x00ff; //磁条长度低8位 872 4 // motor_seat(); //读取电机当前位置 873 4 // send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 874 4 } 875 3 } 876 2 break; 877 2 case 3 : 878 2 { 879 3 if(it_1ms_flag) //检查1ms定时标志 880 3 { 881 4 it_1ms_flag = 0;//定时标志清零 882 4 Runmotor_Nums++; 883 4 } 884 3 if(Runmotor_Nums >= 50)//时间 885 3 { 886 4 Runmotor_Nums = 0; 887 4 Runmotor_step++; 888 4 motor_seat(); //读取电机当前位置 889 4 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 890 4 } 891 3 } 892 2 break; 893 2 case 4 : 894 2 { 895 3 Runmotor_step = 0; 896 3 Motor_Run = 0; //运行标记清除 897 3 } 898 2 break; 899 2 default : 900 2 { 901 3 902 3 } 903 2 break; 904 2 } 905 1 } 906 907 //电机点动运行,方案三(角行程) 908 void mov_step_ang(void) 909 { 910 1 if(Run_Step == 0) return;//步长不能为0 911 1 912 1 switch(Runmotor_step) 913 1 { 914 2 case 1 : //电机运行准备 915 2 { 916 3 motor_start(); //运行 917 3 FWD(); //正转 918 3 Runmotor_Nums = 0; //运行次数 919 3 mov_flag = 0; 920 3 Runmotor_step++; 921 3 } C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 16 922 2 break; 923 2 case 2 : //电机运行过程 924 2 { 925 3 motor_mov(1);//运行1个脉冲 926 3 if(Runmotor_Nums >= (Run_Step * STEP_ROT))//运行一个步长,脉冲数由驱动器的细分数决定 927 3 { 928 4 Runmotor_Nums = 0; 929 4 motor_stop(); //马达停止 930 4 Run_mm++; //磁条移动距离加1 931 4 Run_num = Run_mm * Run_Step; 932 4 motor_data[8] = (Run_num & 0xff00) >> 8;//磁条长度高8位 933 4 motor_data[9] = Run_num & 0x00ff; //磁条长度低8位 934 4 motor_seat(); //读取电机当前位置 935 4 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 936 4 Runmotor_step++; 937 4 } 938 3 } 939 2 break; 940 2 case 3 : 941 2 { 942 3 Runmotor_step = 0; 943 3 Motor_Run = 0; //运行标记清除 944 3 if(Run_num >= 3600) //判断磁条是否转动一圈 945 3 Run_mm = 0; 946 3 } 947 2 break; 948 2 default : 949 2 { 950 3 951 3 } 952 2 break; 953 2 } 954 1 } 955 956 //电机回到起始位 957 void mov_begin(void) 958 { 959 1 motor_data[1] = 0x02; //电机运行到起始位,对应数据02 960 1 motor_data[8] = 0x00; //磁条长度高8位 961 1 motor_data[9] = 0x00; //磁条长度低8位 962 1 REV(); //电机反转 963 1 motor_start(); //电机启动 964 1 if(GPIO_ReadPin(GPIO1,GPIO_PIN_4) == 0) //判断是否到达限位处 965 1 { 966 2 motor_stop(); //电机停止 967 2 Run_mm = 0; 968 2 Run_num = 0; 969 2 if(send_flag == 1) 970 2 { 971 3 send_flag = 0; 972 3 motor_seat(); //读取电机当前位置 973 3 send_set_resp(0xF001, OBJ_DEVICE_ADDR, DATA_LEN, motor_data);//数据发送 974 3 } 975 2 } 976 1 else 977 1 motor_mov(1); //提供脉冲 978 1 } 979 980 //电机回到结束位 981 void mov_end(void) 982 { 983 1 motor_data[1] = 0x03; //电机运行到结束位,对应数据03 C51 COMPILER V9.59.0.0 MOTOR 01/18/2024 10:03:10 PAGE 17 984 1 FWD(); //电机反转 985 1 motor_start(); //电机启动 986 1 //Run_mm = 0; 987 1 if(GPIO_ReadPin(GPIO1,GPIO_PIN_5) == 0)//判断是否到达限位处 988 1 motor_stop(); //电机停止 989 1 else 990 1 motor_mov(1); //提供脉冲 991 1 } 992 993 //电机位置判断 994 void motor_seat(void) 995 { 996 1 if(GPIO_ReadPin(GPIO1,GPIO_PIN_4) == 0) //磁条处于起始点限位开关处 997 1 motor_data[3] = 0x01; //发送时反馈的数据 998 1 else if(GPIO_ReadPin(GPIO1,GPIO_PIN_5) == 0)//磁条处于结束点限位开关处 999 1 motor_data[3] = 0x02; //发送时反馈的数据 1000 1 else if(GPIO_ReadPin(GPIO0,GPIO_PIN_5) == 0)//磁条正通过光栅 1001 1 motor_data[3] = 0x03; //发送时反馈的数据 1002 1 else //无状态 1003 1 motor_data[3] = 0x00; //发送时反馈的数据 1004 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 3818 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 17 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = 6 ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)