diff --git a/Core/Inc/EEPROM.h b/Core/Inc/EEPROM.h index 67e70db..a345c8d 100644 --- a/Core/Inc/EEPROM.h +++ b/Core/Inc/EEPROM.h @@ -13,19 +13,19 @@ #define MAX_NUMBER_SHOTS_IN_PROGRAMS 31 #define MAX_NUMBER_PROGRAMS_IN_MACRO 16 -struct StructNumberScrewCount{ - unsigned char number; +typedef struct MacroProgram{ + unsigned char id; unsigned char speedScrew; unsigned char countRepeat; unsigned char options; - }; + }MacroProgram; -struct StructNumberScrew{ - unsigned char number; +typedef struct ProgramShot{ + unsigned char id; unsigned char speedScrew; - }; + }ProgramShot; -struct StructShot { +typedef struct Shot { unsigned char countRepeatShot; unsigned char speedRollerTop; unsigned char speedRollerBottom; @@ -33,20 +33,20 @@ struct StructShot { unsigned char rotationAxial; unsigned char rotationHorizontal; unsigned char rotationVertical; - }; + }Shot; -struct StructProgram { +typedef struct Program { unsigned char countRepeat; unsigned char options; - struct StructNumberScrew numberScrew[MAX_NUMBER_SHOTS_IN_PROGRAMS]; - }; + ProgramShot shots[MAX_NUMBER_SHOTS_IN_PROGRAMS]; + }Program; -struct StructMacro { - struct StructNumberScrewCount numberScrewCount[MAX_NUMBER_PROGRAMS_IN_MACRO]; - }; +typedef struct Macro { + MacroProgram programs[MAX_NUMBER_PROGRAMS_IN_MACRO]; + } Macro; -void SaveShot(unsigned char number, struct StructShot* shot); +void SaveShot(unsigned char number, struct Shot* shot); void FLASH_WriteBlock(uint8_t *writeAddr, unsigned char *flashWrBufPtr); -struct StructShot GetShot( unsigned char number ); +Shot GetShot( unsigned char number ); diff --git a/Core/Inc/GlobalDefines.h b/Core/Inc/GlobalDefines.h new file mode 100644 index 0000000..f084d2f --- /dev/null +++ b/Core/Inc/GlobalDefines.h @@ -0,0 +1,13 @@ +/* + * GlobalDefines.h + * + * Created on: Aug 25, 2024 + * Author: DashyFox + */ + +#ifndef INC_GLOBALDEFINES_H_ +#define INC_GLOBALDEFINES_H_ + +#define UART_BUFFER_SIZE 64 + +#endif /* INC_GLOBALDEFINES_H_ */ diff --git a/Core/Inc/IR.h b/Core/Inc/IR.h index ae9f3f4..08ad187 100644 --- a/Core/Inc/IR.h +++ b/Core/Inc/IR.h @@ -8,45 +8,16 @@ extern unsigned char IR_Command; extern unsigned char IR_Address; - -extern unsigned char IR_CommandNumber[3]; extern unsigned char IRStatus; -void IR_handler(void); -void ClearIRStatus(void); -void ClearIRCommand(void); -void ClearIR(void); -void SetShiftReg_inline (unsigned char b1, unsigned char b2, unsigned char b3); -void SetShiftReg (unsigned char shiftreg[3]); +//extern unsigned char IR_CommandNumber[3]; -enum IR_CMD_LIST { - IR_FRONT_LEFT = 20, - IR_FRONT_MID = 58, - IR_FONT_RIGHT = 21, - IR_MACRO = 63, - IR_PROG = 37, - IR_SHOT = 56, - IR_NUM_1 = 0, - IR_NUM_2 = 1, - IR_NUM_3 = 2, - IR_NUM_4 = 3, - IR_NUM_5 = 4, - IR_NUM_6 = 5, - IR_NUM_7 = 6, - IR_NUM_8 = 7, - IR_NUM_9 = 8, - IR_NUM_0 = 9, - IR_DEBUG = 29, // -/-- - IR_PAUSE = 43, - IR_STOP = 116, - IR_START = 124, - IR_F_BTN = 23, - IR_ESC = 117, - IR_ENTER = 97, - IR_TEMPO_INC = 60, - IR_TEMPO_DEC = 54, - IR_ENGINE_UP_INC = 18, // скорость верхнего мотора - IR_ENGINE_UP_DEC = 19, - IR_ENGINE_DOWM_INC = 16, - IR_ENGINE_DOWM_DEC = 17 -}; +typedef struct IRData{ + unsigned char address; + unsigned char command; +} IRData; + +void IR_handler(void); +IRData getIRData(void); +unsigned char IR_Available(); +void ClearIRStatus(void); diff --git a/Core/Inc/IR_CMD_Handler.h b/Core/Inc/IR_CMD_Handler.h new file mode 100644 index 0000000..0fbd0eb --- /dev/null +++ b/Core/Inc/IR_CMD_Handler.h @@ -0,0 +1,47 @@ +/* + * IR_CMD_Handler.h + * + * Created on: Aug 25, 2024 + * Author: DashyFox + */ + +#ifndef INC_IR_CMD_HANDLER_H_ +#define INC_IR_CMD_HANDLER_H_ + +#include "stm32f1xx_hal.h" + +void IR_CMD_Handler(); + +enum IR_CMD_LIST { + IR_FRONT_LEFT = 20, + IR_FRONT_MID = 58, + IR_FONT_RIGHT = 21, + IR_MACRO = 63, + IR_PROG = 37, + IR_SHOT = 56, + IR_NUM_1 = 0, + IR_NUM_2 = 1, + IR_NUM_3 = 2, + IR_NUM_4 = 3, + IR_NUM_5 = 4, + IR_NUM_6 = 5, + IR_NUM_7 = 6, + IR_NUM_8 = 7, + IR_NUM_9 = 8, + IR_NUM_0 = 9, + IR_DEBUG = 29, // -/-- + IR_PAUSE = 43, + IR_STOP = 116, + IR_START = 124, + IR_F_BTN = 23, + IR_ESC = 117, + IR_ENTER = 97, + IR_TEMPO_INC = 60, + IR_TEMPO_DEC = 54, + IR_ENGINE_UP_INC = 18, // скорость верхнего мотора + IR_ENGINE_UP_DEC = 19, + IR_ENGINE_DOWM_INC = 16, + IR_ENGINE_DOWM_DEC = 17 +}; + +#endif /* INC_IR_CMD_HANDLER_H_ */ diff --git a/Core/Inc/RobotFunctions.h b/Core/Inc/RobotFunctions.h new file mode 100644 index 0000000..56b00d7 --- /dev/null +++ b/Core/Inc/RobotFunctions.h @@ -0,0 +1,39 @@ +/* + * RobotFunctions.h + * + * Created on: Aug 24, 2024 + * Author: DashyFox + */ + +#ifndef INC_ROBOTFUNCTIONS_H_ +#define INC_ROBOTFUNCTIONS_H_ + +#include "pca9685.h" + + +void doShot(); +void doShotForever(); + +void prepareShot(); + +void stopShooting(); + +void setPos(); +void setPosDefault(); + +// 0 .. 100 +void setShneckSpeed(uint8_t speed); + +//(-v) 0 .. 100(stop) .. 200(+v) +void setRollersSpeed(uint8_t speed); //(-v) 0 . 100(stop) . 200(+v) + +void startProgram(); // shot sequence +void startMacro(); // shot sequence + + + + + + + +#endif /* INC_ROBOTFUNCTIONS_H_ */ diff --git a/Core/Inc/ShiftReg.h b/Core/Inc/ShiftReg.h new file mode 100644 index 0000000..1ed9dfb --- /dev/null +++ b/Core/Inc/ShiftReg.h @@ -0,0 +1,17 @@ +/* + * ShiftReg.h + * + * Created on: Aug 25, 2024 + * Author: DashyFox + */ + +#ifndef SRC_SHIFTREG_H_ +#define SRC_SHIFTREG_H_ + +#include "stm32f1xx_hal.h" + +void SetShiftReg_inline (unsigned char b1, unsigned char b2, unsigned char b3); +void SetShiftReg (unsigned char shiftreg[3]); + + +#endif /* SRC_SHIFTREG_H_ */ diff --git a/Core/Inc/SimpleTimer.h b/Core/Inc/SimpleTimer.h new file mode 100644 index 0000000..305404c --- /dev/null +++ b/Core/Inc/SimpleTimer.h @@ -0,0 +1,23 @@ +/* + * SimpleTimer.h + * + * Created on: Aug 24, 2024 + * Author: DashyFox + */ + +#ifndef INC_SIMPLETIMER_H_ +#define INC_SIMPLETIMER_H_ + +#include "stm32f1xx_hal.h" + +#define forTimer(name, time) \ +static uint32_t name##_previousMillis = 0; \ +if (millis() - name##_previousMillis >= time) + +#define resetForTimer(name) \ +name##_previousMillis = millis(); + +uint32_t millis(); + + +#endif /* INC_SIMPLETIMER_H_ */ diff --git a/Core/Inc/stm32f1xx_it.h b/Core/Inc/stm32f1xx_it.h index 7ac3226..80d82c3 100644 --- a/Core/Inc/stm32f1xx_it.h +++ b/Core/Inc/stm32f1xx_it.h @@ -61,6 +61,7 @@ void USB_LP_CAN1_RX0_IRQHandler(void); void TIM3_IRQHandler(void); void I2C1_EV_IRQHandler(void); void I2C1_ER_IRQHandler(void); +void USART3_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Core/Src/EEPROM.c b/Core/Src/EEPROM.c index 875356a..e97f415 100644 --- a/Core/Src/EEPROM.c +++ b/Core/Src/EEPROM.c @@ -3,7 +3,7 @@ #include "usbd_cdc_if.h" -void SaveShot(unsigned char number, struct StructShot* shot) +void SaveShot(unsigned char number, struct Shot* shot) { uint16_t blockAddr16 = (uint16_t)(START_ADR_SHOT + (uint16_t)(number*FLASH_BLOCKSIZE)); @@ -26,31 +26,30 @@ void SaveShot(unsigned char number, struct StructShot* shot) FLASH_WriteBlock(blockAddr, Buf); } -struct StructShot GetShot( unsigned char number ) +struct Shot GetShot( unsigned char number ) { - struct StructShot shot; - - uint16_t blockAddr16 = (uint16_t)(START_ADR_SHOT + (uint16_t)(number*FLASH_BLOCKSIZE)); - - uint8_t blockAddr[2] = {HIBYTE(blockAddr16), LOBYTE(blockAddr16)}; + struct Shot shot; + + uint16_t blockAddr16 = (uint16_t)(START_ADR_SHOT + (uint16_t)(number*FLASH_BLOCKSIZE)); + uint8_t blockAddr[2] = {HIBYTE(blockAddr16), LOBYTE(blockAddr16)}; + + unsigned char Buf[FLASH_BLOCKSIZE]; + + + HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), blockAddr, 2, 10); + HAL_Delay(1); + HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1), Buf, FLASH_BLOCKSIZE, 10); + HAL_Delay(1); + + shot.countRepeatShot = Buf[1]; + shot.speedRollerTop = Buf[2]; + shot.speedRollerBottom = Buf[3]; + shot.speedScrew = Buf[4]; + shot.rotationAxial = Buf[5]; + shot.rotationHorizontal = Buf[6]; + shot.rotationVertical = Buf[7]; - unsigned char Buf[FLASH_BLOCKSIZE]; - - - HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), blockAddr, 2, 10); - HAL_Delay(1); - HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1), Buf, FLASH_BLOCKSIZE, 10); - HAL_Delay(1); - - shot.countRepeatShot = Buf[1]; - shot.speedRollerTop = Buf[2]; - shot.speedRollerBottom = Buf[3]; - shot.speedScrew = Buf[4]; - shot.rotationAxial = Buf[5]; - shot.rotationHorizontal = Buf[6]; - shot.rotationVertical = Buf[7]; - - return shot; + return shot; } diff --git a/Core/Src/IR.c b/Core/Src/IR.c index a8501f9..a1f338f 100644 --- a/Core/Src/IR.c +++ b/Core/Src/IR.c @@ -11,13 +11,7 @@ unsigned char IR_IndexBitAddress; unsigned int IR_Pulse; unsigned int currentIR_Pulse; -unsigned char IR_CommandNumber[3]; unsigned char IRStatus; -unsigned char NumberMacroProgramShot; -unsigned char NumberShot; -unsigned char NumberProgram; -unsigned char NumberMacro; -unsigned char CommandMacroProgramShot; void IR_handler() // SONY (SIRC) protocol 12 bit (7+5) { @@ -136,71 +130,13 @@ void ClearIRStatus() IRStatus = STATUS_START; } -void ClearIRCommand() -{ - IR_CommandNumber[0] = 0xFF; - IR_CommandNumber[1] = 0xFF; - IR_CommandNumber[2] = 0xFF; +IRData getIRData(){ + NVIC_DisableIRQ(EXTI1_IRQn); + IRData ret = {IR_Address, IR_Command}; + NVIC_EnableIRQ(EXTI1_IRQn); + return ret; } -void ClearIR() -{ - IR_Command = 0x7F; - IR_Address = 0x1F; - IR_OptionsProgram = 0x00; - - NumberMacroProgramShot = 0xFF; - NumberShot = 0xFF; - NumberProgram = 0xFF; - NumberMacro = 0xFF; - - CommandMacroProgramShot = 0x00; - - ClearIRStatus(); +unsigned char IR_Available(){ + return IRStatus == STATUS_REPEAT; } - -void SetShiftReg_inline(unsigned char b1, unsigned char b2, unsigned char b3){ - unsigned char shiftreg[3] = {b1,b2,b3}; - SetShiftReg(shiftreg); -} - -void SetShiftReg(unsigned char shiftreg[3]) -{ - for (unsigned char i = 0; i < 3; i++) - { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - for (unsigned char j = 0; j < 8; j++) - { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // ��� �������� - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - - if (((shiftreg[i] >> j) & 0x01) == 0x01) - { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); - } - else - { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); - } - - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // ��� �������� - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - } - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - } -} - diff --git a/Core/Src/IR_CMD_Handler.c b/Core/Src/IR_CMD_Handler.c new file mode 100644 index 0000000..2391698 --- /dev/null +++ b/Core/Src/IR_CMD_Handler.c @@ -0,0 +1,163 @@ +/* + * IR_CMD_Handler.c + * + * Created on: Aug 25, 2024 + * Author: DashyFox + */ + +#include "IR_CMD_Handler.h" +#include "IR.h" +#include "SimpleTimer.h" +#include "Print.h" +#include "ShiftReg.h" + +#define IR_Timeout 137 +#define ResetInputProgerss_Timeout 2500 +#define NULL_NumberParam 0xFFFF + +//extern unsigned char IR_Command; +//extern unsigned char IR_Address; +extern unsigned char IRStatus; + +IRData data; +IRData old_data; + +unsigned char b1 = 1; +unsigned char b2 = 1; +unsigned char b3 = 1; + +uint32_t IR_Timeout_timer = 0; +uint8_t dataHandled_flag = 0; + +uint32_t inputInProgerss_timer = 0; +uint8_t inputInProgerss = 0; +uint8_t digitInputInProgerss = 0; + +uint8_t inputDigit = 0; // left = 0 to right + +uint16_t inputNumberParam = NULL_NumberParam; + +enum IR_MENU { + IR_MENU_Home, + + IR_MENU_SHOT, IR_MENU_PROGR, IR_MENU_MACRO, IR_MENU_, + +}; + +void IR_Home_Process(); +void IR_Shot_Selection(); + +void IR_CMD_Clear(); + +void (*InputHandler)(void) = IR_Home_Process; + +void IR_CMD_Handler() { + + // timeout tick + if (dataHandled_flag && (millis() - IR_Timeout_timer > IR_Timeout)) { + dataHandled_flag = 0; + } + if (inputInProgerss + && (millis() - inputInProgerss_timer > ResetInputProgerss_Timeout)) { + IR_CMD_Clear(); + } + + // cmd handler + if (IR_Available()) { + data = getIRData(); + + IR_Timeout_timer = millis(); + // works once per button press + if (memcmp(&data, &old_data, sizeof(IRData)) != 0 + || !dataHandled_flag) { + dataHandled_flag = 1; + if (IR_Address == 0x01) { + printNumber(data.command); + InputHandler(); + inputInProgerss = 1; + inputInProgerss_timer = millis(); + } + memcpy(&old_data, &data, sizeof(IRData)); + } + IR_Timeout_timer = millis(); + ClearIRStatus(); + } +} + +void IR_CMD_Clear() { + + InputHandler = IR_Home_Process; + inputDigit = 0; + inputInProgerss = 0; + digitInputInProgerss = 0; + inputNumberParam = NULL_NumberParam; + SetShiftReg_inline(0, 0xff, 0); +} + +void IR_Home_Process() { + InputHandler = IR_Home_Process; + SetShiftReg_inline(0xff, 0, 0); + switch (data.command) { + case IR_FONT_RIGHT: + InputHandler = IR_Shot_Selection; + break; + +// case IR_FONT_RIGHT: +// // if(!(b1>64 || b2> 64|| b3>64)) b1 = 64; +// // else +// // { +// // b1 = b1>>1; +// // b2 = b2<<1; +// // b3 = b3<<1; +// // } +// SetShiftReg_inline(b1, b2, b3); +// break; + case IR_FRONT_MID: + SetShiftReg_inline(0, 0, 0); + b1 = b2 = b3 = 0; + break; + case IR_FRONT_LEFT: + // if(!b3) + // b3 = 128; + // b3 = b3>>1; + // if(!b3) + // b2 = 64; + + SetShiftReg_inline(++b1, ++b2, ++b3); + break; + + default: + break; + } + +} + +void IR_Shot_Selection() { // Сделать общим + SetShiftReg_inline(0x03, 0, 0); + if (0 <= data.command && data.command <= 9) { + if (digitInputInProgerss) { + inputNumberParam = inputNumberParam * 10; // dec shift << 1 + inputNumberParam += data.command + 1; + SetShiftReg_inline(0xF0, 0, 0); + } else { + inputNumberParam = data.command + 1; + } + digitInputInProgerss = 1; + } else { + digitInputInProgerss = 0; + switch (data.command) { + + case IR_ENTER: + if(inputNumberParam != NULL_NumberParam){ + SetShiftReg_inline(0, 0, inputNumberParam); + } + inputNumberParam = NULL_NumberParam; + digitInputInProgerss = 0; + break; + + default: + IR_Home_Process(); + break; + } + } +} diff --git a/Core/Src/ShiftReg.c b/Core/Src/ShiftReg.c new file mode 100644 index 0000000..3cf4935 --- /dev/null +++ b/Core/Src/ShiftReg.c @@ -0,0 +1,52 @@ +/* + * ShiftReg.c + * + * Created on: Aug 25, 2024 + * Author: DashyFox + */ +#include "ShiftReg.h" + +void SetShiftReg_inline(unsigned char b1, unsigned char b2, unsigned char b3){ + unsigned char shiftreg[3] = {b1,b2,b3}; + SetShiftReg(shiftreg); +} + +void SetShiftReg(unsigned char shiftreg[3]) +{ + for (unsigned char i = 0; i < 3; i++) + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + for (unsigned char j = 0; j < 8; j++) + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // ��� �������� + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + + if (((shiftreg[i] >> j) & 0x01) == 0x01) + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); + } + else + { + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); + } + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // ��� �������� + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + } + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + } +} diff --git a/Core/Src/SimpleTimer.c b/Core/Src/SimpleTimer.c new file mode 100644 index 0000000..0cc6a3c --- /dev/null +++ b/Core/Src/SimpleTimer.c @@ -0,0 +1,12 @@ +/* + * SimpleTimer.c + * + * Created on: Aug 25, 2024 + * Author: DashyFox + */ + +#include "SimpleTimer.h" + +uint32_t millis(){ + return HAL_GetTick()*10; +} diff --git a/Core/Src/main.c b/Core/Src/main.c index b54c5cc..44ec0e1 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -23,11 +23,17 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include "GlobalDefines.h" + #include "usbd_cdc_if.h" #include "pca9685.h" #include "IR.h" +#include "IR_CMD_Handler.h" #include "EEPROM.h" #include "Print.h" +#include "SimpleTimer.h" +#include "RobotFunctions.h" +#include "ShiftReg.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -62,6 +68,8 @@ uint8_t velosety[600]; uint8_t rxcomlite = 0; uint8_t initcomlete = 0; +uint8_t uart_rx_buffer[64]; + unsigned char Shiftreg[3]; uint8_t rejim[60]; // 0 - chislo rejimov, 1-6 - rejim1, 7-12 - rejim2... @@ -76,14 +84,9 @@ uint16_t vi = 0; uint16_t timing1 = 0; uint16_t timing2 = 0; -uint8_t MYIR_command = 0; - -volatile uint32_t millisCounter = 0; -uint32_t previousMillis = 0; - -struct StructShot BufShots[MAX_NUMBER_SHOTS]; -struct StructProgram BufPrograms; -struct StructMacro BufMacro; +struct Shot BufShots[MAX_NUMBER_SHOTS]; +struct Program BufPrograms; +struct Macro BufMacro; extern PCD_HandleTypeDef hpcd_USB_FS; @@ -107,19 +110,12 @@ static void MX_USART3_UART_Init(void); /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ -unsigned char b1 = 1; -unsigned char b2 = 1; -unsigned char b3 = 1; - - IRMenu menu(); - + * @brief The application entry point. + * @retval int + */ int main(void) { - menu.foo(); /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ @@ -206,45 +202,8 @@ initcomlete = 1; /* USER CODE BEGIN WHILE */ while (1) { - if (IRStatus == STATUS_REPEAT) - { - if (IR_Address == 0x01) - { - MYIR_command = IR_Command; - printNumber(MYIR_command); - // CDC_Transmit_FS(&MYIR_command, 1); - switch (MYIR_command) - { - case IR_FONT_RIGHT: -// if(!(b1>64 || b2> 64|| b3>64)) b1 = 64; -// else -// { -// b1 = b1>>1; -// b2 = b2<<1; -// b3 = b3<<1; -// } - SetShiftReg_inline(b1, b2, b3); - break; - case IR_FRONT_MID: - SetShiftReg_inline(0, 0, 0); - b1=b2=b3=0; - break; - case IR_FRONT_LEFT: -// if(!b3) -// b3 = 128; -// b3 = b3>>1; -// if(!b3) -// b2 = 64; - SetShiftReg_inline(++b1, ++b2, ++b3); - break; - - default: - break; - } - } - ClearIRStatus(); - } + IR_CMD_Handler(); if (rxcomlite == 1) { @@ -388,14 +347,13 @@ initcomlete = 1; // // HAL_Delay(1000); } - uint32_t currentMillis = millisCounter; - if (currentMillis - previousMillis >= 500) - { - previousMillis = currentMillis; - GPIOC->ODR ^= GPIO_PIN_13; - // unsigned char text[] = "Hello\n"; - // printNumber(SysTick->LOAD); - // CDC_Transmit_FS(text, sizeof(text)); + forTimer(blinkTimer, 500) + { + resetForTimer(blinkTimer); + GPIOC->ODR ^= GPIO_PIN_13; + // unsigned char text[] = "Hello\n"; + // printNumber(SysTick->LOAD); + // CDC_Transmit_FS(text, sizeof(text)); } /* USER CODE END WHILE */ @@ -406,9 +364,9 @@ initcomlete = 1; } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; @@ -416,8 +374,8 @@ void SystemClock_Config(void) RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ + * in the RCC_OscInitTypeDef structure. + */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; @@ -431,8 +389,9 @@ void SystemClock_Config(void) } /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; @@ -451,10 +410,10 @@ void SystemClock_Config(void) } /** - * @brief I2C1 Initialization Function - * @param None - * @retval None - */ + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ static void MX_I2C1_Init(void) { @@ -481,13 +440,14 @@ static void MX_I2C1_Init(void) /* USER CODE BEGIN I2C1_Init 2 */ /* USER CODE END I2C1_Init 2 */ + } /** - * @brief TIM1 Initialization Function - * @param None - * @retval None - */ + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ static void MX_TIM1_Init(void) { @@ -559,13 +519,14 @@ static void MX_TIM1_Init(void) /* USER CODE END TIM1_Init 2 */ HAL_TIM_MspPostInit(&htim1); + } /** - * @brief TIM2 Initialization Function - * @param None - * @retval None - */ + * @brief TIM2 Initialization Function + * @param None + * @retval None + */ static void MX_TIM2_Init(void) { @@ -629,13 +590,14 @@ static void MX_TIM2_Init(void) /* USER CODE END TIM2_Init 2 */ HAL_TIM_MspPostInit(&htim2); + } /** - * @brief TIM3 Initialization Function - * @param None - * @retval None - */ + * @brief TIM3 Initialization Function + * @param None + * @retval None + */ static void MX_TIM3_Init(void) { @@ -690,13 +652,14 @@ static void MX_TIM3_Init(void) /* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */ + } /** - * @brief USART3 Initialization Function - * @param None - * @retval None - */ + * @brief USART3 Initialization Function + * @param None + * @retval None + */ static void MX_USART3_UART_Init(void) { @@ -720,20 +683,24 @@ static void MX_USART3_UART_Init(void) Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ - + if (HAL_UART_Receive_IT(&huart3, uart_rx_buffer, UART_BUFFER_SIZE) != HAL_OK) + { + Error_Handler(); + } /* USER CODE END USART3_Init 2 */ + } /** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ + * @brief GPIO Initialization Function + * @param None + * @retval None + */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - /* USER CODE BEGIN MX_GPIO_Init_1 */ - /* USER CODE END MX_GPIO_Init_1 */ +/* USER CODE BEGIN MX_GPIO_Init_1 */ +/* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); @@ -745,7 +712,7 @@ static void MX_GPIO_Init(void) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, LED_DATA_Pin | LED_CLK_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, LED_DATA_Pin|LED_CLK_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : PC13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; @@ -755,7 +722,7 @@ static void MX_GPIO_Init(void) HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pins : LED_DATA_Pin LED_CLK_Pin */ - GPIO_InitStruct.Pin = LED_DATA_Pin | LED_CLK_Pin; + GPIO_InitStruct.Pin = LED_DATA_Pin|LED_CLK_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; @@ -780,8 +747,8 @@ static void MX_GPIO_Init(void) HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI1_IRQn); - /* USER CODE BEGIN MX_GPIO_Init_2 */ - /* USER CODE END MX_GPIO_Init_2 */ +/* USER CODE BEGIN MX_GPIO_Init_2 */ +/* USER CODE END MX_GPIO_Init_2 */ } /* USER CODE BEGIN 4 */ @@ -789,9 +756,9 @@ static void MX_GPIO_Init(void) /* USER CODE END 4 */ /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ @@ -804,14 +771,14 @@ void Error_Handler(void) /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ diff --git a/Core/Src/stm32f1xx_hal_msp.c b/Core/Src/stm32f1xx_hal_msp.c index a3df3cd..a2af650 100644 --- a/Core/Src/stm32f1xx_hal_msp.c +++ b/Core/Src/stm32f1xx_hal_msp.c @@ -348,6 +348,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(RX_GPIO_Port, &GPIO_InitStruct); + /* USART3 interrupt Init */ + HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspInit 1 */ /* USER CODE END USART3_MspInit 1 */ @@ -378,6 +381,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOB, TX_Pin|RX_Pin); + /* USART3 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspDeInit 1 */ /* USER CODE END USART3_MspDeInit 1 */ diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index cc2ec22..0c82535 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -1,20 +1,20 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32f1xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32f1xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -27,6 +27,8 @@ #include "usb_device.h" #include "usbd_cdc_if.h" + +#include "GlobalDefines.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -46,43 +48,39 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ -extern volatile uint32_t millisCounter; uint8_t myi; -//uint8_t ticktime = 0; //����������-������� ����������� ����� 0,01 � -uint8_t update1 = 0; //���� ������������ ������� ������� 0 ��� 1 +// uint8_t ticktime = 0; //����������-������� ����������� ����� 0,01 � +uint8_t update1 = 0; // ���� ������������ ������� ������� 0 ��� 1 uint8_t update2 = 0; -extern uint16_t vi; //������� ���������� ������ ��� �� 0..599 -uint16_t v1[30]; //������ ��������� (�������) [0] - ����� ���������, [1-29] - ������ +extern uint16_t vi; // ������� ���������� ������ ��� �� 0..599 +uint16_t v1[30]; // ������ ��������� (�������) [0] - ����� ���������, [1-29] - ������ uint16_t v2[30]; -uint32_t vt1 = 0; //����������� �������� (�� ������� ���������) (�������) +uint32_t vt1 = 0; // ����������� �������� (�� ������� ���������) (�������) uint32_t vt2 = 0; -uint16_t vs1[4] = {0,0,0,0}; //������ ����������� �������� �� 3 ��������� -uint16_t vs2[4] = {0,0,0,0}; //[0] - ������� �������� �������� - //[1-3] - �������� �� vt +uint16_t vs1[4] = {0, 0, 0, 0}; // ������ ����������� �������� �� 3 ��������� +uint16_t vs2[4] = {0, 0, 0, 0}; //[0] - ������� �������� �������� + //[1-3] - �������� �� vt -uint32_t vsk1 = 0; //���������� ������� �������� (�������) +uint32_t vsk1 = 0; // ���������� ������� �������� (�������) uint32_t vsk2 = 0; -uint16_t Vzad1 = 0; //������� �������� �������� ������ -uint16_t Vupr1 = 0; //������� ��� �������� ������ - -uint16_t Vzad2 = 0; //������� �������� ������� ������ -uint16_t Vupr2 = 0; //������� ��� ������� ������ - - -extern uint8_t rejim[60]; // 0 - chislo rejimov, 1-6 - rejim1, 7-12 - rejim2... -extern uint8_t avto; // vkl/otkl avtomaticheskoi raboti -extern uint8_t rejim_number; // nomer tekyshego rejima +uint16_t Vzad1 = 0; // ������� �������� �������� ������ +uint16_t Vupr1 = 0; // ������� ��� �������� ������ +uint16_t Vzad2 = 0; // ������� �������� ������� ������ +uint16_t Vupr2 = 0; // ������� ��� ������� ������ +extern uint8_t rejim[60]; // 0 - chislo rejimov, 1-6 - rejim1, 7-12 - rejim2... +extern uint8_t avto; // vkl/otkl avtomaticheskoi raboti +extern uint8_t rejim_number; // nomer tekyshego rejima extern uint8_t initcomlete; -extern uint16_t timing1; //���������� �������� -extern uint16_t timing2; //���������� �������� -extern uint8_t velosety[600]; //����� � ������� ��� �� +extern uint16_t timing1; // ���������� �������� +extern uint16_t timing2; // ���������� �������� +extern uint8_t velosety[600]; // ����� � ������� ��� �� extern uint8_t Vz1; extern uint8_t Vz2; @@ -99,49 +97,84 @@ int32_t computePID2(uint16_t input, uint16_t setpoint); /* USER CODE BEGIN 0 */ int32_t computePID1(uint16_t input, uint16_t setpoint) { - static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ + static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ - int32_t err = setpoint - input; //1.������ + int32_t err = setpoint - input; // 1.������ - integral = integral + err/20; //2.������������ ������������ dt = 0.01, ki = 5; + integral = integral + err / 20; // 2.������������ ������������ dt = 0.01, ki = 5; - if (integral > 4000) { integral = 4000;} - if (integral < 0) { integral = 0;} + if (integral > 4000) + { + integral = 4000; + } + if (integral < 0) + { + integral = 0; + } - int32_t D = (err - prevErr); //3.���������������� ������������ dt = 0.01, kd = 0.01 - if (D > 4000) { D = 4000;} - if (D < 0) { D = 0;} + int32_t D = (err - prevErr); // 3.���������������� ������������ dt = 0.01, kd = 0.01 + if (D > 4000) + { + D = 4000; + } + if (D < 0) + { + D = 0; + } - prevErr = err; - // - int32_t Rout = ((err * 3)>>1) + integral + D; //4. �=1,5 + �=5 + �=0.01 - if (Rout > 4000) { Rout = 4000;} // - if (Rout < 0) { Rout = 0;} // + prevErr = err; + // + int32_t Rout = ((err * 3) >> 1) + integral + D; // 4. �=1,5 + �=5 + �=0.01 + if (Rout > 4000) + { + Rout = 4000; + } // + if (Rout < 0) + { + Rout = 0; + } // - return Rout; + return Rout; } - int32_t computePID2(uint16_t input, uint16_t setpoint) { - static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ - int32_t err = setpoint - input; //1.������ + static int32_t integral = 0, prevErr = 0; // ������������ ������������ � ���������� ������ + int32_t err = setpoint - input; // 1.������ - integral = integral + err/20; //2.������������ ������������ dt = 0.01, ki = 5; - if (integral > 4000) { integral = 4000;} - if (integral < 0) { integral = 0;} + integral = integral + err / 20; // 2.������������ ������������ dt = 0.01, ki = 5; + if (integral > 4000) + { + integral = 4000; + } + if (integral < 0) + { + integral = 0; + } - int32_t D = (err - prevErr); //3.���������������� ������������ dt = 0.01, kd = 0.01 - if (D > 4000) { D = 4000;} - if (D < 0) { D = 0;} + int32_t D = (err - prevErr); // 3.���������������� ������������ dt = 0.01, kd = 0.01 + if (D > 4000) + { + D = 4000; + } + if (D < 0) + { + D = 0; + } - prevErr = err; - // - int32_t Rout = ((err * 3)>>1) + integral + D; //4. �=1,5 + �=5 + �=0.01 - if (Rout > 4000) { Rout = 4000;} // - if (Rout < 0) { Rout = 0;} // + prevErr = err; + // + int32_t Rout = ((err * 3) >> 1) + integral + D; // 4. �=1,5 + �=5 + �=0.01 + if (Rout > 4000) + { + Rout = 4000; + } // + if (Rout < 0) + { + Rout = 0; + } // - return Rout; + return Rout; } /* USER CODE END 0 */ @@ -149,6 +182,7 @@ int32_t computePID2(uint16_t input, uint16_t setpoint) extern PCD_HandleTypeDef hpcd_USB_FS; extern I2C_HandleTypeDef hi2c1; extern TIM_HandleTypeDef htim3; +extern UART_HandleTypeDef huart3; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -165,7 +199,7 @@ void NMI_Handler(void) /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) + while (1) { } /* USER CODE END NonMaskableInt_IRQn 1 */ @@ -277,95 +311,166 @@ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ - //��������� ������� ��������� ��������� 1 - if (v1[0] > 0) { //��������� ���� �� ���������� ������ � ������ ��������� - //������� ������� �������� - vt1 = 0; - for (uint8_t i = 1; i <= v1[0]; i++) { vt1 += v1[i]; } - vt1 = vt1/v1[0]; - //���� �� ����� ������ ���, �� ����� ��������� ���������� �������� - //�������� - } - else {vt1 = timing1; } - v1[0] = 0; // �������� ������� ��������� ������� ��������� - // ������ ������ �������� ������ + // ��������� ������� ��������� ��������� 1 + if (v1[0] > 0) + { // ��������� ���� �� ���������� ������ � ������ ��������� + // ������� ������� �������� + vt1 = 0; + for (uint8_t i = 1; i <= v1[0]; i++) + { + vt1 += v1[i]; + } + vt1 = vt1 / v1[0]; + // ���� �� ����� ������ ���, �� ����� ��������� ���������� �������� + // �������� + } + else + { + vt1 = timing1; + } + v1[0] = 0; // �������� ������� ��������� ������� ��������� + // ������ ������ �������� ������ + // ��������� ������� ��������� ��������� 2 + if (v2[0] > 0) + { // ��������� ���� �� ���������� ������ � ������ ��������� + // ������� ������� �������� + vt2 = 0; + for (uint8_t i = 1; i <= v2[0]; i++) + { + vt2 += v2[i]; + } + vt2 = vt2 / v2[0]; + // ���� �� ����� ������ ���, �� ����� ��������� ���������� �������� + // �������� + } + else + { + vt2 = timing2; + } + v2[0] = 0; // �������� ������� ��������� ������� ��������� + // ������ ������ �������� ������ - //��������� ������� ��������� ��������� 2 - if (v2[0] > 0) { //��������� ���� �� ���������� ������ � ������ ��������� - //������� ������� �������� - vt2 = 0; - for (uint8_t i = 1; i <= v2[0]; i++) { vt2 += v2[i]; } - vt2 = vt2/v2[0]; - //���� �� ����� ������ ���, �� ����� ��������� ���������� �������� - //�������� - } - else {vt2 = timing2; } - v2[0] = 0; // �������� ������� ��������� ������� ��������� - // ������ ������ �������� ������ + // ���������� ������� �� 3 + if (vs1[0] < 3) + { + vs1[vs1[0] + 1] = (uint16_t)vt1; + vs1[0]++; + } + else + { + vs1[0] = 0; + vs1[vs1[0] + 1] = (uint16_t)vt1; + vs1[0]++; + } + vsk1 = (vs1[1] + vs1[2] + vs1[3]) / 3; - //���������� ������� �� 3 -if (vs1[0] < 3) { vs1[vs1[0]+1] = (uint16_t)vt1; vs1[0]++; } else - {vs1[0] = 0; vs1[vs1[0]+1] = (uint16_t)vt1; vs1[0]++; } + if (vs2[0] < 3) + { + vs2[vs2[0] + 1] = (uint16_t)vt2; + vs2[0]++; + } + else + { + vs2[0] = 0; + vs2[vs2[0] + 1] = (uint16_t)vt2; + vs2[0]++; + } - vsk1 = (vs1[1]+vs1[2]+vs1[3])/3; + vsk2 = (vs2[1] + vs2[2] + vs2[3]) / 3; -if (vs2[0] < 3) { vs2[vs2[0]+1] = (uint16_t)vt2; vs2[0]++; } else - {vs2[0] = 0; vs2[vs2[0]+1] = (uint16_t)vt2; vs2[0]++; } + // ������� ������� ����� ���������� � �������� 60*1000000/(�*10) + if (vsk1 != 0) + { + vsk1 = 6000000 / vsk1; + } + else + { + vsk1 = 0; + } + if (vsk1 > 10000) vsk1 = 10000; + if (vsk1 < 150) vsk1 = 0; - vsk2 = (vs2[1]+vs2[2]+vs2[3])/3; + if (vsk2 != 0) + { + vsk2 = 6000000 / vsk2; + } + else + { + vsk2 = 0; + } + if (vsk2 > 10000) + vsk2 = 10000; + if (vsk2 < 150) + vsk2 = 0; + // ������� ��������� �������� 0 - 200 � -8000 ... 8000 ��./���. + if (Vz1 > 100) + { + Vzad1 = (Vz1 - 100) * 80; + } + else + { + Vzad1 = (100 - Vz1) * 80; + } + if (Vz2 > 100) + { + Vzad2 = (Vz2 - 100) * 80; + } + else + { + Vzad2 = (100 - Vz2) * 80; + } - // ������� ������� ����� ���������� � �������� 60*1000000/(�*10) - if (vsk1 != 0) {vsk1 = 6000000/vsk1;} else { vsk1 = 0;} - if (vsk1 > 10000) vsk1 = 10000; - if (vsk1 < 150) vsk1 = 0; + // ��������� + Vupr1 = (uint16_t)computePID1(vsk1, Vzad1); + Vupr2 = (uint16_t)computePID2(vsk2, Vzad2); - if (vsk2 != 0) {vsk2 = 6000000/vsk2;} else { vsk2 = 0;} - if (vsk2 > 10000) vsk2 = 10000; - if (vsk2 < 150) vsk2 = 0; + if (Vz1 > 100) + { + TIM2->CCR2 = 0; + TIM2->CCR1 = Vupr1; + } + else + { + TIM2->CCR1 = 0; + TIM2->CCR2 = Vupr1; + } + if (Vz2 > 100) + { + TIM2->CCR3 = 0; + TIM2->CCR4 = Vupr2; + } + else + { + TIM2->CCR4 = 0; + TIM2->CCR3 = Vupr2; + } - // ������� ��������� �������� 0 - 200 � -8000 ... 8000 ��./���. - if (Vz1 > 100) { Vzad1 = (Vz1 - 100)*80; } else { Vzad1 = (100 - Vz1)*80; } - if (Vz2 > 100) { Vzad2 = (Vz2 - 100)*80; } else { Vzad2 = (100 - Vz2)*80; } + // ������ ���������� �������� � ����� ��� �� + if (vi < 600) + { + velosety[vi] = LOBYTE(timing1); + velosety[vi + 1] = HIBYTE(timing1); + velosety[vi + 2] = LOBYTE(vsk1); + velosety[vi + 3] = HIBYTE(vsk1); + velosety[vi + 4] = LOBYTE(vsk2); + velosety[vi + 5] = HIBYTE(vsk2); + vi = vi + 6; + } - // ��������� - Vupr1 = (uint16_t)computePID1(vsk1, Vzad1); - Vupr2 = (uint16_t)computePID2(vsk2, Vzad2); + // else + // {vi = 0; + // velosety[vi] = LOBYTE(timing1); + // velosety[vi+1] = HIBYTE(timing1); + // velosety[vi+2] = LOBYTE(vt); + // velosety[vi+3] = HIBYTE(vt); + // velosety[vi+4] = LOBYTE(vsk); + // velosety[vi+5] = HIBYTE(vsk); + // vi = vi + 6; } - if (Vz1 > 100) { TIM2->CCR2 = 0; TIM2->CCR1 = Vupr1;} else - { TIM2->CCR1 = 0; TIM2->CCR2 = Vupr1;} - - if (Vz2 > 100) { TIM2->CCR3 = 0; TIM2->CCR4 = Vupr2;} else - { TIM2->CCR4 = 0; TIM2->CCR3 = Vupr2;} - - - // ������ ���������� �������� � ����� ��� �� -if (vi < 600) { velosety[vi] = LOBYTE(timing1); - velosety[vi+1] = HIBYTE(timing1); - velosety[vi+2] = LOBYTE(vsk1); - velosety[vi+3] = HIBYTE(vsk1); - velosety[vi+4] = LOBYTE(vsk2); - velosety[vi+5] = HIBYTE(vsk2); - vi = vi + 6; } - - // else - // {vi = 0; - // velosety[vi] = LOBYTE(timing1); - // velosety[vi+1] = HIBYTE(timing1); - // velosety[vi+2] = LOBYTE(vt); - // velosety[vi+3] = HIBYTE(vt); - // velosety[vi+4] = LOBYTE(vsk); - // velosety[vi+5] = HIBYTE(vsk); - // vi = vi + 6; } - - - - - - millisCounter+=10; // костыльная примерная коррекция /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ @@ -386,17 +491,22 @@ if (vi < 600) { velosety[vi] = LOBYTE(timing1); void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ - if (avto == 1) { if (rejim_number < rejim[0]) rejim_number++; else rejim_number = 1; + if (avto == 1) + { + if (rejim_number < rejim[0]) + rejim_number++; + else + rejim_number = 1; - SetServo(0, rejim[1 + (rejim_number-1)*6] ); - SetServo(1, rejim[2 + (rejim_number-1)*6] ); - SetServo(2, rejim[3 + (rejim_number-1)*6] ); - Vz1 = rejim[4 + (rejim_number-1)*6]; - Vz2 = rejim[5 + (rejim_number-1)*6]; - TIM1->CCR1 = 0; TIM1->CCR2 = (uint16_t)(40*rejim[6 + (rejim_number-1)*6]); - vi = 0; // zapis grafika start - - } + SetServo(0, rejim[1 + (rejim_number - 1) * 6]); + SetServo(1, rejim[2 + (rejim_number - 1) * 6]); + SetServo(2, rejim[3 + (rejim_number - 1) * 6]); + Vz1 = rejim[4 + (rejim_number - 1) * 6]; + Vz2 = rejim[5 + (rejim_number - 1) * 6]; + TIM1->CCR1 = 0; + TIM1->CCR2 = (uint16_t)(40 * rejim[6 + (rejim_number - 1) * 6]); + vi = 0; // zapis grafika start + } /* USER CODE END EXTI0_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(BALL_EXT_Pin); /* USER CODE BEGIN EXTI0_IRQn 1 */ @@ -410,7 +520,7 @@ void EXTI0_IRQHandler(void) void EXTI1_IRQHandler(void) { /* USER CODE BEGIN EXTI1_IRQn 0 */ - IR_handler(); + IR_handler(); /* USER CODE END EXTI1_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(IR_EXT_Pin); /* USER CODE BEGIN EXTI1_IRQn 1 */ @@ -439,70 +549,82 @@ void TIM3_IRQHandler(void) { /* USER CODE BEGIN TIM3_IRQn 0 */ - static uint32_t prev_capture1 = 0; - static uint32_t prev_capture2 = 0; + static uint32_t prev_capture1 = 0; + static uint32_t prev_capture2 = 0; - uint32_t current_capture1 = 0; - uint32_t current_capture2 = 0; - uint32_t elapsed_time1 = 0; - uint32_t elapsed_time2 = 0; + uint32_t current_capture1 = 0; + uint32_t current_capture2 = 0; + uint32_t elapsed_time1 = 0; + uint32_t elapsed_time2 = 0; - /* USER CODE BEGIN TIM3_IRQn 0 */ + /* USER CODE BEGIN TIM3_IRQn 0 */ - // Обработка переполнения таймера - if (TIM3->SR & TIM_SR_UIF) - { - // Сброс флага переполнения - TIM3->SR &= ~TIM_SR_UIF; - } + // Обработка переполнения таймера + if (TIM3->SR & TIM_SR_UIF) + { + // Сброс флага переполнения + TIM3->SR &= ~TIM_SR_UIF; + } - // Обработка захвата сигнала для канала 1 - if (TIM3->SR & TIM_SR_CC1IF) - { - current_capture1 = TIM3->CCR1; + // Обработка захвата сигнала для канала 1 + if (TIM3->SR & TIM_SR_CC1IF) + { + current_capture1 = TIM3->CCR1; - if (current_capture1 >= prev_capture1) { - elapsed_time1 = current_capture1 - prev_capture1; - } else { - // Учёт переполнения таймера - elapsed_time1 = (65000 - prev_capture1) + current_capture1 + 1; - } + if (current_capture1 >= prev_capture1) + { + elapsed_time1 = current_capture1 - prev_capture1; + } + else + { + // Учёт переполнения таймера + elapsed_time1 = (65000 - prev_capture1) + current_capture1 + 1; + } - // Ограничение значения для сохранения в 16-битную переменную - if (elapsed_time1 > 65535) { - timing1 = 65535; // Максимальное значение - } else { - timing1 = (uint16_t)elapsed_time1; - } + // Ограничение значения для сохранения в 16-битную переменную + if (elapsed_time1 > 65535) + { + timing1 = 65535; // Максимальное значение + } + else + { + timing1 = (uint16_t)elapsed_time1; + } - prev_capture1 = current_capture1; - TIM3->SR &= ~TIM_SR_CC1IF; // Сброс флага захвата сигнала - update1 = 0; - } + prev_capture1 = current_capture1; + TIM3->SR &= ~TIM_SR_CC1IF; // Сброс флага захвата сигнала + update1 = 0; + } - // Обработка захвата сигнала для канала 2 - if (TIM3->SR & TIM_SR_CC2IF) - { - current_capture2 = TIM3->CCR2; + // Обработка захвата сигнала для канала 2 + if (TIM3->SR & TIM_SR_CC2IF) + { + current_capture2 = TIM3->CCR2; - if (current_capture2 >= prev_capture2) { - elapsed_time2 = current_capture2 - prev_capture2; - } else { - // Учёт переполнения таймера - elapsed_time2 = (65000 - prev_capture2) + current_capture2 + 1; - } + if (current_capture2 >= prev_capture2) + { + elapsed_time2 = current_capture2 - prev_capture2; + } + else + { + // Учёт переполнения таймера + elapsed_time2 = (65000 - prev_capture2) + current_capture2 + 1; + } - // Ограничение значения для сохранения в 16-битную переменную - if (elapsed_time2 > 65535) { - timing2 = 65535; // Максимальное значение - } else { - timing2 = (uint16_t)elapsed_time2; - } + // Ограничение значения для сохранения в 16-битную переменную + if (elapsed_time2 > 65535) + { + timing2 = 65535; // Максимальное значение + } + else + { + timing2 = (uint16_t)elapsed_time2; + } - prev_capture2 = current_capture2; - TIM3->SR &= ~TIM_SR_CC2IF; // Сброс флага захвата сигнала - update2 = 0; - } + prev_capture2 = current_capture2; + TIM3->SR &= ~TIM_SR_CC2IF; // Сброс флага захвата сигнала + update2 = 0; + } /* USER CODE END TIM3_IRQn 0 */ HAL_TIM_IRQHandler(&htim3); @@ -539,6 +661,22 @@ void I2C1_ER_IRQHandler(void) /* USER CODE END I2C1_ER_IRQn 1 */ } +/** + * @brief This function handles USART3 global interrupt. + */ +void USART3_IRQHandler(void) +{ + /* USER CODE BEGIN USART3_IRQn 0 */ + CDC_Transmit_FS(uart_rx_buffer, UART_BUFFER_SIZE); + HAL_UART_Receive_IT(&huart3, uart_rx_buffer, UART_BUFFER_SIZE); + + /* USER CODE END USART3_IRQn 0 */ + HAL_UART_IRQHandler(&huart3); + /* USER CODE BEGIN USART3_IRQn 1 */ + + /* USER CODE END USART3_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/StackSport.ioc b/StackSport.ioc index 71b1cd1..f975b2d 100644 --- a/StackSport.ioc +++ b/StackSport.ioc @@ -69,6 +69,7 @@ NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.USB_LP_CAN1_RX0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PA0-WKUP.GPIOParameters=GPIO_Label