| @@ -36,7 +36,13 @@ extern "C" { | |||||
| /* Exported types ------------------------------------------------------------*/ | /* Exported types ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN ET */ | /* USER CODE BEGIN ET */ | ||||
| extern uint8_t ArrFlag; /* 加速度Flag */ | |||||
| extern float Acc; /* 加速度 */ | |||||
| extern uint8_t PulseNum; /* 脉冲段计数 */ | |||||
| extern uint32_t AllPulseCNT; | |||||
| extern uint8_t EndFlag; | |||||
| extern uint8_t FullFlag; | |||||
| /* USER CODE END ET */ | /* USER CODE END ET */ | ||||
| /* Exported constants --------------------------------------------------------*/ | /* Exported constants --------------------------------------------------------*/ | ||||
| @@ -57,6 +63,14 @@ void Error_Handler(void); | |||||
| /* USER CODE END EFP */ | /* USER CODE END EFP */ | ||||
| /* Private defines -----------------------------------------------------------*/ | /* Private defines -----------------------------------------------------------*/ | ||||
| #define Y15_Pin GPIO_PIN_6 | |||||
| #define Y15_GPIO_Port GPIOH | |||||
| #define Y14_Pin GPIO_PIN_7 | |||||
| #define Y14_GPIO_Port GPIOH | |||||
| #define Y13_Pin GPIO_PIN_8 | |||||
| #define Y13_GPIO_Port GPIOH | |||||
| #define Y12_Pin GPIO_PIN_9 | |||||
| #define Y12_GPIO_Port GPIOH | |||||
| /* USER CODE BEGIN Private defines */ | /* USER CODE BEGIN Private defines */ | ||||
| @@ -55,7 +55,7 @@ void SVC_Handler(void); | |||||
| void DebugMon_Handler(void); | void DebugMon_Handler(void); | ||||
| void PendSV_Handler(void); | void PendSV_Handler(void); | ||||
| void SysTick_Handler(void); | void SysTick_Handler(void); | ||||
| void TIM1_BRK_TIM9_IRQHandler(void); | |||||
| void TIM2_IRQHandler(void); | |||||
| void USART1_IRQHandler(void); | void USART1_IRQHandler(void); | ||||
| void DMA2_Stream2_IRQHandler(void); | void DMA2_Stream2_IRQHandler(void); | ||||
| void DMA2_Stream7_IRQHandler(void); | void DMA2_Stream7_IRQHandler(void); | ||||
| @@ -32,7 +32,7 @@ extern "C" { | |||||
| /* USER CODE END Includes */ | /* USER CODE END Includes */ | ||||
| extern TIM_HandleTypeDef htim9; | |||||
| extern TIM_HandleTypeDef htim2; | |||||
| extern TIM_HandleTypeDef htim10; | extern TIM_HandleTypeDef htim10; | ||||
| @@ -40,7 +40,7 @@ extern TIM_HandleTypeDef htim10; | |||||
| /* USER CODE END Private defines */ | /* USER CODE END Private defines */ | ||||
| void MX_TIM9_Init(void); | |||||
| void MX_TIM2_Init(void); | |||||
| void MX_TIM10_Init(void); | void MX_TIM10_Init(void); | ||||
| void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); | void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); | ||||
| @@ -35,7 +35,12 @@ extern "C" { | |||||
| extern UART_HandleTypeDef huart1; | extern UART_HandleTypeDef huart1; | ||||
| /* USER CODE BEGIN Private defines */ | /* USER CODE BEGIN Private defines */ | ||||
| #define RX_BUFFER_SIZE 1024 | |||||
| extern uint8_t RX1DataTemp; | |||||
| extern uint8_t RX1Data[RX_BUFFER_SIZE]; | |||||
| extern uint8_t RX1Flag; | |||||
| extern volatile uint16_t RX1Count; | |||||
| /* USER CODE END Private defines */ | /* USER CODE END Private defines */ | ||||
| void MX_USART1_UART_Init(void); | void MX_USART1_UART_Init(void); | ||||
| @@ -45,20 +45,19 @@ void MX_GPIO_Init(void) | |||||
| GPIO_InitTypeDef GPIO_InitStruct = {0}; | GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
| /* GPIO Ports Clock Enable */ | /* GPIO Ports Clock Enable */ | ||||
| __HAL_RCC_GPIOI_CLK_ENABLE(); | |||||
| __HAL_RCC_GPIOF_CLK_ENABLE(); | __HAL_RCC_GPIOF_CLK_ENABLE(); | ||||
| __HAL_RCC_GPIOH_CLK_ENABLE(); | __HAL_RCC_GPIOH_CLK_ENABLE(); | ||||
| __HAL_RCC_GPIOA_CLK_ENABLE(); | __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
| /*Configure GPIO pin Output Level */ | /*Configure GPIO pin Output Level */ | ||||
| HAL_GPIO_WritePin(GPIOI, GPIO_PIN_8, GPIO_PIN_RESET); | |||||
| HAL_GPIO_WritePin(GPIOH, Y15_Pin|Y14_Pin|Y13_Pin|Y12_Pin, GPIO_PIN_RESET); | |||||
| /*Configure GPIO pin : PI8 */ | |||||
| GPIO_InitStruct.Pin = GPIO_PIN_8; | |||||
| /*Configure GPIO pins : PHPin PHPin PHPin PHPin */ | |||||
| GPIO_InitStruct.Pin = Y15_Pin|Y14_Pin|Y13_Pin|Y12_Pin; | |||||
| GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
| GPIO_InitStruct.Pull = GPIO_NOPULL; | GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
| GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
| HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); | |||||
| HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); | |||||
| } | } | ||||
| @@ -26,13 +26,18 @@ | |||||
| /* Private includes ----------------------------------------------------------*/ | /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | /* USER CODE BEGIN Includes */ | ||||
| #include "PLSR.h" | #include "PLSR.h" | ||||
| #include "includes.h" | |||||
| #include "includes.h" | |||||
| #include "modbus.h" | |||||
| /* USER CODE END Includes */ | /* USER CODE END Includes */ | ||||
| /* Private typedef -----------------------------------------------------------*/ | /* Private typedef -----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PTD */ | /* USER CODE BEGIN PTD */ | ||||
| uint8_t ArrFlag = 0; /* 加速度Flag */ | uint8_t ArrFlag = 0; /* 加速度Flag */ | ||||
| int32_t Acc; /* 加速度 */ | |||||
| float Acc; /* 加速度 */ | |||||
| uint32_t AllPulseCNT = 0; | |||||
| uint8_t EndFlag = 0; | |||||
| uint8_t FullFlag = 0; | |||||
| /* USER CODE END PTD */ | /* USER CODE END PTD */ | ||||
| /* Private define ------------------------------------------------------------*/ | /* Private define ------------------------------------------------------------*/ | ||||
| @@ -54,7 +59,7 @@ int32_t Acc; /* | |||||
| /* Private function prototypes -----------------------------------------------*/ | /* Private function prototypes -----------------------------------------------*/ | ||||
| void SystemClock_Config(void); | void SystemClock_Config(void); | ||||
| /* USER CODE BEGIN PFP */ | /* USER CODE BEGIN PFP */ | ||||
| void PVD_Init(void); | |||||
| /* USER CODE END PFP */ | /* USER CODE END PFP */ | ||||
| /* Private user code ---------------------------------------------------------*/ | /* Private user code ---------------------------------------------------------*/ | ||||
| @@ -62,20 +67,28 @@ void SystemClock_Config(void); | |||||
| /* 任务优先级 */ | /* 任务优先级 */ | ||||
| #define TASK_Y1Direction 4 | #define TASK_Y1Direction 4 | ||||
| #define TASK_PulseStart 4 | |||||
| #define TASK_DirOutput 4 | |||||
| /* 任务堆栈大小 */ | /* 任务堆栈大小 */ | ||||
| #define Task_Y1Direction_SIZE 256 | |||||
| #define Task_Y1Direction_SIZE 256 | |||||
| #define Task_PulseStart_SIZE 256 | |||||
| #define Task_DirOutput_SIZE 256 | |||||
| /* 任务控制块 */ | /* 任务控制块 */ | ||||
| OS_TCB Y1Direction_Tsk; | |||||
| OS_TCB Y1Direction_Tsk; | |||||
| OS_TCB PulseStart_Tsk; | |||||
| OS_TCB DirOutput_Tsk; | |||||
| /* 任务栈 */ | /* 任务栈 */ | ||||
| CPU_STK Task_Y1Direction_STK[Task_Y1Direction_SIZE]; | CPU_STK Task_Y1Direction_STK[Task_Y1Direction_SIZE]; | ||||
| CPU_STK Task_PulseStart_STK[Task_PulseStart_SIZE]; | |||||
| CPU_STK Task_DirOutput_STK[Task_DirOutput_SIZE]; | |||||
| /* 任务函数 */ | /* 任务函数 */ | ||||
| void Y1Direction(void *p_arg); | void Y1Direction(void *p_arg); | ||||
| void PulseStartTsk(void *p_arg); | |||||
| void DirOutput(void *p_arg); | |||||
| /* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||
| @@ -95,14 +108,16 @@ int main(void) | |||||
| HAL_Init(); | HAL_Init(); | ||||
| /* USER CODE BEGIN Init */ | /* USER CODE BEGIN Init */ | ||||
| PVD_Init(); | |||||
| /* USER CODE END Init */ | /* USER CODE END Init */ | ||||
| /* Configure the system clock */ | /* Configure the system clock */ | ||||
| SystemClock_Config(); | SystemClock_Config(); | ||||
| /* USER CODE BEGIN SysInit */ | /* USER CODE BEGIN SysInit */ | ||||
| HAL_PWR_EnableBkUpAccess();/* 使能备份域访问 */ | |||||
| __HAL_RCC_BKPSRAM_CLK_ENABLE();/* 使能备份SRAM时钟 */ | |||||
| HAL_PWREx_EnableBkUpReg();/* 使能备份SRAM */ | |||||
| /* USER CODE END SysInit */ | /* USER CODE END SysInit */ | ||||
| /* Initialize all configured peripherals */ | /* Initialize all configured peripherals */ | ||||
| @@ -110,38 +125,64 @@ int main(void) | |||||
| MX_DMA_Init(); | MX_DMA_Init(); | ||||
| MX_USART1_UART_Init(); | MX_USART1_UART_Init(); | ||||
| MX_TIM10_Init(); | MX_TIM10_Init(); | ||||
| MX_TIM9_Init(); | |||||
| MX_TIM2_Init(); | |||||
| /* USER CODE BEGIN 2 */ | /* USER CODE BEGIN 2 */ | ||||
| PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0 | |||||
| AccCount = 50; | |||||
| // PulseInit(0, 0, 0);//设置为第0段脉冲开始,相对模式, 最大脉冲为0 | |||||
| // Base.AccCount = 50; | |||||
| SetPulse(0, 1, 5, 0, 1); | |||||
| // SetPulse(1, 100, 200, 0, -1); | |||||
| PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲 | |||||
| AddPulse(1, 100, -200, 0); | |||||
| AddPulse(2, 1, 55, 0); | |||||
| __HAL_TIM_SET_AUTORELOAD(&htim9,5-1); //设置要输出的PWM脉冲数 5个 | |||||
| HAL_TIM_Base_Start_IT(&htim9); //启动从定时器 | |||||
| // PulseStart(); //开始产生脉冲 | |||||
| // HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1); //启动主定时器PWM输出 | |||||
| BSP_Init(); | |||||
| BSP_Init(); | |||||
| OSInit(&err); | OSInit(&err); | ||||
| OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */ | |||||
| (CPU_CHAR* )"Y1Direction", /* 任务名字 */ | |||||
| (OS_TASK_PTR)Y1Direction, /* 任务函数 */ | |||||
| (void * )0, /* 传递给任务函数的参数 */ | |||||
| /* 任务1 */ | |||||
| OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */ | |||||
| (CPU_CHAR* )"Y1Direction", /* 任务名字 */ | |||||
| (OS_TASK_PTR)Y1Direction, /* 任务函数 */ | |||||
| (void * )0, /* 传递给任务函数的参数 */ | |||||
| (OS_PRIO )TASK_Y1Direction, /* 任务优先级 */ | (OS_PRIO )TASK_Y1Direction, /* 任务优先级 */ | ||||
| (CPU_STK * )&Task_Y1Direction_STK[0], /* 任务堆栈基地址 */ | (CPU_STK * )&Task_Y1Direction_STK[0], /* 任务堆栈基地址 */ | ||||
| (CPU_STK_SIZE)Task_Y1Direction_SIZE/10, /* 任务堆栈深度限位 */ | (CPU_STK_SIZE)Task_Y1Direction_SIZE/10, /* 任务堆栈深度限位 */ | ||||
| (CPU_STK_SIZE)Task_Y1Direction_SIZE, /* 任务堆栈大小 */ | |||||
| (CPU_STK_SIZE)Task_Y1Direction_SIZE, /* 任务堆栈大小 */ | |||||
| (OS_MSG_QTY)0, /* 任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 */ | (OS_MSG_QTY)0, /* 任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 */ | ||||
| (OS_TICK )0, /* 当使能时间片轮转时的时间片长度,为0时为默认长度 */ | (OS_TICK )0, /* 当使能时间片轮转时的时间片长度,为0时为默认长度 */ | ||||
| (void * )0, /* 用户补充的存储区 */ | (void * )0, /* 用户补充的存储区 */ | ||||
| (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, /* 任务选项 */ | (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, /* 任务选项 */ | ||||
| (OS_ERR * )&err); /* 存放该函数错误时的返回值 */ | (OS_ERR * )&err); /* 存放该函数错误时的返回值 */ | ||||
| /* 任务2 */ | |||||
| OSTaskCreate((OS_TCB * )&PulseStart_Tsk, | |||||
| (CPU_CHAR* )"PulseStartTsk", | |||||
| (OS_TASK_PTR)PulseStartTsk, | |||||
| (void * )0, | |||||
| (OS_PRIO )TASK_PulseStart, | |||||
| (CPU_STK * )&Task_PulseStart_STK[0], | |||||
| (CPU_STK_SIZE)Task_PulseStart_SIZE/10, | |||||
| (CPU_STK_SIZE)Task_PulseStart_SIZE, | |||||
| (OS_MSG_QTY)0, | |||||
| (OS_TICK )0, | |||||
| (void * )0, | |||||
| (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, | |||||
| (OS_ERR * )&err); | |||||
| /* 任务3 */ | |||||
| OSTaskCreate((OS_TCB * )&DirOutput_Tsk, | |||||
| (CPU_CHAR* )"DirOutput_Tsk", | |||||
| (OS_TASK_PTR)DirOutput, | |||||
| (void * )0, | |||||
| (OS_PRIO )TASK_DirOutput, | |||||
| (CPU_STK * )&Task_DirOutput_STK[0], | |||||
| (CPU_STK_SIZE)Task_DirOutput_SIZE/10, | |||||
| (CPU_STK_SIZE)Task_DirOutput_SIZE, | |||||
| (OS_MSG_QTY)0, | |||||
| (OS_TICK )0, | |||||
| (void * )0, | |||||
| (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, | |||||
| (OS_ERR * )&err); | |||||
| OSStart(&err); | OSStart(&err); | ||||
| /* USER CODE END 2 */ | /* USER CODE END 2 */ | ||||
| @@ -174,12 +215,11 @@ void SystemClock_Config(void) | |||||
| /** Initializes the RCC Oscillators according to the specified parameters | /** Initializes the RCC Oscillators according to the specified parameters | ||||
| * in the RCC_OscInitTypeDef structure. | * in the RCC_OscInitTypeDef structure. | ||||
| */ | */ | ||||
| RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |||||
| RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |||||
| RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; | |||||
| RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; | |||||
| RCC_OscInitStruct.HSEState = RCC_HSE_ON; | |||||
| RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | ||||
| RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |||||
| RCC_OscInitStruct.PLL.PLLM = 8; | |||||
| RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | |||||
| RCC_OscInitStruct.PLL.PLLM = 6; | |||||
| RCC_OscInitStruct.PLL.PLLN = 72; | RCC_OscInitStruct.PLL.PLLN = 72; | ||||
| RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; | RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; | ||||
| RCC_OscInitStruct.PLL.PLLQ = 4; | RCC_OscInitStruct.PLL.PLLQ = 4; | ||||
| @@ -206,27 +246,136 @@ void SystemClock_Config(void) | |||||
| /* USER CODE BEGIN 4 */ | /* USER CODE BEGIN 4 */ | ||||
| /** | /** | ||||
| * @brief 任务1,Y1的方向 | |||||
| * @brief 任务1,获取总脉冲数, 脉冲加减速 | |||||
| * @return 无 | * @return 无 | ||||
| */ | */ | ||||
| void Y1Direction(void *p_arg) | void Y1Direction(void *p_arg) | ||||
| { | { | ||||
| p_arg = p_arg; | p_arg = p_arg; | ||||
| OS_ERR err; | |||||
| while(1) | while(1) | ||||
| { | { | ||||
| if (PulseOutput[Base.NowPulse].Direction == 1) | |||||
| /* 脉冲加减速 */ | |||||
| if (ArrFlag == 1) | |||||
| { | { | ||||
| HAL_GPIO_WritePin(GPIOI, GPIO_PIN_8, GPIO_PIN_SET); | |||||
| if(TIM2->CNT < AccCount) | |||||
| { | |||||
| SetFrequency(0, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc); | |||||
| } | |||||
| else | |||||
| { | |||||
| SetFrequency(0, PulseOutput[NowPulse].Frequency); | |||||
| ArrFlag = 0; | |||||
| } | |||||
| } | } | ||||
| else | |||||
| /* 获取总的脉冲数 */ | |||||
| if(EndFlag || FullFlag) | |||||
| { | { | ||||
| HAL_GPIO_WritePin(GPIOI, GPIO_PIN_8, GPIO_PIN_RESET); | |||||
| if(EndFlag) | |||||
| { | |||||
| AllPulseCNT = GetBase(NowPulse) + PulseOutput[NowPulse].PulseCount; | |||||
| } | |||||
| if(FullFlag) | |||||
| { | |||||
| AllPulseCNT = MAX_Pulse; | |||||
| } | |||||
| } | } | ||||
| else | |||||
| { | |||||
| AllPulseCNT = TIM2->CNT + GetBase(NowPulse); | |||||
| } | |||||
| OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * @brief 任务2,脉冲开始 | |||||
| * @return 无 | |||||
| */ | |||||
| void PulseStartTsk(void *p_arg) | |||||
| { | |||||
| p_arg = p_arg; | |||||
| OS_ERR err; | |||||
| uint8_t EN = 1; | |||||
| while(1) | |||||
| { | |||||
| if(Register_L[3000] == 0x01 && EN == 1) | |||||
| { | |||||
| PulseStart(); | |||||
| EN = 0; | |||||
| } | |||||
| else if(Register_L[3000] == 0x02 && EN == 0) | |||||
| { | |||||
| EN = 1; | |||||
| } | |||||
| OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @brief 任务3,脉冲方向输出 | |||||
| * @return 无 | |||||
| */ | |||||
| void DirOutput(void *p_arg) | |||||
| { | |||||
| p_arg = p_arg; | |||||
| OS_ERR err; | |||||
| while(1) | |||||
| { | |||||
| if (Options.DirPost == 0) | |||||
| { | |||||
| if (Options.Dir == 1) | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y12_Pin, GPIO_PIN_SET); | |||||
| } | |||||
| else | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y12_Pin, GPIO_PIN_RESET); | |||||
| } | |||||
| } | |||||
| if (Options.DirPost == 1) | |||||
| { | |||||
| if (Options.Dir == 1) | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y13_Pin, GPIO_PIN_SET); | |||||
| } | |||||
| else | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y13_Pin, GPIO_PIN_RESET); | |||||
| } | |||||
| } | |||||
| if (Options.DirPost == 2) | |||||
| { | |||||
| if (Options.Dir == 1) | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y14_Pin, GPIO_PIN_SET); | |||||
| } | |||||
| else | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y14_Pin, GPIO_PIN_RESET); | |||||
| } | |||||
| } | |||||
| if (Options.DirPost == 3) | |||||
| { | |||||
| if (Options.Dir == 1) | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_SET); | |||||
| } | |||||
| else | |||||
| { | |||||
| HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET); | |||||
| } | |||||
| } | |||||
| OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | |||||
| } | |||||
| } | |||||
| #if 0 | |||||
| /** | /** | ||||
| * @brief 定时器中断回调(PWM计数) | * @brief 定时器中断回调(PWM计数) | ||||
| * @return 无 | * @return 无 | ||||
| @@ -235,26 +384,32 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) | |||||
| { | { | ||||
| if (htim->Instance == TIM10) | if (htim->Instance == TIM10) | ||||
| { | { | ||||
| PulseCount++; | |||||
| if (1 == Base.PulseMod) /* 如果是绝对模式 */ | if (1 == Base.PulseMod) /* 如果是绝对模式 */ | ||||
| { | { | ||||
| if (AllPulseCount == Base.MAX_Pulse) /* 达到了最大脉冲数 */ | |||||
| if (TIM2->CNT == Base.MAX_Pulse) /* 达到了最大脉冲数 */ | |||||
| { | { | ||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | ||||
| HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET); | |||||
| } | } | ||||
| else if(PulseCount == PulseOutput[Base.NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */ | |||||
| else if(PulseCount == PulseOutput[NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */ | |||||
| { | { | ||||
| PulseCount = 0; | PulseCount = 0; | ||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET); | |||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| if(PulseOutput[Base.NowPulse].NextPulse != -1) | |||||
| if(Base.PulseNum - NowPulse >= 1) | |||||
| { | { | ||||
| Base.PrePulse = Base.NowPulse; /* 保存之前的脉冲段 */ | |||||
| Base.NowPulse = PulseOutput[Base.NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| Base.PrePulse = NowPulse; /* 保存之前的脉冲段 */ | |||||
| if(PulseOutput[NowPulse].NextPulse == 0) | |||||
| { | |||||
| NowPulse = NowPulse+ 1; | |||||
| } | |||||
| else | |||||
| { | |||||
| NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| } | |||||
| Acc = GetAcc(PulseOutput[Base.PrePulse].Frequency, | Acc = GetAcc(PulseOutput[Base.PrePulse].Frequency, | ||||
| PulseOutput[Base.NowPulse].Frequency, Base.AccCount); /* 计算Acc */ | |||||
| PulseOutput[NowPulse].Frequency, Base.AccCount); /* 计算Acc */ | |||||
| ArrFlag = 1; | ArrFlag = 1; | ||||
| PulseStart(); //开始产生脉冲 | PulseStart(); //开始产生脉冲 | ||||
| } | } | ||||
| @@ -262,27 +417,32 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) | |||||
| } | } | ||||
| else if (0 == Base.PulseMod) /* 如果是相对模式 */ | else if (0 == Base.PulseMod) /* 如果是相对模式 */ | ||||
| { | { | ||||
| if (PulseCount == PulseOutput[Base.NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */ | |||||
| if (PulseCount == PulseOutput[NowPulse].PulseCount) /* 如果当前段的计数等于要求的计数 */ | |||||
| { | { | ||||
| PulseCount = 0; | PulseCount = 0; | ||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET); | |||||
| if(PulseOutput[Base.NowPulse].NextPulse != -1) | |||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| if(Base.PulseNum - NowPulse > 1) | |||||
| { | { | ||||
| Base.PrePulse = Base.NowPulse; /* 保存之前的脉冲段 */ | |||||
| Base.NowPulse = PulseOutput[Base.NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| Base.PrePulse = NowPulse; /* 保存之前的脉冲段 */ | |||||
| if(PulseOutput[NowPulse].NextPulse == 0) | |||||
| { | |||||
| NowPulse = NowPulse+ 1; | |||||
| } | |||||
| else | |||||
| { | |||||
| NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| } | |||||
| Acc = GetAcc(PulseOutput[Base.PrePulse].Frequency, | Acc = GetAcc(PulseOutput[Base.PrePulse].Frequency, | ||||
| PulseOutput[Base.NowPulse].Frequency, Base.AccCount); /* 计算Acc */ | |||||
| PulseOutput[NowPulse].Frequency, Base.AccCount); /* 计算Acc */ | |||||
| ArrFlag = 1; | ArrFlag = 1; | ||||
| PulseStart(); //开始产生脉冲 | PulseStart(); //开始产生脉冲 | ||||
| } | } | ||||
| else | |||||
| { | |||||
| PulseCount = 0; | |||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| } | |||||
| } | } | ||||
| else | |||||
| { | |||||
| PulseCount++; | |||||
| AllPulseCount++; | |||||
| } | |||||
| } | } | ||||
| if (ArrFlag == 1) | if (ArrFlag == 1) | ||||
| { | { | ||||
| @@ -292,7 +452,7 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| SetFrequency(0, PulseOutput[Base.NowPulse].Frequency); | |||||
| SetFrequency(0, PulseOutput[NowPulse].Frequency); | |||||
| ArrFlag = 0; | ArrFlag = 0; | ||||
| } | } | ||||
| } | } | ||||
| @@ -300,16 +460,42 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) | |||||
| } | } | ||||
| } | } | ||||
| void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |||||
| #endif | |||||
| /** | |||||
| * @brief 掉电中断 | |||||
| * @return 无 | |||||
| */ | |||||
| void HAL_PWR_PVDCallback(void) | |||||
| { | { | ||||
| if(htim == &htim9) | |||||
| { | |||||
| if(__HAL_TIM_GET_FLAG(&htim9, TIM_FLAG_CC2) != RESET) //判断是否触发中断 | |||||
| { | |||||
| __HAL_TIM_CLEAR_FLAG(&htim9, TIM_FLAG_CC2); //清除中断标志 | |||||
| HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_8); | |||||
| } | |||||
| } | |||||
| OSIntEnter(); /* 进入中断 */ | |||||
| // 检查电压是否低于阈值 | |||||
| if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) | |||||
| { | |||||
| /* 掉电处理内容 */ | |||||
| PLSRSramSave(); | |||||
| } | |||||
| OSIntExit(); /* 退出中断 */ | |||||
| } | |||||
| /** | |||||
| * @brief PVD配置 | |||||
| * @return 无 | |||||
| */ | |||||
| void PVD_Init(void) | |||||
| { | |||||
| PWR_PVDTypeDef PvdStruct; | |||||
| HAL_PWR_EnablePVD(); /* 使能PVD */ | |||||
| PvdStruct.PVDLevel = PWR_PVDLEVEL_3; /* PVD阈值3.1V */ | |||||
| PvdStruct.Mode = PWR_PVD_MODE_IT_RISING; /* 检测掉电 */ | |||||
| HAL_PWR_ConfigPVD(&PvdStruct); | |||||
| HAL_NVIC_SetPriority(PVD_IRQn, 0, 0); /* 配置PVD中断优先级 */ | |||||
| HAL_NVIC_EnableIRQ(PVD_IRQn); /* 使能PVD中断 */ | |||||
| } | } | ||||
| /* USER CODE END 4 */ | /* USER CODE END 4 */ | ||||
| @@ -22,6 +22,11 @@ | |||||
| #include "stm32f4xx_it.h" | #include "stm32f4xx_it.h" | ||||
| /* Private includes ----------------------------------------------------------*/ | /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | /* USER CODE BEGIN Includes */ | ||||
| #include "PLSR.h" | |||||
| #include "tim.h" | |||||
| #include "usart.h" | |||||
| #include "modbus.h" | |||||
| #include "string.h" | |||||
| /* USER CODE END Includes */ | /* USER CODE END Includes */ | ||||
| /* Private typedef -----------------------------------------------------------*/ | /* Private typedef -----------------------------------------------------------*/ | ||||
| @@ -55,7 +60,7 @@ | |||||
| /* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||
| /* External variables --------------------------------------------------------*/ | /* External variables --------------------------------------------------------*/ | ||||
| extern TIM_HandleTypeDef htim9; | |||||
| extern TIM_HandleTypeDef htim2; | |||||
| extern DMA_HandleTypeDef hdma_usart1_rx; | extern DMA_HandleTypeDef hdma_usart1_rx; | ||||
| extern DMA_HandleTypeDef hdma_usart1_tx; | extern DMA_HandleTypeDef hdma_usart1_tx; | ||||
| extern UART_HandleTypeDef huart1; | extern UART_HandleTypeDef huart1; | ||||
| @@ -202,17 +207,93 @@ void SysTick_Handler(void) | |||||
| /******************************************************************************/ | /******************************************************************************/ | ||||
| /** | /** | ||||
| * @brief This function handles TIM1 break interrupt and TIM9 global interrupt. | |||||
| * @brief This function handles TIM2 global interrupt. | |||||
| */ | */ | ||||
| void TIM1_BRK_TIM9_IRQHandler(void) | |||||
| void TIM2_IRQHandler(void) | |||||
| { | { | ||||
| /* USER CODE BEGIN TIM1_BRK_TIM9_IRQn 0 */ | |||||
| /* USER CODE END TIM1_BRK_TIM9_IRQn 0 */ | |||||
| HAL_TIM_IRQHandler(&htim9); | |||||
| /* USER CODE BEGIN TIM1_BRK_TIM9_IRQn 1 */ | |||||
| /* USER CODE END TIM1_BRK_TIM9_IRQn 1 */ | |||||
| /* USER CODE BEGIN TIM2_IRQn 0 */ | |||||
| /* USER CODE END TIM2_IRQn 0 */ | |||||
| HAL_TIM_IRQHandler(&htim2); | |||||
| /* USER CODE BEGIN TIM2_IRQn 1 */ | |||||
| PulseNum ++; /* 脉冲段数增加 */ | |||||
| if(Options.RunMod == 0) | |||||
| { | |||||
| /* 如果之后还有脉冲 */ | |||||
| if(Options.AllPulse - PulseNum > 0) | |||||
| { | |||||
| PrePulse = NowPulse; /* 保存之前的脉冲段 */ | |||||
| if(PulseOutput[NowPulse].NextPulse == 0) | |||||
| { | |||||
| NowPulse = NowPulse + 1; /* 进入下一段脉冲 */ | |||||
| } | |||||
| else | |||||
| { | |||||
| NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| } | |||||
| /* 准备加减速 */ | |||||
| Acc = GetAcc(PulseOutput[PrePulse].Frequency, | |||||
| PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */ | |||||
| ArrFlag = 1; | |||||
| SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | |||||
| PulseStart(); /* 开始产生脉冲 */ | |||||
| } | |||||
| /* 如果之后没有脉冲 */ | |||||
| else | |||||
| { | |||||
| PulseCount = 0; | |||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| EndFlag = 1; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if(AllPulseCNT >= MAX_Pulse) | |||||
| { | |||||
| PulseCount = 0; | |||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| FullFlag = 1; | |||||
| } | |||||
| else | |||||
| { | |||||
| /* 如果之后还有脉冲 */ | |||||
| if(Options.AllPulse - PulseNum > 0) | |||||
| { | |||||
| PrePulse = NowPulse; /* 保存之前的脉冲段 */ | |||||
| if(PulseOutput[NowPulse].NextPulse == 0) | |||||
| { | |||||
| NowPulse = NowPulse + 1; /* 进入下一段脉冲 */ | |||||
| } | |||||
| else | |||||
| { | |||||
| NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| } | |||||
| /* 准备加减速 */ | |||||
| Acc = GetAcc(PulseOutput[PrePulse].Frequency, | |||||
| PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */ | |||||
| ArrFlag = 1; | |||||
| SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | |||||
| PulseStart(); /* 开始产生脉冲 */ | |||||
| } | |||||
| /* 如果之后没有脉冲 */ | |||||
| else | |||||
| { | |||||
| PulseCount = 0; | |||||
| HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||||
| EndFlag = 1; | |||||
| } | |||||
| } | |||||
| } | |||||
| /* USER CODE END TIM2_IRQn 1 */ | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -221,7 +302,29 @@ void TIM1_BRK_TIM9_IRQHandler(void) | |||||
| void USART1_IRQHandler(void) | void USART1_IRQHandler(void) | ||||
| { | { | ||||
| /* USER CODE BEGIN USART1_IRQn 0 */ | /* USER CODE BEGIN USART1_IRQn 0 */ | ||||
| uint32_t temp; | |||||
| // 空闲中断处理 | |||||
| if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)) | |||||
| { | |||||
| __HAL_UART_CLEAR_IDLEFLAG(&huart1); | |||||
| temp = huart1.Instance->SR; | |||||
| temp = huart1.Instance->DR; | |||||
| HAL_UART_DMAStop(&huart1); | |||||
| // 计算接收到的数据长度 | |||||
| uint16_t len = RX_BUFFER_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); | |||||
| // 处理数据 | |||||
| if(len > 0) | |||||
| { | |||||
| ProcessModbusFrame(RX1Data, len); /* 处理完整帧 */ | |||||
| // HAL_UART_Transmit(&huart1, RX1Data, len, 0xffff); // 将接收到的数据再发出 | |||||
| len = 0; | |||||
| memset(RX1Data, 0, RX_BUFFER_SIZE); | |||||
| HAL_UART_Receive_DMA(&huart1, RX1Data, RX_BUFFER_SIZE); /* 继续接收 */ | |||||
| } | |||||
| } | |||||
| /* USER CODE END USART1_IRQn 0 */ | /* USER CODE END USART1_IRQn 0 */ | ||||
| HAL_UART_IRQHandler(&huart1); | HAL_UART_IRQHandler(&huart1); | ||||
| /* USER CODE BEGIN USART1_IRQn 1 */ | /* USER CODE BEGIN USART1_IRQn 1 */ | ||||
| @@ -24,41 +24,51 @@ | |||||
| /* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||
| TIM_HandleTypeDef htim9; | |||||
| TIM_HandleTypeDef htim2; | |||||
| TIM_HandleTypeDef htim10; | TIM_HandleTypeDef htim10; | ||||
| /* TIM9 init function */ | |||||
| void MX_TIM9_Init(void) | |||||
| /* TIM2 init function */ | |||||
| void MX_TIM2_Init(void) | |||||
| { | { | ||||
| /* USER CODE BEGIN TIM9_Init 0 */ | |||||
| /* USER CODE BEGIN TIM2_Init 0 */ | |||||
| /* USER CODE END TIM9_Init 0 */ | |||||
| /* USER CODE END TIM2_Init 0 */ | |||||
| TIM_SlaveConfigTypeDef sSlaveConfig = {0}; | |||||
| TIM_ClockConfigTypeDef sClockSourceConfig = {0}; | |||||
| TIM_MasterConfigTypeDef sMasterConfig = {0}; | |||||
| /* USER CODE BEGIN TIM9_Init 1 */ | |||||
| /* USER CODE BEGIN TIM2_Init 1 */ | |||||
| /* USER CODE END TIM9_Init 1 */ | |||||
| htim9.Instance = TIM9; | |||||
| htim9.Init.Prescaler = 0; | |||||
| htim9.Init.CounterMode = TIM_COUNTERMODE_UP; | |||||
| htim9.Init.Period = 65535; | |||||
| htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; | |||||
| htim9.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; | |||||
| if (HAL_TIM_Base_Init(&htim9) != HAL_OK) | |||||
| /* USER CODE END TIM2_Init 1 */ | |||||
| htim2.Instance = TIM2; | |||||
| htim2.Init.Prescaler = 0; | |||||
| htim2.Init.CounterMode = TIM_COUNTERMODE_UP; | |||||
| htim2.Init.Period = 4294967295; | |||||
| htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; | |||||
| htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; | |||||
| if (HAL_TIM_Base_Init(&htim2) != HAL_OK) | |||||
| { | { | ||||
| Error_Handler(); | Error_Handler(); | ||||
| } | } | ||||
| sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; | |||||
| sSlaveConfig.InputTrigger = TIM_TS_ITR2; | |||||
| if (HAL_TIM_SlaveConfigSynchro(&htim9, &sSlaveConfig) != HAL_OK) | |||||
| sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2; | |||||
| sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED; | |||||
| sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1; | |||||
| sClockSourceConfig.ClockFilter = 0; | |||||
| if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) | |||||
| { | { | ||||
| Error_Handler(); | Error_Handler(); | ||||
| } | } | ||||
| /* USER CODE BEGIN TIM9_Init 2 */ | |||||
| __HAL_TIM_CLEAR_FLAG(&htim9, TIM_FLAG_CC2); //Çå³ýÖжϱêÖ¾ | |||||
| /* USER CODE END TIM9_Init 2 */ | |||||
| sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; | |||||
| sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; | |||||
| if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) | |||||
| { | |||||
| Error_Handler(); | |||||
| } | |||||
| /* USER CODE BEGIN TIM2_Init 2 */ | |||||
| __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE); | |||||
| HAL_TIM_Base_Start_IT(&htim2); | |||||
| /* USER CODE END TIM2_Init 2 */ | |||||
| } | } | ||||
| /* TIM10 init function */ | /* TIM10 init function */ | ||||
| @@ -90,7 +100,7 @@ void MX_TIM10_Init(void) | |||||
| } | } | ||||
| sConfigOC.OCMode = TIM_OCMODE_PWM1; | sConfigOC.OCMode = TIM_OCMODE_PWM1; | ||||
| sConfigOC.Pulse = 32767; | sConfigOC.Pulse = 32767; | ||||
| sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; | |||||
| sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; | |||||
| sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; | sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; | ||||
| if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) | if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) | ||||
| { | { | ||||
| @@ -113,20 +123,32 @@ void MX_TIM10_Init(void) | |||||
| void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | ||||
| { | { | ||||
| if(tim_baseHandle->Instance==TIM9) | |||||
| GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
| if(tim_baseHandle->Instance==TIM2) | |||||
| { | { | ||||
| /* USER CODE BEGIN TIM9_MspInit 0 */ | |||||
| /* USER CODE BEGIN TIM2_MspInit 0 */ | |||||
| /* USER CODE END TIM2_MspInit 0 */ | |||||
| /* TIM2 clock enable */ | |||||
| __HAL_RCC_TIM2_CLK_ENABLE(); | |||||
| /* USER CODE END TIM9_MspInit 0 */ | |||||
| /* TIM9 clock enable */ | |||||
| __HAL_RCC_TIM9_CLK_ENABLE(); | |||||
| __HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
| /**TIM2 GPIO Configuration | |||||
| PA15 ------> TIM2_ETR | |||||
| */ | |||||
| GPIO_InitStruct.Pin = GPIO_PIN_15; | |||||
| GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | |||||
| GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
| GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | |||||
| GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; | |||||
| HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
| /* TIM9 interrupt Init */ | |||||
| HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0); | |||||
| HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); | |||||
| /* USER CODE BEGIN TIM9_MspInit 1 */ | |||||
| /* TIM2 interrupt Init */ | |||||
| HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); | |||||
| HAL_NVIC_EnableIRQ(TIM2_IRQn); | |||||
| /* USER CODE BEGIN TIM2_MspInit 1 */ | |||||
| /* USER CODE END TIM9_MspInit 1 */ | |||||
| /* USER CODE END TIM2_MspInit 1 */ | |||||
| } | } | ||||
| else if(tim_baseHandle->Instance==TIM10) | else if(tim_baseHandle->Instance==TIM10) | ||||
| { | { | ||||
| @@ -171,19 +193,24 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) | |||||
| void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) | void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) | ||||
| { | { | ||||
| if(tim_baseHandle->Instance==TIM9) | |||||
| if(tim_baseHandle->Instance==TIM2) | |||||
| { | { | ||||
| /* USER CODE BEGIN TIM9_MspDeInit 0 */ | |||||
| /* USER CODE BEGIN TIM2_MspDeInit 0 */ | |||||
| /* USER CODE END TIM9_MspDeInit 0 */ | |||||
| /* USER CODE END TIM2_MspDeInit 0 */ | |||||
| /* Peripheral clock disable */ | /* Peripheral clock disable */ | ||||
| __HAL_RCC_TIM9_CLK_DISABLE(); | |||||
| __HAL_RCC_TIM2_CLK_DISABLE(); | |||||
| /**TIM2 GPIO Configuration | |||||
| PA15 ------> TIM2_ETR | |||||
| */ | |||||
| HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15); | |||||
| /* TIM9 interrupt Deinit */ | |||||
| HAL_NVIC_DisableIRQ(TIM1_BRK_TIM9_IRQn); | |||||
| /* USER CODE BEGIN TIM9_MspDeInit 1 */ | |||||
| /* TIM2 interrupt Deinit */ | |||||
| HAL_NVIC_DisableIRQ(TIM2_IRQn); | |||||
| /* USER CODE BEGIN TIM2_MspDeInit 1 */ | |||||
| /* USER CODE END TIM9_MspDeInit 1 */ | |||||
| /* USER CODE END TIM2_MspDeInit 1 */ | |||||
| } | } | ||||
| else if(tim_baseHandle->Instance==TIM10) | else if(tim_baseHandle->Instance==TIM10) | ||||
| { | { | ||||
| @@ -21,7 +21,10 @@ | |||||
| #include "usart.h" | #include "usart.h" | ||||
| /* USER CODE BEGIN 0 */ | /* USER CODE BEGIN 0 */ | ||||
| uint8_t RX1DataTemp = 0; | |||||
| uint8_t RX1Data[RX_BUFFER_SIZE] = {0}; | |||||
| uint8_t RX1Flag = 0; | |||||
| volatile uint16_t RX1Count = 0; | |||||
| /* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||
| UART_HandleTypeDef huart1; | UART_HandleTypeDef huart1; | ||||
| @@ -42,9 +45,9 @@ void MX_USART1_UART_Init(void) | |||||
| /* USER CODE END USART1_Init 1 */ | /* USER CODE END USART1_Init 1 */ | ||||
| huart1.Instance = USART1; | huart1.Instance = USART1; | ||||
| huart1.Init.BaudRate = 19200; | huart1.Init.BaudRate = 19200; | ||||
| huart1.Init.WordLength = UART_WORDLENGTH_8B; | |||||
| huart1.Init.WordLength = UART_WORDLENGTH_9B; | |||||
| huart1.Init.StopBits = UART_STOPBITS_1; | huart1.Init.StopBits = UART_STOPBITS_1; | ||||
| huart1.Init.Parity = UART_PARITY_NONE; | |||||
| huart1.Init.Parity = UART_PARITY_ODD; | |||||
| huart1.Init.Mode = UART_MODE_TX_RX; | huart1.Init.Mode = UART_MODE_TX_RX; | ||||
| huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | ||||
| huart1.Init.OverSampling = UART_OVERSAMPLING_16; | huart1.Init.OverSampling = UART_OVERSAMPLING_16; | ||||
| @@ -53,7 +56,8 @@ void MX_USART1_UART_Init(void) | |||||
| Error_Handler(); | Error_Handler(); | ||||
| } | } | ||||
| /* USER CODE BEGIN USART1_Init 2 */ | /* USER CODE BEGIN USART1_Init 2 */ | ||||
| __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); | |||||
| HAL_UART_Receive_DMA(&huart1, RX1Data, RX_BUFFER_SIZE); | |||||
| /* USER CODE END USART1_Init 2 */ | /* USER CODE END USART1_Init 2 */ | ||||
| } | } | ||||
| @@ -356,7 +356,7 @@ | |||||
| <state>$PROJ_DIR$/../Drivers/CMSIS/Device/ST/STM32F4xx/Include</state> | <state>$PROJ_DIR$/../Drivers/CMSIS/Device/ST/STM32F4xx/Include</state> | ||||
| <state>$PROJ_DIR$/../Drivers/CMSIS/Include</state> | <state>$PROJ_DIR$/../Drivers/CMSIS/Include</state> | ||||
| <state>$PROJ_DIR$\..\Hardware</state> | <state>$PROJ_DIR$\..\Hardware</state> | ||||
| <state>C:\Users\Chiri\Desktop\PLSR\cmsis\uC-CPU</state> | |||||
| <state>$PROJ_DIR$\..\cmsis\uC-CPU</state> | |||||
| <state>$PROJ_DIR$\..\cmsis\uC-CPU\ARM-Cortex-M4\IAR</state> | <state>$PROJ_DIR$\..\cmsis\uC-CPU\ARM-Cortex-M4\IAR</state> | ||||
| <state>$PROJ_DIR$\..\cmsis\uC-LIB</state> | <state>$PROJ_DIR$\..\cmsis\uC-LIB</state> | ||||
| <state>$PROJ_DIR$\..\cmsis\uC-LIB\Ports\ARM-Cortex-M4\IAR</state> | <state>$PROJ_DIR$\..\cmsis\uC-LIB\Ports\ARM-Cortex-M4\IAR</state> | ||||
| @@ -25,7 +25,7 @@ if not "%~1" == "" goto debugFile | |||||
| @echo on | @echo on | ||||
| "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| @echo off | @echo off | ||||
| goto end | goto end | ||||
| @@ -34,7 +34,7 @@ goto end | |||||
| @echo on | @echo on | ||||
| "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| @echo off | @echo off | ||||
| :end | :end | ||||
| @@ -23,9 +23,9 @@ | |||||
| if ($debugfile -eq "") | if ($debugfile -eq "") | ||||
| { | { | ||||
| & "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| & "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| & "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\Chiri\Desktop\PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| & "D:\IAR8.40.1\common\bin\cspybat" -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\settings\PLSR.PLSR.driver.xcl" | |||||
| } | } | ||||
| @@ -2,7 +2,7 @@ | |||||
| "D:\IAR8.40.1\arm\bin\armstlink2.dll" | "D:\IAR8.40.1\arm\bin\armstlink2.dll" | ||||
| "C:\Users\Chiri\Desktop\PLSR\EWARM\PLSR\Exe\PLSR.out" | |||||
| "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\EWARM\PLSR\Exe\PLSR.out" | |||||
| --plugin="D:\IAR8.40.1\arm\bin\armbat.dll" | --plugin="D:\IAR8.40.1\arm\bin\armbat.dll" | ||||
| @@ -20,15 +20,15 @@ | |||||
| <LeaveTargetRunning>_ 0</LeaveTargetRunning> | <LeaveTargetRunning>_ 0</LeaveTargetRunning> | ||||
| </StLinkDriver> | </StLinkDriver> | ||||
| <DebugChecksum> | <DebugChecksum> | ||||
| <Checksum>1504644991</Checksum> | |||||
| <Checksum>1004691111</Checksum> | |||||
| </DebugChecksum> | </DebugChecksum> | ||||
| <Exceptions> | <Exceptions> | ||||
| <StopOnUncaught>_ 0</StopOnUncaught> | <StopOnUncaught>_ 0</StopOnUncaught> | ||||
| <StopOnThrow>_ 0</StopOnThrow> | <StopOnThrow>_ 0</StopOnThrow> | ||||
| </Exceptions> | </Exceptions> | ||||
| <Disassembly> | <Disassembly> | ||||
| <InstrCount>0</InstrCount> | |||||
| <MixedMode>1</MixedMode> | <MixedMode>1</MixedMode> | ||||
| <InstrCount>0</InstrCount> | |||||
| </Disassembly> | </Disassembly> | ||||
| <CodeCoverage> | <CodeCoverage> | ||||
| <Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
| @@ -56,6 +56,17 @@ | |||||
| <ITMportsLogFile>0</ITMportsLogFile> | <ITMportsLogFile>0</ITMportsLogFile> | ||||
| <ITMlogFile>$PROJ_DIR$\ITM.log</ITMlogFile> | <ITMlogFile>$PROJ_DIR$\ITM.log</ITMlogFile> | ||||
| </SWOTraceHWSettings> | </SWOTraceHWSettings> | ||||
| <Registers> | |||||
| <regBase0>TIM2_CNT 10</regBase0> | |||||
| </Registers> | |||||
| <struct_types> | |||||
| <Fmt0>Pulse-Frequency 3 0</Fmt0> | |||||
| <Fmt1>Pulse-NextPulse 3 0</Fmt1> | |||||
| <Fmt2>Pulse-PulseCount 3 0</Fmt2> | |||||
| </struct_types> | |||||
| <watch_formats> | |||||
| <Fmt0>{W}1:AllPulseCNT 3 0</Fmt0> | |||||
| </watch_formats> | |||||
| <Trace2> | <Trace2> | ||||
| <Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
| <ShowSource>0</ShowSource> | <ShowSource>0</ShowSource> | ||||
| @@ -127,11 +138,11 @@ | |||||
| <mode>0</mode> | <mode>0</mode> | ||||
| </DisassembleMode> | </DisassembleMode> | ||||
| <Breakpoints2> | <Breakpoints2> | ||||
| <Bp0>_ 1 "EMUL_CODE" "{$PROJ_DIR$\..\Core\Src\main.c}.309.13" 0 0 1 "" 0 "" 0</Bp0> | |||||
| <Count>1</Count> | |||||
| <Count>0</Count> | |||||
| </Breakpoints2> | </Breakpoints2> | ||||
| <Aliases> | <Aliases> | ||||
| <Count>0</Count> | |||||
| <A0>_ "C:\Users\Chiri\Desktop\PLSR\cmsis\uC-CPU\ARM-Cortex-M4\IAR\cpu_a.asm" "C:\Users\Chiri\Desktop\TrainCamp-Jiangyunsong-PLSR\cmsis\uC-CPU\ARM-Cortex-M4\IAR\cpu_a.asm"</A0> | |||||
| <Count>1</Count> | |||||
| <SuppressDialog>0</SuppressDialog> | <SuppressDialog>0</SuppressDialog> | ||||
| </Aliases> | </Aliases> | ||||
| </settings> | </settings> | ||||
| @@ -0,0 +1 @@ | |||||
| | |||||
| @@ -1,22 +1,33 @@ | |||||
| #include "PLSR.h" | #include "PLSR.h" | ||||
| #include "PSCARR.h" | #include "PSCARR.h" | ||||
| #include "tim.h" | #include "tim.h" | ||||
| #include "sram.h" | |||||
| #include <string.h> | |||||
| #include "modbus.h" | |||||
| Pulse PulseOutput[10]; // 十段脉冲的配置 | |||||
| Option Options; | |||||
| uint8_t NowPulse; /* 当前处于第几段脉冲 */ | |||||
| uint8_t PrePulse; /* 之前处于第几段脉冲 */ | |||||
| uint8_t PulseNum; /* 一共有多少段脉冲 */ | |||||
| int32_t MAX_Pulse; /* 最多的脉冲数 */ | |||||
| int32_t AccCount; /* 加速脉冲数 */ | |||||
| int32_t NowMAXPulse; /* 当前要达到的总脉冲 */ | |||||
| Pulse PulseOutput[10]; | |||||
| BaseOption Base; | |||||
| int32_t PulseCount = 0; | int32_t PulseCount = 0; | ||||
| int32_t AllPulseCount = 0; | |||||
| /** | /** | ||||
| * @brief 根据脉冲的频率设置对应的PSC和ARR | * @brief 根据脉冲的频率设置对应的PSC和ARR | ||||
| * @param[in] Channel 脉冲通道(目前只有通道0) | |||||
| * @param[in] SentPost 脉冲通道(目前只有通道Y0) | |||||
| * @param[in] Ferquency 脉冲的频率 | * @param[in] Ferquency 脉冲的频率 | ||||
| * @return 无 | * @return 无 | ||||
| */ | */ | ||||
| void SetFrequency(uint8_t Channel, uint32_t Frequency) | |||||
| void SetFrequency(uint8_t SentPost, uint32_t Frequency) | |||||
| { | { | ||||
| Frequency_Change_PSC_And_ARR(Frequency, &psc, &arr); | Frequency_Change_PSC_And_ARR(Frequency, &psc, &arr); | ||||
| switch(Channel) | |||||
| switch(SentPost) | |||||
| { | { | ||||
| case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break; | case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break; | ||||
| } | } | ||||
| @@ -28,15 +39,15 @@ void SetFrequency(uint8_t Channel, uint32_t Frequency) | |||||
| * @param[in] Pulse 第几段脉冲 | * @param[in] Pulse 第几段脉冲 | ||||
| * @param[in] Ferquency 脉冲的频率 | * @param[in] Ferquency 脉冲的频率 | ||||
| * @param[in] Count 脉冲的数量 | * @param[in] Count 脉冲的数量 | ||||
| * @param[in] Direction 脉冲的方向 | |||||
| * @param[in] EXT EXT信号 | |||||
| * @param[in] NextPulse 下一段脉冲 | * @param[in] NextPulse 下一段脉冲 | ||||
| * @return 无 | * @return 无 | ||||
| */ | */ | ||||
| void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Direction, int8_t NextPulse) | |||||
| void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t EXT, int8_t NextPulse) | |||||
| { | { | ||||
| PulseOutput[Pulse].Frequency = Ferquency; | PulseOutput[Pulse].Frequency = Ferquency; | ||||
| PulseOutput[Pulse].PulseCount = Count; | PulseOutput[Pulse].PulseCount = Count; | ||||
| PulseOutput[Pulse].Direction = Direction; | |||||
| PulseOutput[Pulse].EXT = EXT; | |||||
| PulseOutput[Pulse].NextPulse = NextPulse; | PulseOutput[Pulse].NextPulse = NextPulse; | ||||
| } | } | ||||
| @@ -46,22 +57,18 @@ void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Directio | |||||
| * @param[in] PulseMod 绝对1/相对0 | * @param[in] PulseMod 绝对1/相对0 | ||||
| * @return 无 | * @return 无 | ||||
| */ | */ | ||||
| void PulseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse) | |||||
| void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse) | |||||
| { | { | ||||
| Base.StartPulse = StartPulse; | |||||
| Base.PulseMod = PulseMod; | |||||
| Base.NowPulse = StartPulse; | |||||
| Base.MAX_Pulse = MAX_Pulse; | |||||
| Options.StartPulse = StartPulse; | |||||
| Options.RunMod = PulseMod; | |||||
| NowPulse = StartPulse; | |||||
| MAX_Pulse = MAX_Pulse; | |||||
| } | } | ||||
| void PulseStart(void) | void PulseStart(void) | ||||
| { | { | ||||
| // SetPulse(Base.NowPulse, PulseOutput[Base.NowPulse].Frequency, | |||||
| // PulseOutput[Base.NowPulse].PulseCount, | |||||
| // PulseOutput[Base.NowPulse].Direction, | |||||
| // PulseOutput[Base.NowPulse].NextPulse | |||||
| // ); | |||||
| SetFrequency(0, PulseOutput[Base.NowPulse].Frequency); | |||||
| SetFrequency(Options.DirPost, PulseOutput[NowPulse].Frequency); | |||||
| TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
| HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1); | ||||
| } | } | ||||
| /** | /** | ||||
| @@ -71,7 +78,162 @@ void PulseStart(void) | |||||
| * @param[in] AccCount 需要多少个脉冲完成加速 | * @param[in] AccCount 需要多少个脉冲完成加速 | ||||
| * @return 加速度 | * @return 加速度 | ||||
| */ | */ | ||||
| int32_t GetAcc(int32_t Start, int32_t End, int32_t AccCount) | |||||
| float GetAcc(int32_t Start, int32_t End, int32_t AccCount) | |||||
| { | |||||
| return ((float)End - (float)Start) / (float)AccCount; | |||||
| } | |||||
| /** | |||||
| * @brief 添加新的脉冲(只允许按顺序添加) | |||||
| * @param[in] Pulse 第几段脉冲 | |||||
| * @param[in] Ferquency 脉冲的频率 | |||||
| * @param[in] Count 脉冲的数量 | |||||
| * @param[in] NextPulse 下一段脉冲 | |||||
| * @return 无 | |||||
| */ | |||||
| void AddPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse) | |||||
| { | |||||
| if(Pulse == Options.AllPulse) | |||||
| { | |||||
| if(Count > 0) | |||||
| { | |||||
| SetPulse(Pulse, Ferquency, Count, 0, NextPulse); | |||||
| } | |||||
| else | |||||
| { | |||||
| SetPulse(Pulse, Ferquency, -Count, 1, NextPulse); | |||||
| } | |||||
| Options.AllPulse ++; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @brief 脉冲初始化 | |||||
| * @param[in] Pulse 第几段脉冲 | |||||
| * @param[in] Ferquency 脉冲的频率 | |||||
| * @param[in] Count 脉冲的数量 | |||||
| * @param[in] Direction 脉冲的方向 | |||||
| * @param[in] NextPulse 下一段脉冲 | |||||
| * @return 无 | |||||
| */ | |||||
| void PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse) | |||||
| { | |||||
| if(Count > 0) | |||||
| { | |||||
| SetPulse(Pulse, Ferquency, Count, 0, NextPulse); | |||||
| } | |||||
| else | |||||
| { | |||||
| SetPulse(Pulse, Ferquency, -Count, 1, NextPulse); | |||||
| } | |||||
| Options.AllPulse = 1; | |||||
| } | |||||
| /** | |||||
| * @brief 设置结果脉冲数 | |||||
| * @param[in] PulseCount 要设定的脉冲数 | |||||
| * @return 无 | |||||
| */ | |||||
| void MAXPulseSet(int32_t PulseCount) | |||||
| { | |||||
| if(NowPulse == 0) | |||||
| { | |||||
| NowMAXPulse = PulseOutput[NowPulse].PulseCount; | |||||
| } | |||||
| else | |||||
| { | |||||
| NowMAXPulse += PulseOutput[NowPulse].PulseCount; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @brief 设置下一次进入中断的脉冲数 | |||||
| * @return 无 | |||||
| */ | |||||
| void SetNextPulse(void) | |||||
| { | |||||
| MAXPulseSet(PulseOutput[NowPulse].PulseCount); /* 更改结果脉冲数 */ | |||||
| if(Options.RunMod == 0) /* 如果是相对模式 */ | |||||
| { | |||||
| TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
| } | |||||
| else /* 如果是绝对模式 */ | |||||
| { | |||||
| if(NowMAXPulse >= MAX_Pulse) /* 如果超出了上限 */ | |||||
| { | |||||
| TIM2->ARR = - (MAX_Pulse - NowMAXPulse); | |||||
| } | |||||
| else | |||||
| { | |||||
| TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | |||||
| * @brief 获取与CNT相加的基础值 | |||||
| * @param[in] NowPulseNUM 当前的脉冲段数 | |||||
| * @return 基础值 | |||||
| */ | |||||
| uint32_t GetBase(uint8_t NowPulseNUM) | |||||
| { | |||||
| uint32_t temp = 0; | |||||
| if(NowPulseNUM == 0) | |||||
| { | |||||
| temp = 0; | |||||
| } | |||||
| else | |||||
| { | |||||
| for(int i = 0; i < NowPulseNUM; i++) | |||||
| { | |||||
| temp += PulseOutput[i].PulseCount; | |||||
| } | |||||
| } | |||||
| return temp; | |||||
| } | |||||
| /** | |||||
| * @brief 数据掉电保存 | |||||
| * @return 无 | |||||
| */ | |||||
| void PLSRSramSave(void) | |||||
| { | |||||
| uint32_t temp[80] = {0}; //一共4 * 80 = 320 | |||||
| Write_Backup_SRAM(temp, 80); | |||||
| } | |||||
| /** | |||||
| * @brief 数据上电读取 | |||||
| * @return 无 | |||||
| */ | |||||
| void PLSRSramRead(void) | |||||
| { | { | ||||
| return (End - Start) / AccCount; | |||||
| uint32_t temp[80] = {0}; | |||||
| Read_Backup_SRAM(temp, 80); | |||||
| } | } | ||||
| /** | |||||
| * @brief 从寄存器读取设置参数 | |||||
| * @return 无 | |||||
| */ | |||||
| void PLSROptionLoad(void) | |||||
| { | |||||
| Options.SentPost = Register_L[0x1000]; | |||||
| Options.DirPost = Register_L[0x1001]; | |||||
| Options.EXT = Register_L[0x1002]; | |||||
| Options.DirDelay = Register_L[0x1003]; //可能更大。 | |||||
| Options.Dir = Register_L[0x1004]; | |||||
| Options.AccMod = Register_L[0x1005]; | |||||
| Options.RunMod = Register_L[0x1006]; | |||||
| Options.AllPulse = Register_L[0x1007]; | |||||
| Options.StartPulse = Register_L[0x1008]; | |||||
| Options.InitSpeed = Register_L[0x1009]; //需要修改。 | |||||
| Options.AccUpTime = Register_L[0x100B]; | |||||
| Options.AddDownTime = Register_L[0x100C]; | |||||
| } | |||||
| @@ -9,32 +9,53 @@ typedef struct | |||||
| { | { | ||||
| uint32_t Frequency ; ///<< 脉冲的频率 | uint32_t Frequency ; ///<< 脉冲的频率 | ||||
| int32_t PulseCount; ///<< 脉冲的总数 | int32_t PulseCount; ///<< 脉冲的总数 | ||||
| int8_t NextPulse; ///<< 下一段脉冲是第几个 , 若为 -1 代表无下一个脉冲 | |||||
| uint8_t Direction; ///<< 脉冲的方向 0为正转, 1为反转 | |||||
| int8_t NextPulse; ///<< 下一段脉冲是第几个 , 若为0代表默认下一个脉冲 | |||||
| uint8_t EXT; ///<< EXT | |||||
| } Pulse; | } Pulse; | ||||
| typedef struct | typedef struct | ||||
| { | { | ||||
| uint8_t StartPulse; ///<< 起始的脉冲段 | |||||
| uint8_t PulseMod; ///<< 相对模式还是绝对模式 | |||||
| uint8_t NowPulse; ///<< 当前处于第几段脉冲 | |||||
| uint8_t PrePulse; ///<< 之前处于第几段脉冲 | |||||
| int32_t MAX_Pulse; ///<< 最多的脉冲数 | |||||
| int32_t AccCount; | |||||
| } BaseOption; | |||||
| uint8_t SentPost; ///<<脉冲发送端子 | |||||
| uint8_t DirPost; ///<<脉冲方向端子 | |||||
| uint8_t EXT; ///<<EXT信号 | |||||
| uint8_t DirDelay; ///<<脉冲方向延时时间 | |||||
| uint8_t Dir; ///<<脉冲方向逻辑(逻辑正0,逻辑反1) | |||||
| uint8_t AccMod; ///<<脉冲加减速模式 | |||||
| uint8_t RunMod; ///<<运行模式(相对0,绝对1) | |||||
| uint8_t AllPulse; ///<<脉冲总段数 | |||||
| uint8_t StartPulse; ///<<起始执行段数 | |||||
| uint32_t InitSpeed; ///<<脉冲默认速度 | |||||
| uint8_t AddUpTime; ///<<脉冲默认速度加速时间 | |||||
| uint8_t AddDownTime; ///<<脉冲默认速度减速时间 | |||||
| } Option; | |||||
| /* 变量声明 */ | /* 变量声明 */ | ||||
| extern Pulse PulseOutput[10]; | extern Pulse PulseOutput[10]; | ||||
| extern BaseOption Base; | |||||
| extern Option Options; | |||||
| extern uint8_t NowPulse; ///<< 当前处于第几段脉冲 | |||||
| extern uint8_t PrePulse; ///<< 之前处于第几段脉冲 | |||||
| extern uint8_t PulseNum; ///<< 一共有多少段脉冲(中断内使用) | |||||
| extern int32_t MAX_Pulse; ///<< 最多的脉冲数 | |||||
| extern int32_t AccCount; ///<<加速脉冲数 | |||||
| extern int32_t NowMAXPulse; ///<<当前要达到的总脉冲 | |||||
| extern int32_t PulseCount; | extern int32_t PulseCount; | ||||
| extern int32_t AllPulseCount; | |||||
| extern int32_t NextPulseEND; | |||||
| /* 函数声明 */ | /* 函数声明 */ | ||||
| void SetFrequency(uint8_t Channel, uint32_t Frequency); | |||||
| void SetFrequency(uint8_t SentPost, uint32_t Frequency); | |||||
| void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Direction, int8_t NextPulse); | void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t Direction, int8_t NextPulse); | ||||
| void PulseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse); | |||||
| void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse); | |||||
| void PulseStart(void); | void PulseStart(void); | ||||
| int32_t GetAcc(int32_t Start, int32_t End, int32_t AccCount); | |||||
| float GetAcc(int32_t Start, int32_t End, int32_t AccCount); | |||||
| void AddPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse); | |||||
| void PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse); | |||||
| void SetNextPulse(void); | |||||
| uint32_t GetBase(uint8_t NowPulseNUM); | |||||
| //掉电保持 | |||||
| void PLSRSramSave(void); | |||||
| void PLSRSramRead(void); | |||||
| #endif | #endif | ||||
| @@ -1,8 +1,9 @@ | |||||
| #include "modbus.h" | #include "modbus.h" | ||||
| #include "PLSR.h" | |||||
| uint8_t Coil[1250]; ///<存放线圈的数组 | uint8_t Coil[1250]; ///<存放线圈的数组 | ||||
| uint8_t Register_H[10000]; ///<寄存器的高字节 | |||||
| uint8_t Register_L[10000]; ///<寄存器的低字节 | |||||
| uint8_t Register_H[10000]; ///<寄存器的高字节 | |||||
| uint8_t Register_L[10000]; ///<寄存器的低字节 | |||||
| uint8_t EXRegister_H[10000]; ///<0x10000开始寄存器的高字节 | uint8_t EXRegister_H[10000]; ///<0x10000开始寄存器的高字节 | ||||
| uint8_t EXRegister_L[10000]; ///<0x10000开始寄存器的低字节 | uint8_t EXRegister_L[10000]; ///<0x10000开始寄存器的低字节 | ||||
| @@ -657,6 +658,7 @@ void GetHistory(uint8_t buffer[], uint16_t longth) | |||||
| if (buffer[0] == SLAVES_ADDRES) | if (buffer[0] == SLAVES_ADDRES) | ||||
| { | { | ||||
| LoadHistory(); | LoadHistory(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -48,4 +48,7 @@ extern uint8_t HistoryLocation; /* | |||||
| extern uint8_t Flash_data[20]; /*存入flash的数据*/ | extern uint8_t Flash_data[20]; /*存入flash的数据*/ | ||||
| extern uint8_t SaveFlag; | extern uint8_t SaveFlag; | ||||
| extern uint8_t Register_H[10000]; ///<寄存器的高字节 | |||||
| extern uint8_t Register_L[10000]; ///<寄存器的低字节 | |||||
| #endif | #endif | ||||
| @@ -7,7 +7,8 @@ uint8_t SramData[20]; | |||||
| void Write_Backup_SRAM(uint32_t* data, uint32_t size) | void Write_Backup_SRAM(uint32_t* data, uint32_t size) | ||||
| { | { | ||||
| volatile uint32_t* pBackupSRAM = (volatile uint32_t*)BKP_SRAM_BASE; | volatile uint32_t* pBackupSRAM = (volatile uint32_t*)BKP_SRAM_BASE; | ||||
| for(uint32_t i = 0; i < size; i++) { | |||||
| for (uint32_t i = 0; i < size; i++) | |||||
| { | |||||
| pBackupSRAM[i] = data[i]; | pBackupSRAM[i] = data[i]; | ||||
| } | } | ||||
| } | } | ||||
| @@ -16,7 +17,8 @@ void Write_Backup_SRAM(uint32_t* data, uint32_t size) | |||||
| void Read_Backup_SRAM(uint32_t* data, uint32_t size) | void Read_Backup_SRAM(uint32_t* data, uint32_t size) | ||||
| { | { | ||||
| volatile uint32_t* pBackupSRAM = (volatile uint32_t*)BKP_SRAM_BASE; | volatile uint32_t* pBackupSRAM = (volatile uint32_t*)BKP_SRAM_BASE; | ||||
| for(uint32_t i = 0; i < size; i++) { | |||||
| for (uint32_t i = 0; i < size; i++) | |||||
| { | |||||
| data[i] = pBackupSRAM[i]; | data[i] = pBackupSRAM[i]; | ||||
| } | } | ||||
| } | } | ||||
| @@ -34,23 +34,25 @@ Mcu.IP0=DMA | |||||
| Mcu.IP1=NVIC | Mcu.IP1=NVIC | ||||
| Mcu.IP2=RCC | Mcu.IP2=RCC | ||||
| Mcu.IP3=SYS | Mcu.IP3=SYS | ||||
| Mcu.IP4=TIM9 | |||||
| Mcu.IP4=TIM2 | |||||
| Mcu.IP5=TIM10 | Mcu.IP5=TIM10 | ||||
| Mcu.IP6=USART1 | Mcu.IP6=USART1 | ||||
| Mcu.IPNb=7 | Mcu.IPNb=7 | ||||
| Mcu.Name=STM32F407I(E-G)Tx | Mcu.Name=STM32F407I(E-G)Tx | ||||
| Mcu.Package=LQFP176 | Mcu.Package=LQFP176 | ||||
| Mcu.Pin0=PI8- ANTI TAMP2 | |||||
| Mcu.Pin1=PF6 | |||||
| Mcu.Pin2=PH0-OSC_IN | |||||
| Mcu.Pin3=PH1-OSC_OUT | |||||
| Mcu.Pin4=PA9 | |||||
| Mcu.Pin5=PA10 | |||||
| Mcu.Pin6=VP_SYS_VS_Systick | |||||
| Mcu.Pin7=VP_TIM9_VS_ControllerModeGated | |||||
| Mcu.Pin8=VP_TIM9_VS_ClockSourceITR | |||||
| Mcu.Pin9=VP_TIM10_VS_ClockSourceINT | |||||
| Mcu.PinsNb=10 | |||||
| Mcu.Pin0=PF6 | |||||
| Mcu.Pin1=PH0-OSC_IN | |||||
| Mcu.Pin10=VP_SYS_VS_Systick | |||||
| Mcu.Pin11=VP_TIM10_VS_ClockSourceINT | |||||
| Mcu.Pin2=PH1-OSC_OUT | |||||
| Mcu.Pin3=PH6 | |||||
| Mcu.Pin4=PH7 | |||||
| Mcu.Pin5=PH8 | |||||
| Mcu.Pin6=PH9 | |||||
| Mcu.Pin7=PA9 | |||||
| Mcu.Pin8=PA10 | |||||
| Mcu.Pin9=PA15 | |||||
| Mcu.PinsNb=12 | |||||
| Mcu.ThirdPartyNb=0 | Mcu.ThirdPartyNb=0 | ||||
| Mcu.UserConstants= | Mcu.UserConstants= | ||||
| Mcu.UserName=STM32F407IGTx | Mcu.UserName=STM32F407IGTx | ||||
| @@ -68,11 +70,15 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | |||||
| NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | ||||
| NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | 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.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false | ||||
| NVIC.TIM1_BRK_TIM9_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | |||||
| NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | |||||
| NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true | ||||
| NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | ||||
| PA10.Mode=Asynchronous | PA10.Mode=Asynchronous | ||||
| PA10.Signal=USART1_RX | PA10.Signal=USART1_RX | ||||
| PA15.GPIOParameters=GPIO_Speed | |||||
| PA15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH | |||||
| PA15.Locked=true | |||||
| PA15.Signal=S_TIM2_CH1_ETR | |||||
| PA9.Mode=Asynchronous | PA9.Mode=Asynchronous | ||||
| PA9.Signal=USART1_TX | PA9.Signal=USART1_TX | ||||
| PF6.Locked=true | PF6.Locked=true | ||||
| @@ -81,8 +87,22 @@ PH0-OSC_IN.Mode=HSE-External-Oscillator | |||||
| PH0-OSC_IN.Signal=RCC_OSC_IN | PH0-OSC_IN.Signal=RCC_OSC_IN | ||||
| PH1-OSC_OUT.Mode=HSE-External-Oscillator | PH1-OSC_OUT.Mode=HSE-External-Oscillator | ||||
| PH1-OSC_OUT.Signal=RCC_OSC_OUT | PH1-OSC_OUT.Signal=RCC_OSC_OUT | ||||
| PI8-\ ANTI\ TAMP2.Locked=true | |||||
| PI8-\ ANTI\ TAMP2.Signal=GPIO_Output | |||||
| PH6.GPIOParameters=GPIO_Label | |||||
| PH6.GPIO_Label=Y15 | |||||
| PH6.Locked=true | |||||
| PH6.Signal=GPIO_Output | |||||
| PH7.GPIOParameters=GPIO_Label | |||||
| PH7.GPIO_Label=Y14 | |||||
| PH7.Locked=true | |||||
| PH7.Signal=GPIO_Output | |||||
| PH8.GPIOParameters=GPIO_Label | |||||
| PH8.GPIO_Label=Y13 | |||||
| PH8.Locked=true | |||||
| PH8.Signal=GPIO_Output | |||||
| PH9.GPIOParameters=GPIO_Label | |||||
| PH9.GPIO_Label=Y12 | |||||
| PH9.Locked=true | |||||
| PH9.Signal=GPIO_Output | |||||
| PinOutPanel.RotationAngle=0 | PinOutPanel.RotationAngle=0 | ||||
| ProjectManager.AskForMigrate=true | ProjectManager.AskForMigrate=true | ||||
| ProjectManager.BackupPrevious=false | ProjectManager.BackupPrevious=false | ||||
| @@ -112,7 +132,7 @@ ProjectManager.StackSize=0x400 | |||||
| ProjectManager.TargetToolchain=EWARM V8 | ProjectManager.TargetToolchain=EWARM V8 | ||||
| ProjectManager.ToolChainLocation= | ProjectManager.ToolChainLocation= | ||||
| ProjectManager.UnderRoot=false | ProjectManager.UnderRoot=false | ||||
| ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM10_Init-TIM10-false-HAL-true,6-MX_TIM9_Init-TIM9-false-HAL-true | |||||
| ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM10_Init-TIM10-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true | |||||
| RCC.48MHZClocksFreq_Value=36000000 | RCC.48MHZClocksFreq_Value=36000000 | ||||
| RCC.AHBFreq_Value=72000000 | RCC.AHBFreq_Value=72000000 | ||||
| RCC.APB1CLKDivider=RCC_HCLK_DIV2 | RCC.APB1CLKDivider=RCC_HCLK_DIV2 | ||||
| @@ -128,15 +148,17 @@ RCC.HCLKFreq_Value=72000000 | |||||
| RCC.HSE_VALUE=12000000 | RCC.HSE_VALUE=12000000 | ||||
| RCC.HSI_VALUE=16000000 | RCC.HSI_VALUE=16000000 | ||||
| RCC.I2SClocksFreq_Value=192000000 | RCC.I2SClocksFreq_Value=192000000 | ||||
| RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,RCC_RTC_Clock_Source,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S | |||||
| RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S | |||||
| RCC.LSE_VALUE=32768 | RCC.LSE_VALUE=32768 | ||||
| RCC.LSI_VALUE=32000 | RCC.LSI_VALUE=32000 | ||||
| RCC.MCO2PinFreq_Value=72000000 | RCC.MCO2PinFreq_Value=72000000 | ||||
| RCC.PLLCLKFreq_Value=72000000 | RCC.PLLCLKFreq_Value=72000000 | ||||
| RCC.PLLM=8 | |||||
| RCC.PLLM=6 | |||||
| RCC.PLLN=72 | RCC.PLLN=72 | ||||
| RCC.PLLQCLKFreq_Value=36000000 | RCC.PLLQCLKFreq_Value=36000000 | ||||
| RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE | |||||
| RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSI | RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSI | ||||
| RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSI | |||||
| RCC.RTCFreq_Value=32000 | RCC.RTCFreq_Value=32000 | ||||
| RCC.RTCHSEDivFreq_Value=6000000 | RCC.RTCHSEDivFreq_Value=6000000 | ||||
| RCC.SYSCLKFreq_VALUE=72000000 | RCC.SYSCLKFreq_VALUE=72000000 | ||||
| @@ -147,20 +169,21 @@ RCC.VCOOutputFreq_Value=144000000 | |||||
| RCC.VcooutputI2S=192000000 | RCC.VcooutputI2S=192000000 | ||||
| SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1 | SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1 | ||||
| SH.S_TIM10_CH1.ConfNb=1 | SH.S_TIM10_CH1.ConfNb=1 | ||||
| SH.S_TIM2_CH1_ETR.0=TIM2_ETR,ClockSourceETR_Mode2 | |||||
| SH.S_TIM2_CH1_ETR.ConfNb=1 | |||||
| TIM10.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE | TIM10.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE | ||||
| TIM10.Channel=TIM_CHANNEL_1 | TIM10.Channel=TIM_CHANNEL_1 | ||||
| TIM10.IPParameters=Channel,Prescaler,AutoReloadPreload,Pulse | |||||
| TIM10.IPParameters=Channel,Prescaler,AutoReloadPreload,Pulse,OCPolarity_1 | |||||
| TIM10.OCPolarity_1=TIM_OCPOLARITY_LOW | |||||
| TIM10.Prescaler=72 | TIM10.Prescaler=72 | ||||
| TIM10.Pulse=32767 | TIM10.Pulse=32767 | ||||
| USART1.BaudRate=19200 | USART1.BaudRate=19200 | ||||
| USART1.IPParameters=VirtualMode,BaudRate | |||||
| USART1.IPParameters=VirtualMode,BaudRate,Parity,WordLength | |||||
| USART1.Parity=PARITY_ODD | |||||
| USART1.VirtualMode=VM_ASYNC | USART1.VirtualMode=VM_ASYNC | ||||
| USART1.WordLength=WORDLENGTH_9B | |||||
| VP_SYS_VS_Systick.Mode=SysTick | VP_SYS_VS_Systick.Mode=SysTick | ||||
| VP_SYS_VS_Systick.Signal=SYS_VS_Systick | VP_SYS_VS_Systick.Signal=SYS_VS_Systick | ||||
| VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer | VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer | ||||
| VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT | VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT | ||||
| VP_TIM9_VS_ClockSourceITR.Mode=TriggerSource_ITR2 | |||||
| VP_TIM9_VS_ClockSourceITR.Signal=TIM9_VS_ClockSourceITR | |||||
| VP_TIM9_VS_ControllerModeGated.Mode=Gated Mode | |||||
| VP_TIM9_VS_ControllerModeGated.Signal=TIM9_VS_ControllerModeGated | |||||
| board=custom | board=custom | ||||
| @@ -0,0 +1,49 @@ | |||||
| # 流程图 | |||||
| ## 脉冲计数流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B(脉冲完成) | |||||
| B --> C(中断) | |||||
| C -->D(脉冲计数) | |||||
| D --> E[结束] | |||||
| ``` | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> |检测到清零指令|B(清零计数) | |||||
| B --> C[结束] | |||||
| ``` | |||||
| ## 脉冲加减速流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B(计算加速度) | |||||
| B --> C(计算下一个脉冲的频率) | |||||
| C -->D(设置脉冲的频率) | |||||
| D --> E(开启脉冲) | |||||
| E --> F[结束] | |||||
| ``` | |||||
| ## 脉冲方向流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B{变量是否改变} | |||||
| B --> |是| C(修改引脚电平) | |||||
| B --> |否| D[结束] | |||||
| C --> D | |||||
| ``` | |||||
| ## 模式选择流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B{模式判断} | |||||
| B --> |相对模式| C(启用相对模式函数) | |||||
| B --> |绝对模式| D(启用绝对模式函数) | |||||
| C --> E[结束] | |||||
| D --> E[结束] | |||||
| ``` | |||||