835 lines
25 KiB
C
835 lines
25 KiB
C
|
|
#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) //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
#define Poutdown(n) GPIO_ResetBits(GPIOC, n) //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
|
|||
|
|
u32 lcd_key;
|
|||
|
|
char if_mobilemotor_rotate = 0; // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ת <20><>תΪ1 <20><><EFBFBD><EFBFBD>תΪ0
|
|||
|
|
char if_rotatingmotor_rotate = 1; // <20><>ת<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ת <20><>תΪ1 <20><><EFBFBD><EFBFBD>תΪ0
|
|||
|
|
char mobile_configure = 0; // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD> 0Ϊδ<CEAA><CEB4><EFBFBD>ò<EFBFBD><C3B2><EFBFBD> 1Ϊ<31><CEAA><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
|||
|
|
char rotating_configure = 0; // <20><>ת<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD> 0Ϊδ<CEAA><CEB4><EFBFBD>ò<EFBFBD><C3B2><EFBFBD> 1Ϊ<31><CEAA><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
|||
|
|
char step;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
enum process_stage{
|
|||
|
|
CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
CHANGE_STAGE_TO_LEFT_LIMIT_POSITION, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CLOESE_THE_LID, // <09>ظǽ<C7BD> <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
|
|||
|
|
FIND_THE_RIGHT_LIMIT_POSITION, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
FAILD_FIND, // û<><C3BB><EFBFBD>ҵ<EFBFBD><D2B5>Լ<EFBFBD>
|
|||
|
|
TESTING_SAMPLES, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
FIND_THE_LEFT_LIMIT_POSITION, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
MOTOR_STOP //<2F><><EFBFBD><EFBFBD>ֹͣ״̬
|
|||
|
|
};
|
|||
|
|
enum rotating_stage{
|
|||
|
|
GIVE_CHANGE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ROTATE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
|
|||
|
|
RO_MOTOR_STOP, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
FIND_READ_FROM_CHANGE // <20><><EFBFBD><EFBFBD><EFBFBD>㵽<EFBFBD><E3B5BD>ɫ
|
|||
|
|
};
|
|||
|
|
enum motor_movement_direction{
|
|||
|
|
MOVE_LEFT, // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
MOVE_RIGHT // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
enum motor_movement_direction motor_move = MOVE_LEFT;
|
|||
|
|
enum process_stage pro_stage = CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>TMC2240д<30><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void tmc2240_write(uint8_t address, uint8_t data) {
|
|||
|
|
// <20>ȷ<EFBFBD><C8B7>͵<EFBFBD>ַ
|
|||
|
|
spi1_read_write_byte(address);
|
|||
|
|
// <20>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
spi1_read_write_byte(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TMC2240<34>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ+32λ<32><CEBB><EFBFBD>ݣ<EFBFBD>
|
|||
|
|
void TMC2240_WriteReg(uint8_t addr, uint32_t data) {
|
|||
|
|
|
|||
|
|
TMC2240_CS_LOW();
|
|||
|
|
|
|||
|
|
spi1_read_write_byte(addr | 0x80); // д<><D0B4><EFBFBD>bit7=1<><31>?: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); // д<><D0B4><EFBFBD>bit7=1<><31>?: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<34>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t TMC2240_ReadReg(uint8_t addr) {
|
|||
|
|
uint32_t data = 0;
|
|||
|
|
|
|||
|
|
TMC2240_CS_LOW();
|
|||
|
|
|
|||
|
|
spi1_read_write_byte(addr & 0x7F); // <20><><EFBFBD><EFBFBD><EFBFBD>bit7=0<><30>?: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); // <20><><EFBFBD><EFBFBD><EFBFBD>bit7=0<><30>?: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; // <20><><EFBFBD><EFBFBD>ֵ0<D6B5><30>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:
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>Чѡ<D0A7><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// IRUNDELAY (Bits 27:24)
|
|||
|
|
void TMC2240_SetIRunDelay(uint8_t value, uint32_t *current_config) {
|
|||
|
|
if (value > 15) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>0-15<31><35>
|
|||
|
|
*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; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>0-31<33><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<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>0x6C<36><43>
|
|||
|
|
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:
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>TOFF<46><46>λ0-3<><33>
|
|||
|
|
void TMC2240_SetTOFF(uint8_t toff_value, uint32_t *chopconf) {
|
|||
|
|
if (toff_value > 15) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFFFF0) | (toff_value & 0x0F);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>HSTRT<52><54>λ4-6<><36>
|
|||
|
|
void TMC2240_SetHSTRT(uint8_t hstrt_value, uint32_t *chopconf) {
|
|||
|
|
if (hstrt_value > 7) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFF8FF) | ((hstrt_value & 0x07) << 4);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>HEND<4E><44>λ7-10<31><30>
|
|||
|
|
void TMC2240_SetHEND(uint8_t hend_value, uint32_t *chopconf) {
|
|||
|
|
if (hend_value > 15) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFF0FF) | ((hend_value & 0x0F) << 7);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>FD3<44><33>λ11<31><31>
|
|||
|
|
void TMC2240_SetFD3(uint8_t enable, uint32_t *chopconf) {
|
|||
|
|
enable = (enable != 0) ? 1 : 0; // ǿ<><C7BF>ת<EFBFBD><D7AA>Ϊ0<CEAA><30>1
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFF7FF) | (enable << 11);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>DISFDCC<43><43>λ12<31><32>
|
|||
|
|
void TMC2240_SetDISFDCC(uint8_t enable, uint32_t *chopconf) {
|
|||
|
|
enable = (enable != 0) ? 1 : 0;
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFEFFF) | (enable << 12);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>RNDTF<54><46>λ13<31><33>
|
|||
|
|
void TMC2240_SetRNDTF(uint8_t enable, uint32_t *chopconf) {
|
|||
|
|
enable = (enable != 0) ? 1 : 0;
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFDFFF) | (enable << 13);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>CHMģʽ<C4A3><CABD>λ14<31><34>
|
|||
|
|
void TMC2240_SetCHM(uint8_t enable, uint32_t *chopconf) {
|
|||
|
|
enable = (enable != 0) ? 1 : 0;
|
|||
|
|
*chopconf = (*chopconf & 0xFFFFBFFF) | (enable << 14);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>TBL<42><4C>λ15-16<31><36>
|
|||
|
|
void TMC2240_SetTBL(uint8_t tbl_value, uint32_t *chopconf) {
|
|||
|
|
if (tbl_value > 3) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*chopconf = (*chopconf & 0xFFF9FFFF) | ((tbl_value & 0x03) << 15);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>VHIGHFS<46><53>λ18<31><38>
|
|||
|
|
void TMC2240_SetVHIGHFS(uint8_t enable, uint32_t *chopconf) {
|
|||
|
|
enable = (enable != 0) ? 1 : 0;
|
|||
|
|
*chopconf = (*chopconf & 0xFFFBFFFF) | (enable << 18);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>VHIGHCHM<48><4D>λ19<31><39>
|
|||
|
|
void TMC2240_SetVHIGHCHM(uint8_t enable, uint32_t *chopconf) {
|
|||
|
|
enable = (enable != 0) ? 1 : 0;
|
|||
|
|
*chopconf = (*chopconf & 0xFFF7FFFF) | (enable << 19);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>TPFD<46><44>λ20-23<32><33>
|
|||
|
|
void TMC2240_SetTPFD(uint8_t tpfd_value, uint32_t *chopconf) {
|
|||
|
|
if (tpfd_value > 15) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*chopconf = (*chopconf & 0xFF0FFFFF) | ((tpfd_value & 0x0F) << 20);
|
|||
|
|
TMC2240_WriteReg(0x6C, *chopconf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>MRES<45><53>λ24-27<32><37>
|
|||
|
|
void TMC2240_SetMRES(uint8_t mres_value, uint32_t *chopconf) {
|
|||
|
|
if (mres_value > 15) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// sfilt (Bit 24)
|
|||
|
|
void TMC2240_SetSFilt(uint8_t value, uint32_t *coolstep_config) {
|
|||
|
|
if (value > 1) return; // <20><><EFBFBD><EFBFBD>ֵ0<D6B5><30>1
|
|||
|
|
*coolstep_config = (*coolstep_config & ~(1 << 24)) | ((value & 0x01) << 24);
|
|||
|
|
TMC2240_WriteReg(0x6D, *coolstep_config);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// sgt (Bits 22:16) <20>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ -64~63
|
|||
|
|
void TMC2240_SetSGT(int8_t value, uint32_t *coolstep_config) {
|
|||
|
|
if (value < -64 || value > 63) return; // <20><><EFBFBD><EFBFBD><F3A3BAB3><EFBFBD><EFBFBD><EFBFBD>Χ
|
|||
|
|
*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; // <20><><EFBFBD><EFBFBD>ֵ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; // <20><><EFBFBD><EFBFBD>ֵ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; // <20><><EFBFBD><EFBFBD>ֵ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; // <20><><EFBFBD><EFBFBD>ֵ0~15
|
|||
|
|
*coolstep_config = (*coolstep_config & ~0x0F) | (value & 0x0F);
|
|||
|
|
TMC2240_WriteReg(0x6D, *coolstep_config);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// COOLCONF<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
|
|||
|
|
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:
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---- <20><><EFBFBD><EFBFBD>ƽ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// 0x00 GCONF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t mobile_gconf = 0x000000C4 | (1 << 7);
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t mobile_current_config = 0x00180C10; // <20><>ַ 0x10 <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
// CHOPCONF<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x6C<36><43>
|
|||
|
|
uint32_t mobile_chopconf = 0x020080C3;
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t mobile_coolstep_config = 0; // <20><>ַ 0x6D <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
//---- <20><>ת<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// 0x00 GCONF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t rotating_gconf = 0x000000C4 | (1 << 7);
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t rotating_current_config = 0x00180C10; // <20><>ַ 0x10 <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
// CHOPCONF<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x6C<36><43>
|
|||
|
|
uint32_t rotating_chopconf = 0x020080C3;
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t rotating_coolstep_config = 0; // <20><>ַ 0x6D <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
//---- <20><><EFBFBD><EFBFBD>ƽ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// 0x00 GCONF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t mobile_gconf = 0x000000C4 | (1 << 7);
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t mobile_current_config = 0x00180C10; // <20><>ַ 0x10 <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
// CHOPCONF<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x6C<36><43>
|
|||
|
|
uint32_t mobile_chopconf = 0x020080C3;
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t mobile_coolstep_config = 0; // <20><>ַ 0x6D <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
//---- <20><>ת<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// 0x00 GCONF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t rotating_gconf = 0x000000C4 | (1 << 7);
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t rotating_current_config = 0x00180C10; // <20><>ַ 0x10 <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
// CHOPCONF<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x6C<36><43>
|
|||
|
|
uint32_t rotating_chopconf = 0x020080C3;
|
|||
|
|
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint32_t rotating_coolstep_config = 0; // <20><>ַ 0x6D <20>ļĴ<C4BC><C4B4><EFBFBD>ֵ
|
|||
|
|
|
|||
|
|
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] ; // <20>ϲ<EFBFBD><CFB2><EFBFBD>/<2F><><EFBFBD>ֽ<EFBFBD>
|
|||
|
|
if(stepselete == 1){
|
|||
|
|
mobile_configure = 1; //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
step = 1;
|
|||
|
|
switch(reg_addr) {
|
|||
|
|
case 0x00: // <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>״̬<D7B4><CCAC><EFBFBD>غ<D8BA><CDB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>
|
|||
|
|
set_CHOPCONF(field_selector, param_value,&mobile_gconf);
|
|||
|
|
break;
|
|||
|
|
case 0x10: // <20><><EFBFBD>ڶ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB>ܺĺ<DCBA><C4BA><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
set_IHOLD_IRUN(field_selector, param_value,&mobile_current_config);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case 0x6C: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>߶<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
|
|||
|
|
set_CHOPCONF(field_selector, param_value,&mobile_chopconf);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case 0x0D: // <20>ṩʵʱ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ָ<EFBFBD><D6B8>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶ȱ<C2B6><C8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
set_COOLCONF(field_selector, param_value,&mobile_coolstep_config);
|
|||
|
|
break;
|
|||
|
|
case 0x01: // <20><>ת <20><>ת
|
|||
|
|
if(param_value == 1) GPIO_SetBits(GPIOD,GPIO_Pin_8);
|
|||
|
|
else GPIO_ResetBits(GPIOD,GPIO_Pin_8);
|
|||
|
|
break;
|
|||
|
|
case 0xFF: // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if_mobilemotor_rotate = param_value;
|
|||
|
|
break;
|
|||
|
|
case 0xF1: // <09><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>תȦ<D7AA><C8A6>
|
|||
|
|
pro_stage = CLOESE_THE_LID;
|
|||
|
|
rot_stage = GIVE_CHANGE;
|
|||
|
|
rotatingbit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15);
|
|||
|
|
ProcessControl();
|
|||
|
|
OPENMOTOR;
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
mobile_configure = 0; //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
switch(reg_addr) {
|
|||
|
|
rotating_configure = 1; //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
step = 2;
|
|||
|
|
case 0x00: // <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>״̬<D7B4><CCAC><EFBFBD>غ<D8BA><CDB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>
|
|||
|
|
set_CHOPCONF(field_selector, param_value,&rotating_gconf);
|
|||
|
|
break;
|
|||
|
|
case 0x10: // <20><><EFBFBD>ڶ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB>ܺĺ<DCBA><C4BA><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
set_IHOLD_IRUN(field_selector, param_value,&rotating_current_config);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case 0x6C: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>߶<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
|
|||
|
|
set_CHOPCONF(field_selector, param_value,&rotating_chopconf);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case 0x0D: // <20>ṩʵʱ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ָ<EFBFBD><D6B8>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶ȱ<C2B6><C8B1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
set_COOLCONF(field_selector, param_value,&rotating_coolstep_config);
|
|||
|
|
break;
|
|||
|
|
case 0x01: // <20><>ת <20><>ת
|
|||
|
|
if(param_value == 1) GPIO_SetBits(GPIOB,GPIO_Pin_14);
|
|||
|
|
else GPIO_ResetBits(GPIOB,GPIO_Pin_14);
|
|||
|
|
break;
|
|||
|
|
case 0xFF: // <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if_rotatingmotor_rotate = param_value;
|
|||
|
|
break;
|
|||
|
|
case 0xF0: // <09><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>תȦ<D7AA><C8A6>
|
|||
|
|
Rotation_times = param_value*100;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
rotating_configure = 0; //<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
extern volatile uint32_t pulse_count;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
//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; // <20><>ת<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ת<EFBFBD><D7AA>Ȧ<EFBFBD><C8A6>
|
|||
|
|
char number_of_detection_cycles = 0;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
|
|||
|
|
extern char right_limit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
extern char left_limit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
extern char mid_limit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
void clean_limit(void){
|
|||
|
|
right_limit = 0;
|
|||
|
|
left_limit = 0;
|
|||
|
|
mid_limit = 0;
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ƽ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD><CCBF>ƺ<EFBFBD><C6BA><EFBFBD>
|
|||
|
|
void ProcessControl(void){
|
|||
|
|
step = 1;
|
|||
|
|
switch(pro_stage){
|
|||
|
|
case CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
motor_right();
|
|||
|
|
OPENMOTOR;
|
|||
|
|
break;
|
|||
|
|
case CHANGE_STAGE_TO_LEFT_LIMIT_POSITION: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
motor_left();
|
|||
|
|
break;
|
|||
|
|
case CLOESE_THE_LID: // <09>ظǽ<C7BD> <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
|
|||
|
|
motor_left();
|
|||
|
|
break;
|
|||
|
|
case FIND_THE_RIGHT_LIMIT_POSITION: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
motor_right();
|
|||
|
|
/////--------------------<2D><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ȹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
case TESTING_SAMPLES: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
rotating_rotation_times = 1600;
|
|||
|
|
number_of_detection_cycles = 0;
|
|||
|
|
motor_left();
|
|||
|
|
break;
|
|||
|
|
case FIND_THE_LEFT_LIMIT_POSITION: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
rotating_rotation_times = 1600; // <20><>Ϊ<EFBFBD><CEAA>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ʱ <20><><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>0<EFBFBD><30>λ<EFBFBD><CEBB> <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>У<D0A3><D7BC><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD>
|
|||
|
|
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; //<2F><>¼<EFBFBD><C2BC>һ<EFBFBD><D2BB><EFBFBD>Ƿ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ 0Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD>Ľ<C4BD> 1Ϊ<31><CEAA><EFBFBD>ҵĽ<C4BD>
|
|||
|
|
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{
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
if(right_limit == 1)
|
|||
|
|
{
|
|||
|
|
motor_left();
|
|||
|
|
clean_limit();
|
|||
|
|
number_of_detection_cycles++;
|
|||
|
|
if(number_of_detection_cycles >= 8){ //<2F><><EFBFBD><EFBFBD>8<EFBFBD>μ<EFBFBD><CEBC><EFBFBD>
|
|||
|
|
pro_stage = FIND_THE_LEFT_LIMIT_POSITION;
|
|||
|
|
ProcessControl();
|
|||
|
|
number_of_detection_cycles = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(pulse_count > END_THE_BLACK_LIGHT){
|
|||
|
|
if_read7683 = 2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD>
|
|||
|
|
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; //<2F><><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
ProcessControl();
|
|||
|
|
clean_limit();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CHANGE_STAGE_TO_LEFT_LIMIT_POSITION: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(left_limit == 1){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ν<D7B6><CEBD><EFBFBD>
|
|||
|
|
clean_limit();
|
|||
|
|
pro_stage = MOTOR_STOP;
|
|||
|
|
CLOSEMOTOR;
|
|||
|
|
pulse_count = 0;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CLOESE_THE_LID: // <09>ظǽ<C7BD> <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
|
|||
|
|
if(800 <= pulse_count){
|
|||
|
|
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
pro_stage = FIND_THE_RIGHT_LIMIT_POSITION;
|
|||
|
|
ProcessControl();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FIND_THE_RIGHT_LIMIT_POSITION: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
if(rot_stage == RO_MOTOR_STOP){
|
|||
|
|
rot_stage = FIND_READ_FROM_CHANGE;
|
|||
|
|
rotating_rotation_times = 4800; // 1600 ת90<39><30> Ŀ<><C4BF>ʱΪ<CAB1><CEAA><EFBFBD>Һ<EFBFBD>ɫ
|
|||
|
|
}
|
|||
|
|
if((rot_stage != FIND_READ_FROM_CHANGE)||(rotating_rotation_times !=0))
|
|||
|
|
{
|
|||
|
|
pulse_count = 1498;
|
|||
|
|
}
|
|||
|
|
if(right_limit == 1){
|
|||
|
|
pro_stage = TESTING_SAMPLES; //<2F><><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
ProcessControl();
|
|||
|
|
clean_limit();
|
|||
|
|
}
|
|||
|
|
if(pulse_count > INFRARED_STARTING_POINT && pulse_count < INFRARED_ENDING_POINT) // <20><><EFBFBD><EFBFBD>AD<41>ɼ<EFBFBD>
|
|||
|
|
if_read7683 = 1;
|
|||
|
|
else if_read7683 = 2;
|
|||
|
|
break;
|
|||
|
|
case TESTING_SAMPLES: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
detection_steps();
|
|||
|
|
///----<2D>ɼ<EFBFBD>dac<61><63><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
case FIND_THE_LEFT_LIMIT_POSITION: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
|||
|
|
if(left_limit == 1){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ν<D7B6><CEBD><EFBFBD>
|
|||
|
|
clean_limit();
|
|||
|
|
pro_stage = MOTOR_STOP;
|
|||
|
|
CLOSEMOTOR;
|
|||
|
|
pulse_count =0;
|
|||
|
|
////---- <20>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD>ر<EFBFBD><D8B1><EFBFBD>Ӧ<EFBFBD>ĵƹ<C4B5>
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FAILD_FIND:
|
|||
|
|
if(left_limit == 1){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ν<D7B6><CEBD><EFBFBD>
|
|||
|
|
clean_limit();
|
|||
|
|
pro_stage = MOTOR_STOP;
|
|||
|
|
///--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case MOTOR_STOP:
|
|||
|
|
break;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
|
|||
|
|
void rotating_move(){
|
|||
|
|
GPIO_SetBits(GPIOB,GPIO_Pin_15);
|
|||
|
|
delay_us(100);
|
|||
|
|
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
|
|||
|
|
}
|
|||
|
|
// С<><D0A1><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD>
|
|||
|
|
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){ // <20><>0<EFBFBD><30><EFBFBD><EFBFBD> <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
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
|