#include "elemachinery.h" //#include "stm32f4xx_hal.h" typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8; #define Poutup(n) GPIO_SetBits(GPIOC, n) //输出 #define Poutdown(n) GPIO_ResetBits(GPIOC, n) //输出 u32 lcd_key; char if_mobilemotor_rotate = 0; // 推拉移动电机是否旋转 旋转为1 不旋转为0 char if_rotatingmotor_rotate = 1; // 旋转采集电机是否旋转 旋转为1 不旋转为0 char mobile_configure = 0; // 推拉移动电机是否怕配置参数 0为未配置参数 1为配置参数 char rotating_configure = 0; // 旋转采集电机是否怕配置参数 0为未配置参数 1为配置参数 char step; enum process_stage{ CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION, // 找零阶段向右移动 CHANGE_STAGE_TO_LEFT_LIMIT_POSITION, // 找零阶段向左移 CLOESE_THE_LID, // 关盖阶段 左移压紧 FIND_THE_RIGHT_LIMIT_POSITION, // 找右线位阶段 FAILD_FIND, // 没有找到试剂 TESTING_SAMPLES, // 检测阶段 FIND_THE_LEFT_LIMIT_POSITION, //找右线位阶段 MOTOR_STOP //电机停止状态 }; enum rotating_stage{ GIVE_CHANGE, // 找零阶段 ROTATE, // 电机旋转 RO_MOTOR_STOP, // 找零阶段向左移 FIND_READ_FROM_CHANGE // 从零点到红色 }; enum motor_movement_direction{ MOVE_LEFT, // 向左移动 MOVE_RIGHT // 向右移动 }; enum motor_movement_direction motor_move = MOVE_LEFT; enum process_stage pro_stage = CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION; // 电机启动 进入找零阶段 enum rotating_stage rot_stage = RO_MOTOR_STOP; void TMC2240_CS_LOW(){ Poutdown(GPIO_Pin_4); Poutdown(GPIO_Pin_1); #if 0 if(step == 1){ Poutdown(4); } else{ Poutdown(1); } #endif } void TMC2240_CS_HIGH(){ Poutup(GPIO_Pin_4);Poutup(GPIO_Pin_1); } // 向TMC2240写入数据 void tmc2240_write(uint8_t address, uint8_t data) { // 先发送地址 spi1_read_write_byte(address); // 再发送数据 spi1_read_write_byte(data); } // TMC2240寄存器写操作(地址+32位数据) void TMC2240_WriteReg(uint8_t addr, uint32_t data) { TMC2240_CS_LOW(); spi1_read_write_byte(addr | 0x80); // 写命令(bit7=1)?:ml-citation{ref="1" data="citationList"} spi1_read_write_byte((data >> 24) & 0xFF); spi1_read_write_byte((data >> 16) & 0xFF); spi1_read_write_byte((data >> 8) & 0xFF); spi1_read_write_byte(data & 0xFF); // SoftSPI_TransferByte(addr | 0x80); // 写命令(bit7=1)?:ml-citation{ref="1" data="citationList"} // SoftSPI_TransferByte((data >> 24) & 0xFF); // SoftSPI_TransferByte((data >> 16) & 0xFF); // SoftSPI_TransferByte((data >> 8) & 0xFF); // SoftSPI_TransferByte(data & 0xFF); TMC2240_CS_HIGH(); } // TMC2240寄存器读操作 uint32_t TMC2240_ReadReg(uint8_t addr) { uint32_t data = 0; TMC2240_CS_LOW(); spi1_read_write_byte(addr & 0x7F); // 读命令(bit7=0)?:ml-citation{ref="1" data="citationList"} data = (uint32_t)spi1_read_write_byte(0xFF) << 24; data |= (uint32_t)spi1_read_write_byte(0xFF) << 16; data |= (uint32_t)spi1_read_write_byte(0xFF) << 8; data |= spi1_read_write_byte(0xFF); // SoftSPI_TransferByte(addr & 0x7F); // 读命令(bit7=0)?:ml-citation{ref="1" data="citationList"} // data = (uint32_t)SoftSPI_TransferByte(0xFF) << 24; // data |= (uint32_t)SoftSPI_TransferByte(0xFF) << 16; // data |= (uint32_t)SoftSPI_TransferByte(0xFF) << 8; // data |= SoftSPI_TransferByte(0xFF); TMC2240_CS_HIGH(); return data; } // direct_mode (Bit 16) void TMC2240_SetDirectMode(uint8_t value, uint32_t *gconf) { if (value > 1) return; // 允许值0或1 *gconf = (*gconf & ~(1 << 16)) | ((value & 0x01) << 16); TMC2240_WriteReg(0x00, *gconf); } // stop_enable (Bit 15) void TMC2240_SetStopEnable(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 15)) | ((value & 0x01) << 15); TMC2240_WriteReg(0x00, *gconf); } // small_hysteresis (Bit 14) void TMC2240_SetSmallHysteresis(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 14)) | ((value & 0x01) << 14); TMC2240_WriteReg(0x00, *gconf); } // diag1_pushpull (Bit 13) void TMC2240_SetDiag1PushPull(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 13)) | ((value & 0x01) << 13); TMC2240_WriteReg(0x00, *gconf); } // diag0_pushpull (Bit 12) void TMC2240_SetDiag0PushPull(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 12)) | ((value & 0x01) << 12); TMC2240_WriteReg(0x00, *gconf); } // diag1_onstate (Bit 10) void TMC2240_SetDiag1OnState(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 10)) | ((value & 0x01) << 10); TMC2240_WriteReg(0x00, *gconf); } // diag1_index (Bit 9) void TMC2240_SetDiag1Index(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 9)) | ((value & 0x01) << 9); TMC2240_WriteReg(0x00, *gconf); } // diag1_stall (Bit 8) void TMC2240_SetDiag1Stall(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 8)) | ((value & 0x01) << 8); TMC2240_WriteReg(0x00, *gconf); } // diag0_stall (Bit 7) void TMC2240_SetDiag0Stall(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 7)) | ((value & 0x01) << 7); TMC2240_WriteReg(0x00, *gconf); } // diag0_otpw (Bit 6) void TMC2240_SetDiag0Otpw(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 6)) | ((value & 0x01) << 6); TMC2240_WriteReg(0x00, *gconf); } // diag0_error (Bit 5) void TMC2240_SetDiag0Error(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 5)) | ((value & 0x01) << 5); TMC2240_WriteReg(0x00, *gconf); } // shaft (Bit 4) void TMC2240_SetShaft(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 4)) | ((value & 0x01) << 4); TMC2240_WriteReg(0x00, *gconf); } // multistep_filt (Bit 3) void TMC2240_SetMultistepFilt(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 3)) | ((value & 0x01) << 3); TMC2240_WriteReg(0x00, *gconf); } // en_pwm_mode (Bit 2) void TMC2240_SetEnPwmMode(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 2)) | ((value & 0x01) << 2); TMC2240_WriteReg(0x00, *gconf); } // fast_standstill (Bit 1) void TMC2240_SetFastStandstill(uint8_t value, uint32_t *gconf) { if (value > 1) return; *gconf = (*gconf & ~(1 << 1)) | ((value & 0x01) << 1); TMC2240_WriteReg(0x00, *gconf); } void set_GCONF(uint8_t field_selector, uint8_t param_value, uint32_t *gconf) { switch(field_selector) { case 0x00: TMC2240_SetDirectMode(param_value, gconf); break; case 0x01: TMC2240_SetStopEnable(param_value, gconf); break; case 0x02: TMC2240_SetSmallHysteresis(param_value, gconf); break; case 0x03: TMC2240_SetDiag1PushPull(param_value, gconf); break; case 0x04: TMC2240_SetDiag0PushPull(param_value, gconf); break; case 0x05: TMC2240_SetDiag1OnState(param_value, gconf); break; case 0x06: TMC2240_SetDiag1Index(param_value, gconf); break; case 0x07: TMC2240_SetDiag1Stall(param_value, gconf); break; case 0x08: TMC2240_SetDiag0Stall(param_value, gconf); break; case 0x09: TMC2240_SetDiag0Otpw(param_value, gconf); break; case 0x0A: TMC2240_SetDiag0Error(param_value, gconf); break; case 0x0B: TMC2240_SetShaft(param_value, gconf); break; case 0x0C: TMC2240_SetMultistepFilt(param_value, gconf); break; case 0x0D: TMC2240_SetEnPwmMode(param_value, gconf); break; case 0x0E: TMC2240_SetFastStandstill(param_value, gconf); break; default: // 可添加错误处理(如打印无效选择器) break; } } // IRUNDELAY (Bits 27:24) void TMC2240_SetIRunDelay(uint8_t value, uint32_t *current_config) { if (value > 15) return; // 错误:超出范围(0-15) *current_config = (*current_config & 0xF0FFFFFF) | ((value & 0x0F) << 24); TMC2240_WriteReg(0x10, *current_config); } // IHOLDDELAY (Bits 19:16) void TMC2240_SetIHoldDelay(uint8_t value, uint32_t *current_config) { if (value > 15) return; *current_config = (*current_config & 0xFFF0FFFF) | ((value & 0x0F) << 16); TMC2240_WriteReg(0x10, *current_config); } // IRUN (Bits 12:8) void TMC2240_SetIRun(uint8_t value, uint32_t *current_config) { if (value > 31) return; // 错误:超出范围(0-31) *current_config = (*current_config & 0xFFFFE0FF) | ((value & 0x1F) << 8); TMC2240_WriteReg(0x10, *current_config); } // IHOLD (Bits 4:0) void TMC2240_SetIHold(uint8_t value, uint32_t *current_config) { if (value > 31) return; *current_config = (*current_config & 0xFFFFFFE0) | (value & 0x1F); TMC2240_WriteReg(0x10, *current_config); } // CHOPCONF寄存器配置(0x6C) void set_IHOLD_IRUN(uint8_t field_selector, uint8_t param_value, uint32_t *current_config) { switch(field_selector) { case 0x00: // IHOLD (0-31) TMC2240_SetIHold(param_value, current_config); break; case 0x01: // IRUN (0-31) TMC2240_SetIRun(param_value, current_config); break; case 0x02: // IHOLDDELAY (0-15) TMC2240_SetIHoldDelay(param_value, current_config); break; case 0x03: // IRUNDELAY (0-15) TMC2240_SetIRunDelay(param_value, current_config); break; default: // 可添加错误处理(如日志输出) break; } } // 设置TOFF(位0-3) void TMC2240_SetTOFF(uint8_t toff_value, uint32_t *chopconf) { if (toff_value > 15) return; // 错误:超出范围 *chopconf = (*chopconf & 0xFFFFFFF0) | (toff_value & 0x0F); TMC2240_WriteReg(0x6C, *chopconf); } // 设置HSTRT(位4-6) void TMC2240_SetHSTRT(uint8_t hstrt_value, uint32_t *chopconf) { if (hstrt_value > 7) return; // 错误:超出范围 *chopconf = (*chopconf & 0xFFFFF8FF) | ((hstrt_value & 0x07) << 4); TMC2240_WriteReg(0x6C, *chopconf); } // 设置HEND(位7-10) void TMC2240_SetHEND(uint8_t hend_value, uint32_t *chopconf) { if (hend_value > 15) return; // 错误:超出范围 *chopconf = (*chopconf & 0xFFFFF0FF) | ((hend_value & 0x0F) << 7); TMC2240_WriteReg(0x6C, *chopconf); } // 设置FD3(位11) void TMC2240_SetFD3(uint8_t enable, uint32_t *chopconf) { enable = (enable != 0) ? 1 : 0; // 强制转换为0或1 *chopconf = (*chopconf & 0xFFFFF7FF) | (enable << 11); TMC2240_WriteReg(0x6C, *chopconf); } // 设置DISFDCC(位12) void TMC2240_SetDISFDCC(uint8_t enable, uint32_t *chopconf) { enable = (enable != 0) ? 1 : 0; *chopconf = (*chopconf & 0xFFFFEFFF) | (enable << 12); TMC2240_WriteReg(0x6C, *chopconf); } // 设置RNDTF(位13) void TMC2240_SetRNDTF(uint8_t enable, uint32_t *chopconf) { enable = (enable != 0) ? 1 : 0; *chopconf = (*chopconf & 0xFFFFDFFF) | (enable << 13); TMC2240_WriteReg(0x6C, *chopconf); } // 设置CHM模式(位14) void TMC2240_SetCHM(uint8_t enable, uint32_t *chopconf) { enable = (enable != 0) ? 1 : 0; *chopconf = (*chopconf & 0xFFFFBFFF) | (enable << 14); TMC2240_WriteReg(0x6C, *chopconf); } // 设置TBL(位15-16) void TMC2240_SetTBL(uint8_t tbl_value, uint32_t *chopconf) { if (tbl_value > 3) return; // 错误:超出范围 *chopconf = (*chopconf & 0xFFF9FFFF) | ((tbl_value & 0x03) << 15); TMC2240_WriteReg(0x6C, *chopconf); } // 设置VHIGHFS(位18) void TMC2240_SetVHIGHFS(uint8_t enable, uint32_t *chopconf) { enable = (enable != 0) ? 1 : 0; *chopconf = (*chopconf & 0xFFFBFFFF) | (enable << 18); TMC2240_WriteReg(0x6C, *chopconf); } // 设置VHIGHCHM(位19) void TMC2240_SetVHIGHCHM(uint8_t enable, uint32_t *chopconf) { enable = (enable != 0) ? 1 : 0; *chopconf = (*chopconf & 0xFFF7FFFF) | (enable << 19); TMC2240_WriteReg(0x6C, *chopconf); } // 设置TPFD(位20-23) void TMC2240_SetTPFD(uint8_t tpfd_value, uint32_t *chopconf) { if (tpfd_value > 15) return; // 错误:超出范围 *chopconf = (*chopconf & 0xFF0FFFFF) | ((tpfd_value & 0x0F) << 20); TMC2240_WriteReg(0x6C, *chopconf); } // 设置MRES(位24-27) void TMC2240_SetMRES(uint8_t mres_value, uint32_t *chopconf) { if (mres_value > 15) return; // 错误:超出范围 *chopconf = (*chopconf & 0xF0FFFFFF) | ((mres_value & 0x0F) << 24); TMC2240_WriteReg(0x6C, *chopconf); } void set_CHOPCONF(uint8_t field_selector, uint8_t param_value, uint32_t *chopconf) { switch(field_selector) { case 0x00: TMC2240_SetTOFF(param_value, chopconf); break; // Bits 0-3 case 0x01: TMC2240_SetHSTRT(param_value, chopconf); break; // Bits 4-6 case 0x02: TMC2240_SetHEND(param_value, chopconf); break; // Bits 7-10 case 0x03: TMC2240_SetFD3(param_value, chopconf); break; // Bit 11 case 0x04: TMC2240_SetDISFDCC(param_value, chopconf); break; // Bit 12 case 0x05: TMC2240_SetRNDTF(param_value, chopconf); break; // Bit 13 case 0x06: TMC2240_SetCHM(param_value, chopconf); break; // Bit 14 case 0x07: TMC2240_SetTBL(param_value, chopconf); break; // Bits 15-16 case 0x08: TMC2240_SetVHIGHFS(param_value, chopconf); break; // Bit 18 case 0x09: TMC2240_SetVHIGHCHM(param_value, chopconf); break; // Bit 19 case 0x0A: TMC2240_SetTPFD(param_value, chopconf); break; // Bits 20-23 case 0x0B: TMC2240_SetMRES(param_value, chopconf); break; // Bits 24-27 default: lcd_key |= 0x80000000; // 假设最高位用作错误标志 break; } } // sfilt (Bit 24) void TMC2240_SetSFilt(uint8_t value, uint32_t *coolstep_config) { if (value > 1) return; // 允许值0或1 *coolstep_config = (*coolstep_config & ~(1 << 24)) | ((value & 0x01) << 24); TMC2240_WriteReg(0x6D, *coolstep_config); } // sgt (Bits 22:16) 有符号整数范围 -64~63 void TMC2240_SetSGT(int8_t value, uint32_t *coolstep_config) { if (value < -64 || value > 63) return; // 错误:超出范围 *coolstep_config = (*coolstep_config & ~(0x7F << 16)) | ((value & 0x7F) << 16); TMC2240_WriteReg(0x6D, *coolstep_config); } // seimin (Bit 15) void TMC2240_SetSEIMin(uint8_t value, uint32_t *coolstep_config) { if (value > 1) return; *coolstep_config = (*coolstep_config & ~(1 << 15)) | ((value & 0x01) << 15); TMC2240_WriteReg(0x6D, *coolstep_config); } // sedn (Bits 14:13) void TMC2240_SetSEDN(uint8_t value, uint32_t *coolstep_config) { if (value > 3) return; // 允许值0~3 *coolstep_config = (*coolstep_config & ~(0x03 << 13)) | ((value & 0x03) << 13); TMC2240_WriteReg(0x6D, *coolstep_config); } // semax (Bits 11:8) void TMC2240_SetSEMax(uint8_t value, uint32_t *coolstep_config) { if (value > 15) return; // 允许值0~15 *coolstep_config = (*coolstep_config & ~(0x0F << 8)) | ((value & 0x0F) << 8); TMC2240_WriteReg(0x6D, *coolstep_config); } // seup (Bits 6:5) void TMC2240_SetSEUp(uint8_t value, uint32_t *coolstep_config) { if (value > 3) return; // 允许值0~3 *coolstep_config = (*coolstep_config & ~(0x03 << 5)) | ((value & 0x03) << 5); TMC2240_WriteReg(0x6D, *coolstep_config); } // semin (Bits 3:0) void TMC2240_SetSEMin(uint8_t value, uint32_t *coolstep_config) { if (value > 15) return; // 允许值0~15 *coolstep_config = (*coolstep_config & ~0x0F) | (value & 0x0F); TMC2240_WriteReg(0x6D, *coolstep_config); } // COOLCONF寄存器配置函数 void set_COOLCONF(uint8_t field_selector, uint8_t param_value, uint32_t *coolstep_config) { switch(field_selector) { case 0x00: TMC2240_SetSEMin(param_value, coolstep_config); break; case 0x01: TMC2240_SetSEUp(param_value, coolstep_config); break; case 0x02: TMC2240_SetSEMax(param_value, coolstep_config); break; case 0x03: TMC2240_SetSEDN(param_value, coolstep_config); break; case 0x04: TMC2240_SetSEIMin(param_value, coolstep_config); break; case 0x05: TMC2240_SetSGT((int8_t)param_value, coolstep_config); break; case 0x06: TMC2240_SetSFilt(param_value, coolstep_config); break; default: // 可添加错误处理(如日志输出) break; } } //---- 左右平移电机电机参数配置 // 0x00 GCONF 参数配置 uint32_t mobile_gconf = 0x000000C4 | (1 << 7); // 全局变量声明 uint32_t mobile_current_config = 0x00180C10; // 地址 0x10 的寄存器值 // CHOPCONF寄存器配置(地址0x6C) uint32_t mobile_chopconf = 0x020080C3; // 全局变量声明 uint32_t mobile_coolstep_config = 0; // 地址 0x6D 的寄存器值 //---- 旋转采集电机参数配置 // 0x00 GCONF 参数配置 uint32_t rotating_gconf = 0x000000C4 | (1 << 7); // 全局变量声明 uint32_t rotating_current_config = 0x00180C10; // 地址 0x10 的寄存器值 // CHOPCONF寄存器配置(地址0x6C) uint32_t rotating_chopconf = 0x020080C3; // 全局变量声明 uint32_t rotating_coolstep_config = 0; // 地址 0x6D 的寄存器值 void motor_left(){ delay_us(500); MOVE_THE_MOTOR_TO_THE_LEFT; TMC2240_SetMRES(6, &mobile_gconf); motor_move = MOVE_LEFT; //TMC2240_WriteReg(0x10, 0x00180C10); } void motor_right(){ delay_us(500); MOVE_THE_MOTOR_TO_THE_RIGHT; TMC2240_SetMRES(6, &mobile_gconf); motor_move = MOVE_RIGHT; //TMC2240_WriteReg(0x10, 0x00180C10); } #if 0 //---- 左右平移电机电机参数配置 // 0x00 GCONF 参数配置 uint32_t mobile_gconf = 0x000000C4 | (1 << 7); // 全局变量声明 uint32_t mobile_current_config = 0x00180C10; // 地址 0x10 的寄存器值 // CHOPCONF寄存器配置(地址0x6C) uint32_t mobile_chopconf = 0x020080C3; // 全局变量声明 uint32_t mobile_coolstep_config = 0; // 地址 0x6D 的寄存器值 //---- 旋转采集电机参数配置 // 0x00 GCONF 参数配置 uint32_t rotating_gconf = 0x000000C4 | (1 << 7); // 全局变量声明 uint32_t rotating_current_config = 0x00180C10; // 地址 0x10 的寄存器值 // CHOPCONF寄存器配置(地址0x6C) uint32_t rotating_chopconf = 0x020080C3; // 全局变量声明 uint32_t rotating_coolstep_config = 0; // 地址 0x6D 的寄存器值 extern uint16_t Rotation_times; char rotatingbit = 0; void change_spi(char *str){ uint8_t stepselete = str[0]; uint8_t reg_addr = str[1]; uint8_t field_selector = str[2]; uint16_t param_value = str[3] ; // 合并高/低字节 if(stepselete == 1){ mobile_configure = 1; //配置参数结束 step = 1; switch(reg_addr) { case 0x00: // 用于全局状态监控和故障诊断。 set_CHOPCONF(field_selector, param_value,&mobile_gconf); break; case 0x10: // 用于动态调节电机电流以优化能耗和性能 set_IHOLD_IRUN(field_selector, param_value,&mobile_current_config); break; case 0x6C: // 用于配置静音、高效或高动态的驱动模式。 set_CHOPCONF(field_selector, param_value,&mobile_chopconf); break; case 0x0D: // 提供实时状态反馈,支持负载检测和温度保护。 set_COOLCONF(field_selector, param_value,&mobile_coolstep_config); break; case 0x01: // 正转 反转 if(param_value == 1) GPIO_SetBits(GPIOD,GPIO_Pin_8); else GPIO_ResetBits(GPIOD,GPIO_Pin_8); break; case 0xFF: // 电机是否启动 if_mobilemotor_rotate = param_value; break; case 0xF1: // 设置电机旋转圈数 pro_stage = CLOESE_THE_LID; rot_stage = GIVE_CHANGE; rotatingbit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15); ProcessControl(); OPENMOTOR; break; default: // 可添加错误处理(如日志输出) break; } mobile_configure = 0; //配置参数结束 } else{ switch(reg_addr) { rotating_configure = 1; //配置参数结束 step = 2; case 0x00: // 用于全局状态监控和故障诊断。 set_CHOPCONF(field_selector, param_value,&rotating_gconf); break; case 0x10: // 用于动态调节电机电流以优化能耗和性能 set_IHOLD_IRUN(field_selector, param_value,&rotating_current_config); break; case 0x6C: // 用于配置静音、高效或高动态的驱动模式。 set_CHOPCONF(field_selector, param_value,&rotating_chopconf); break; case 0x0D: // 提供实时状态反馈,支持负载检测和温度保护。 set_COOLCONF(field_selector, param_value,&rotating_coolstep_config); break; case 0x01: // 正转 反转 if(param_value == 1) GPIO_SetBits(GPIOB,GPIO_Pin_14); else GPIO_ResetBits(GPIOB,GPIO_Pin_14); break; case 0xFF: // 电机是否启动 if_rotatingmotor_rotate = param_value; break; case 0xF0: // 设置电机旋转圈数 Rotation_times = param_value*100; break; default: // 可添加错误处理(如日志输出) break; } rotating_configure = 0; //配置参数结束 } } extern volatile uint32_t pulse_count; // 电机移动 //void motor_move(){ // step = 1; // GPIO_SetBits(GPIOD,GPIO_Pin_9); // delay_us(50); // GPIO_ResetBits(GPIOD,GPIO_Pin_9); // Rotation_quantity++; // if(Rotation_quantity == 1500){ // delay_us(100); // // TMC2240_WriteReg(0x10, 0x00190C10); // TMC2240_SetMRES(7, &mobile_gconf); // } // //} void accelerate(){ step = 1; if(pulse_count == 1600){ TMC2240_SetMRES(7, &mobile_gconf); } } void motor_left(){ delay_us(500); MOVE_THE_MOTOR_TO_THE_LEFT; TMC2240_SetMRES(6, &mobile_gconf); motor_move = MOVE_LEFT; //TMC2240_WriteReg(0x10, 0x00180C10); pulse_count = 0; } void motor_right(){ delay_us(500); MOVE_THE_MOTOR_TO_THE_RIGHT; TMC2240_SetMRES(6, &mobile_gconf); motor_move = MOVE_RIGHT; //TMC2240_WriteReg(0x10, 0x00180C10); pulse_count = 0; } uint16_t rotating_rotation_times = 0; // 旋转采集电机需要旋转的圈数 char number_of_detection_cycles = 0; // 清除线位 extern char right_limit; // 到达右线位 extern char left_limit; // 到达左线位 extern char mid_limit; // 到达左线位 void clean_limit(void){ right_limit = 0; left_limit = 0; mid_limit = 0; } // 左右平移电机电机流程控制函数 void ProcessControl(void){ step = 1; switch(pro_stage){ case CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION: // 找零阶段 // 向右 motor_right(); OPENMOTOR; break; case CHANGE_STAGE_TO_LEFT_LIMIT_POSITION: // 找零阶段 motor_left(); break; case CLOESE_THE_LID: // 关盖阶段 左移压紧 motor_left(); break; case FIND_THE_RIGHT_LIMIT_POSITION: // 找右线位阶段 motor_right(); /////--------------------还需要开启等光 待完善 break; case TESTING_SAMPLES: // 检测阶段 rotating_rotation_times = 1600; number_of_detection_cycles = 0; motor_left(); break; case FIND_THE_LEFT_LIMIT_POSITION: //找左线位阶段 rotating_rotation_times = 1600; // 因为绿色在上时 就是处于0点位置 防止出现校准问题 转开他 motor_left(); break; case FAILD_FIND: motor_left(); break; } } extern u8 if_read7683; void detection_steps(){ step = 1; static u32 steps = 0; static char needstep = 0; //记录上一次是否路过左线位 0为向左的阶段 1为向右的阶段 if(motor_move == MOVE_LEFT){ if((steps == 0) && (mid_limit == 1)){ clean_limit(); steps = 3000; } else if(steps > 0){ steps --; if(steps <= 0){ motor_right(); } } if(pulse_count > START_THE_BLACK_LIGHT){ if_read7683 = 1; } } else{ // 右移 到达右限位 if(right_limit == 1) { motor_left(); clean_limit(); number_of_detection_cycles++; if(number_of_detection_cycles >= 8){ //完成8次检测 pro_stage = FIND_THE_LEFT_LIMIT_POSITION; ProcessControl(); number_of_detection_cycles = 0; } } if(pulse_count > END_THE_BLACK_LIGHT){ if_read7683 = 2; } } } // 大电机运动 void motor_motion(void){ step = 1; switch(pro_stage){ case CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION: if(right_limit == 1){ pro_stage = CHANGE_STAGE_TO_LEFT_LIMIT_POSITION; //进入下个阶段 向左移动 ProcessControl(); clean_limit(); } break; case CHANGE_STAGE_TO_LEFT_LIMIT_POSITION: // 找零阶段 if(left_limit == 1){ //找零阶段结束 clean_limit(); pro_stage = MOTOR_STOP; CLOSEMOTOR; pulse_count = 0; } break; case CLOESE_THE_LID: // 关盖阶段 左移压紧 if(800 <= pulse_count){ // 停止左移 进入下一个步骤 pro_stage = FIND_THE_RIGHT_LIMIT_POSITION; ProcessControl(); } break; case FIND_THE_RIGHT_LIMIT_POSITION: // 找右线位阶段 if(rot_stage == RO_MOTOR_STOP){ rot_stage = FIND_READ_FROM_CHANGE; rotating_rotation_times = 4800; // 1600 转90度 目的时为了找红色 } if((rot_stage != FIND_READ_FROM_CHANGE)||(rotating_rotation_times !=0)) { pulse_count = 1498; } if(right_limit == 1){ pro_stage = TESTING_SAMPLES; //进入下个阶段 向左移动 ProcessControl(); clean_limit(); } if(pulse_count > INFRARED_STARTING_POINT && pulse_count < INFRARED_ENDING_POINT) // 进行AD采集 if_read7683 = 1; else if_read7683 = 2; break; case TESTING_SAMPLES: // 检测阶段 detection_steps(); ///----采集dac数据 待完善 break; case FIND_THE_LEFT_LIMIT_POSITION: //找左线位阶段 if(left_limit == 1){ //找零阶段结束 clean_limit(); pro_stage = MOTOR_STOP; CLOSEMOTOR; pulse_count =0; ////---- 是否需要关闭相应的灯光 } break; case FAILD_FIND: if(left_limit == 1){ //找零阶段结束 clean_limit(); pro_stage = MOTOR_STOP; ///--- 弹出错误预警 } break; case MOTOR_STOP: break; }; } // 电机旋转 void rotating_move(){ GPIO_SetBits(GPIOB,GPIO_Pin_15); delay_us(100); GPIO_ResetBits(GPIOB,GPIO_Pin_15); } // 小电机运动 void motor_rotating(void){ switch(rot_stage){ case ROTATE: if(rotating_rotation_times <= 0){ rot_stage = RO_MOTOR_STOP; } rotating_move(); rotating_rotation_times--; break; case RO_MOTOR_STOP: break; case GIVE_CHANGE: if(rotatingbit == 0){ // 在0点上 需要进行移动 rotatingbit = 1; rotating_rotation_times = 1600; } if(rotating_rotation_times > 0){ rotating_rotation_times--; rotating_move(); } else{ rotating_move(); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0){ rot_stage = ROTATE; rotating_rotation_times = 200; } } break; case FIND_READ_FROM_CHANGE: if(rotating_rotation_times > 0){ rotating_move(); rotating_rotation_times--; } break; } } #endif