| @@ -39,7 +39,8 @@ extern "C" { | |||||
| extern uint8_t ArrFlag; /* 加速度Flag */ | extern uint8_t ArrFlag; /* 加速度Flag */ | ||||
| extern float Acc; /* 加速度 */ | extern float Acc; /* 加速度 */ | ||||
| extern uint8_t PulseNum; /* 脉冲段计数 */ | extern uint8_t PulseNum; /* 脉冲段计数 */ | ||||
| extern uint32_t AllPulseCNT; | |||||
| extern int32_t AllPulseCNT; | |||||
| extern int32_t BaseCNT; | |||||
| extern uint8_t EndFlag; | extern uint8_t EndFlag; | ||||
| extern uint8_t FullFlag; | extern uint8_t FullFlag; | ||||
| @@ -28,16 +28,21 @@ | |||||
| #include "PLSR.h" | #include "PLSR.h" | ||||
| #include "includes.h" | #include "includes.h" | ||||
| #include "modbus.h" | #include "modbus.h" | ||||
| #include "bitset.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 */ | ||||
| float Acc; /* 加速度 */ | float Acc; /* 加速度 */ | ||||
| uint32_t AllPulseCNT = 0; | |||||
| int32_t AllPulseCNT = 0; | |||||
| int32_t BaseCNT = 0; | |||||
| uint8_t EndFlag = 0; | uint8_t EndFlag = 0; | ||||
| uint8_t FullFlag = 0; | uint8_t FullFlag = 0; | ||||
| extern uint8_t Register_H[16384]; ///<寄存器的高字节 | |||||
| extern uint8_t Register_L[16384]; ///<寄存器的低字节 | |||||
| /* USER CODE END PTD */ | /* USER CODE END PTD */ | ||||
| /* Private define ------------------------------------------------------------*/ | /* Private define ------------------------------------------------------------*/ | ||||
| @@ -72,7 +77,7 @@ void PVD_Init(void); | |||||
| /* 任务堆栈大小 */ | /* 任务堆栈大小 */ | ||||
| #define Task_Y1Direction_SIZE 256 | #define Task_Y1Direction_SIZE 256 | ||||
| #define Task_PulseStart_SIZE 256 | |||||
| #define Task_PulseStart_SIZE 512 | |||||
| #define Task_DirOutput_SIZE 256 | #define Task_DirOutput_SIZE 256 | ||||
| /* 任务控制块 */ | /* 任务控制块 */ | ||||
| @@ -99,7 +104,7 @@ void DirOutput(void *p_arg); | |||||
| int main(void) | int main(void) | ||||
| { | { | ||||
| /* USER CODE BEGIN 1 */ | /* USER CODE BEGIN 1 */ | ||||
| OS_ERR err; | |||||
| OS_ERR err; | |||||
| /* USER CODE END 1 */ | /* USER CODE END 1 */ | ||||
| /* MCU Configuration--------------------------------------------------------*/ | /* MCU Configuration--------------------------------------------------------*/ | ||||
| @@ -127,26 +132,28 @@ int main(void) | |||||
| MX_TIM10_Init(); | MX_TIM10_Init(); | ||||
| MX_TIM2_Init(); | MX_TIM2_Init(); | ||||
| /* USER CODE BEGIN 2 */ | /* USER CODE BEGIN 2 */ | ||||
| PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0 | |||||
| AccCount = 50; | |||||
| PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲 | |||||
| AddPulse(1, 100, -200, 0); | |||||
| AddPulse(2, 1, 55, 0); | |||||
| // PulseBaseInit(0, 0, 200);//设置为第0段脉冲开始,相对模式, 最大脉冲为0 | |||||
| // PulseInit(0, 1, 5, 0); //第几段脉冲,频率,数量,下一段脉冲 | |||||
| // AddPulse(1, 100, 200, 0); | |||||
| // AddPulse(2, 1, 55, 0); | |||||
| // Options.AccUpTime = 50; | |||||
| BSP_Init(); | BSP_Init(); | ||||
| OSInit(&err); | OSInit(&err); | ||||
| CPU_SR_ALLOC(); | |||||
| CPU_CRITICAL_ENTER();///进入临界区 | |||||
| /* 任务1 */ | /* 任务1 */ | ||||
| OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */ | |||||
| (CPU_CHAR* )"Y1Direction", /* 任务名字 */ | |||||
| (OS_TASK_PTR)Y1Direction, /* 任务函数 */ | |||||
| (void * )0, /* 传递给任务函数的参数 */ | |||||
| (OS_PRIO )TASK_Y1Direction, /* 任务优先级 */ | |||||
| (CPU_STK * )&Task_Y1Direction_STK[0], /* 任务堆栈基地址 */ | |||||
| OSTaskCreate((OS_TCB * )&Y1Direction_Tsk, /* 任务控制块 */ | |||||
| (CPU_CHAR* )"Y1Direction", /* 任务名字 */ | |||||
| (OS_TASK_PTR)Y1Direction, /* 任务函数 */ | |||||
| (void * )0, /* 传递给任务函数的参数 */ | |||||
| (OS_PRIO )TASK_Y1Direction, /* 任务优先级 */ | |||||
| (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时禁止接收消息 */ | ||||
| @@ -183,8 +190,12 @@ int main(void) | |||||
| (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); | ||||
| /* 掉电数据读取 */ | |||||
| ModbusLoadSRAM(); | |||||
| CPU_CRITICAL_EXIT() ; ///退出临界区 | |||||
| OSStart(&err); | OSStart(&err); | ||||
| /* USER CODE END 2 */ | /* USER CODE END 2 */ | ||||
| /* Infinite loop */ | /* Infinite loop */ | ||||
| @@ -259,8 +270,9 @@ void Y1Direction(void *p_arg) | |||||
| /* 脉冲加减速 */ | /* 脉冲加减速 */ | ||||
| if (ArrFlag == 1) | if (ArrFlag == 1) | ||||
| { | { | ||||
| if(TIM2->CNT < AccCount) | |||||
| if(TIM2->CNT < Options.AccUpTime) | |||||
| { | { | ||||
| if(TIM2->CNT == 0) PulseStart(); /* 开始产生脉冲 */ | |||||
| SetFrequency(0, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc); | SetFrequency(0, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc); | ||||
| } | } | ||||
| else | else | ||||
| @@ -270,29 +282,32 @@ void Y1Direction(void *p_arg) | |||||
| } | } | ||||
| } | } | ||||
| /* 获取总的脉冲数 */ | |||||
| if(EndFlag || FullFlag) | |||||
| { | |||||
| if(EndFlag) | |||||
| { | |||||
| AllPulseCNT = GetBase(NowPulse) + PulseOutput[NowPulse].PulseCount; | |||||
| } | |||||
| if(FullFlag) | |||||
| { | |||||
| AllPulseCNT = MAX_Pulse; | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| AllPulseCNT = TIM2->CNT + GetBase(NowPulse); | |||||
| } | |||||
| AllPulseCNT = BaseCNT + TIM2->CNT; | |||||
| CountSave(); | |||||
| // /* 获取总的脉冲数 */ | |||||
| // if(EndFlag || FullFlag) | |||||
| // { | |||||
| // 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 个节拍 | OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * @brief 任务2,脉冲开始 | |||||
| * @brief 任务2,脉冲开始,数据处理 | |||||
| * @return 无 | * @return 无 | ||||
| */ | */ | ||||
| void PulseStartTsk(void *p_arg) | void PulseStartTsk(void *p_arg) | ||||
| @@ -300,17 +315,22 @@ void PulseStartTsk(void *p_arg) | |||||
| p_arg = p_arg; | p_arg = p_arg; | ||||
| OS_ERR err; | OS_ERR err; | ||||
| uint8_t EN = 1; | uint8_t EN = 1; | ||||
| while(1) | while(1) | ||||
| { | { | ||||
| if(Register_L[3000] == 0x01 && EN == 1) | |||||
| if(Register_L[0x3000] == 0x01 && EN == 1) | |||||
| { | { | ||||
| PulseStart(); | PulseStart(); | ||||
| EN = 0; | EN = 0; | ||||
| } | } | ||||
| else if(Register_L[3000] == 0x02 && EN == 0) | |||||
| else if(Register_L[0x3000] == 0x02 && EN == 0) | |||||
| { | { | ||||
| EN = 1; | EN = 1; | ||||
| } | } | ||||
| PLSRPluseLoad(); //读取脉冲设置 | |||||
| PLSROptionLoad(); //读取脉冲基础设置 | |||||
| ModbusSaveSRAM(); | |||||
| OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | ||||
| } | } | ||||
| } | } | ||||
| @@ -370,6 +390,9 @@ void DirOutput(void *p_arg) | |||||
| HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET); | HAL_GPIO_WritePin(GPIOH, Y15_Pin, GPIO_PIN_RESET); | ||||
| } | } | ||||
| } | } | ||||
| OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | ||||
| } | } | ||||
| } | } | ||||
| @@ -472,11 +495,10 @@ void HAL_PWR_PVDCallback(void) | |||||
| // 检查电压是否低于阈值 | // 检查电压是否低于阈值 | ||||
| if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) | if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) | ||||
| { | { | ||||
| HAL_GPIO_TogglePin(GPIOH, Y12_Pin); | |||||
| /* 掉电处理内容 */ | /* 掉电处理内容 */ | ||||
| PLSRSramSave(); | |||||
| ModbusSaveSRAM(); | |||||
| } | } | ||||
| OSIntExit(); /* 退出中断 */ | OSIntExit(); /* 退出中断 */ | ||||
| } | } | ||||
| @@ -490,7 +512,7 @@ void PVD_Init(void) | |||||
| HAL_PWR_EnablePVD(); /* 使能PVD */ | HAL_PWR_EnablePVD(); /* 使能PVD */ | ||||
| PvdStruct.PVDLevel = PWR_PVDLEVEL_3; /* PVD阈值3.1V */ | |||||
| PvdStruct.PVDLevel = PWR_PVDLEVEL_5; /* PVD阈值3.1V */ | |||||
| PvdStruct.Mode = PWR_PVD_MODE_IT_RISING; /* 检测掉电 */ | PvdStruct.Mode = PWR_PVD_MODE_IT_RISING; /* 检测掉电 */ | ||||
| HAL_PWR_ConfigPVD(&PvdStruct); | HAL_PWR_ConfigPVD(&PvdStruct); | ||||
| @@ -218,8 +218,9 @@ void TIM2_IRQHandler(void) | |||||
| /* USER CODE BEGIN TIM2_IRQn 1 */ | /* USER CODE BEGIN TIM2_IRQn 1 */ | ||||
| PulseNum ++; /* 脉冲段数增加 */ | PulseNum ++; /* 脉冲段数增加 */ | ||||
| BaseCNT += TIM2->ARR; | |||||
| if(Options.RunMod == 0) | |||||
| if (Options.RunMod == 0) | |||||
| { | { | ||||
| /* 如果之后还有脉冲 */ | /* 如果之后还有脉冲 */ | ||||
| if(Options.AllPulse - PulseNum > 0) | if(Options.AllPulse - PulseNum > 0) | ||||
| @@ -231,16 +232,16 @@ void TIM2_IRQHandler(void) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */ | |||||
| } | } | ||||
| /* 准备加减速 */ | /* 准备加减速 */ | ||||
| Acc = GetAcc(PulseOutput[PrePulse].Frequency, | Acc = GetAcc(PulseOutput[PrePulse].Frequency, | ||||
| PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */ | |||||
| PulseOutput[NowPulse].Frequency, Options.AccUpTime); /* 计算加速度 */ | |||||
| ArrFlag = 1; | ArrFlag = 1; | ||||
| SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | ||||
| PulseStart(); /* 开始产生脉冲 */ | |||||
| } | } | ||||
| /* 如果之后没有脉冲 */ | /* 如果之后没有脉冲 */ | ||||
| else | else | ||||
| @@ -250,7 +251,7 @@ void TIM2_IRQHandler(void) | |||||
| EndFlag = 1; | EndFlag = 1; | ||||
| } | } | ||||
| } | } | ||||
| else | |||||
| if(Options.RunMod == 1) | |||||
| { | { | ||||
| if(AllPulseCNT >= MAX_Pulse) | if(AllPulseCNT >= MAX_Pulse) | ||||
| { | { | ||||
| @@ -270,12 +271,12 @@ void TIM2_IRQHandler(void) | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| NowPulse = PulseOutput[NowPulse].NextPulse; /* 进入下一段脉冲 */ | |||||
| NowPulse = PulseOutput[NowPulse].NextPulse - 1; /* 进入下一段脉冲 */ | |||||
| } | } | ||||
| /* 准备加减速 */ | /* 准备加减速 */ | ||||
| Acc = GetAcc(PulseOutput[PrePulse].Frequency, | Acc = GetAcc(PulseOutput[PrePulse].Frequency, | ||||
| PulseOutput[NowPulse].Frequency, AccCount); /* 计算加速度 */ | |||||
| PulseOutput[NowPulse].Frequency, Options.AccUpTime); /* 计算加速度 */ | |||||
| ArrFlag = 1; | ArrFlag = 1; | ||||
| SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | ||||
| @@ -1283,6 +1283,9 @@ | |||||
| </group> | </group> | ||||
| <group> | <group> | ||||
| <name>Hardware</name> | <name>Hardware</name> | ||||
| <file> | |||||
| <name>$PROJ_DIR$\..\Hardware\BitSet.c</name> | |||||
| </file> | |||||
| <file> | <file> | ||||
| <name>$PROJ_DIR$\..\Hardware\CRC.c</name> | <name>$PROJ_DIR$\..\Hardware\CRC.c</name> | ||||
| </file> | </file> | ||||
| @@ -20,7 +20,7 @@ | |||||
| <LeaveTargetRunning>_ 0</LeaveTargetRunning> | <LeaveTargetRunning>_ 0</LeaveTargetRunning> | ||||
| </StLinkDriver> | </StLinkDriver> | ||||
| <DebugChecksum> | <DebugChecksum> | ||||
| <Checksum>1004691111</Checksum> | |||||
| <Checksum>2315233233</Checksum> | |||||
| </DebugChecksum> | </DebugChecksum> | ||||
| <Exceptions> | <Exceptions> | ||||
| <StopOnUncaught>_ 0</StopOnUncaught> | <StopOnUncaught>_ 0</StopOnUncaught> | ||||
| @@ -60,12 +60,19 @@ | |||||
| <regBase0>TIM2_CNT 10</regBase0> | <regBase0>TIM2_CNT 10</regBase0> | ||||
| </Registers> | </Registers> | ||||
| <struct_types> | <struct_types> | ||||
| <Fmt0>Pulse-Frequency 3 0</Fmt0> | |||||
| <Fmt1>Pulse-NextPulse 3 0</Fmt1> | |||||
| <Fmt2>Pulse-PulseCount 3 0</Fmt2> | |||||
| <Fmt0>Option-AccUpTime 3 0</Fmt0> | |||||
| <Fmt1>Option-InitSpeed 3 0</Fmt1> | |||||
| <Fmt2>Pulse-Frequency 3 0</Fmt2> | |||||
| <Fmt3>Pulse-NextPulse 3 0</Fmt3> | |||||
| <Fmt4>Pulse-PulseCount 3 0</Fmt4> | |||||
| </struct_types> | </struct_types> | ||||
| <array_types> | |||||
| <Fmt0>uint8_t[10000] 4 0</Fmt0> | |||||
| </array_types> | |||||
| <watch_formats> | <watch_formats> | ||||
| <Fmt0>{W}1:AllPulseCNT 3 0</Fmt0> | <Fmt0>{W}1:AllPulseCNT 3 0</Fmt0> | ||||
| <Fmt1>{W}1:c 4 0</Fmt1> | |||||
| <Fmt2>{W}1:datCount 3 0</Fmt2> | |||||
| </watch_formats> | </watch_formats> | ||||
| <Trace2> | <Trace2> | ||||
| <Enabled>0</Enabled> | <Enabled>0</Enabled> | ||||
| @@ -0,0 +1,26 @@ | |||||
| #include "Bitset.h" | |||||
| #include "string.h" | |||||
| void Set8_16(uint16_t *Dat , uint8_t *BufferH, uint8_t *BufferL) | |||||
| { | |||||
| uint16_t temp_dat; | |||||
| uint8_t temp_BufferH, temp_BufferL; | |||||
| temp_BufferH = *BufferH; | |||||
| temp_BufferL = *BufferL; | |||||
| temp_dat = (temp_BufferH << 8)|temp_BufferL; | |||||
| memcpy(Dat, &temp_dat, 2); | |||||
| } | |||||
| void Set16_32(uint32_t *Dat , uint16_t *BufferH, uint16_t *BufferL) | |||||
| { | |||||
| uint32_t temp_dat; | |||||
| uint16_t temp_BufferH, temp_BufferL; | |||||
| temp_BufferH = *BufferH; | |||||
| temp_BufferL = *BufferL; | |||||
| temp_dat = (temp_BufferH << 16)|temp_BufferL; | |||||
| memcpy(Dat, &temp_dat, 4); | |||||
| } | |||||
| @@ -0,0 +1,9 @@ | |||||
| #ifndef __BITSET_H__ | |||||
| #define __BITSET_H__ | |||||
| #include "stdint.h" | |||||
| void Set8_16(uint16_t *Dat , uint8_t *BufferH, uint8_t *BufferL); | |||||
| void Set16_32(uint32_t *Dat , uint16_t *BufferH, uint16_t *BufferL); | |||||
| #endif | |||||
| @@ -4,6 +4,7 @@ | |||||
| #include "sram.h" | #include "sram.h" | ||||
| #include <string.h> | #include <string.h> | ||||
| #include "modbus.h" | #include "modbus.h" | ||||
| #include "bitset.h" | |||||
| Pulse PulseOutput[10]; // 十段脉冲的配置 | Pulse PulseOutput[10]; // 十段脉冲的配置 | ||||
| Option Options; | Option Options; | ||||
| @@ -195,45 +196,72 @@ uint32_t GetBase(uint8_t NowPulseNUM) | |||||
| return temp; | 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) | |||||
| { | |||||
| uint32_t temp[80] = {0}; | |||||
| Read_Backup_SRAM(temp, 80); | |||||
| } | |||||
| /** | /** | ||||
| * @brief 从寄存器读取设置参数 | * @brief 从寄存器读取设置参数 | ||||
| * @return 无 | * @return 无 | ||||
| */ | */ | ||||
| void PLSROptionLoad(void) | void PLSROptionLoad(void) | ||||
| { | { | ||||
| /* 数据转换 */ | |||||
| uint32_t InitSpeed; | |||||
| uint16_t tempH, tempL; | |||||
| Set8_16(&tempH, &Register_H[0x1009], &Register_L[0x1009]); | |||||
| Set8_16(&tempL, &Register_H[0x100A], &Register_L[0x100A]); | |||||
| Set16_32(&InitSpeed, &tempH, &tempL); | |||||
| /* 数据读取 */ | |||||
| Options.SentPost = Register_L[0x1000]; | Options.SentPost = Register_L[0x1000]; | ||||
| Options.DirPost = Register_L[0x1001]; | Options.DirPost = Register_L[0x1001]; | ||||
| Options.EXT = Register_L[0x1002]; | Options.EXT = Register_L[0x1002]; | ||||
| Options.DirDelay = Register_L[0x1003]; //可能更大。 | |||||
| Options.DirDelay = Register_L[0x1003]; //可能更大。 | |||||
| Options.Dir = Register_L[0x1004]; | Options.Dir = Register_L[0x1004]; | ||||
| Options.AccMod = Register_L[0x1005]; | Options.AccMod = Register_L[0x1005]; | ||||
| Options.RunMod = Register_L[0x1006]; | Options.RunMod = Register_L[0x1006]; | ||||
| Options.AllPulse = Register_L[0x1007]; | Options.AllPulse = Register_L[0x1007]; | ||||
| Options.StartPulse = Register_L[0x1008]; | Options.StartPulse = Register_L[0x1008]; | ||||
| Options.InitSpeed = Register_L[0x1009]; //需要修改。 | |||||
| Options.InitSpeed = InitSpeed; | |||||
| Options.AccUpTime = Register_L[0x100B]; | Options.AccUpTime = Register_L[0x100B]; | ||||
| Options.AddDownTime = Register_L[0x100C]; | |||||
| Options.AccDownTime = Register_L[0x100C]; | |||||
| } | |||||
| void PLSRPluseLoad(void) | |||||
| { | |||||
| uint32_t temp_Frequency, temp_PulseCount; | |||||
| uint16_t FrequencyDatH, FrequencyDatL, PulseCountDatH, PulseCountDatL; | |||||
| for (int i = 0; i < 10; i++) | |||||
| { | |||||
| Set8_16(&FrequencyDatH, &Register_H[0x1100 + 0x10 * i] | |||||
| , &Register_L[0x1100 + 0x10 * i]); | |||||
| Set8_16(&FrequencyDatL, &Register_H[0x1101 + 0x10 * i] | |||||
| , &Register_L[0x1101 + 0x10 * i]); | |||||
| Set16_32(&temp_Frequency, &FrequencyDatL, &FrequencyDatH); | |||||
| Set8_16(&PulseCountDatH, &Register_H[0x1102 + 0x10 * i] | |||||
| , &Register_L[0x1102 + 0x10 * i]); | |||||
| Set8_16(&PulseCountDatL, &Register_H[0x1103 + 0x10 * i] | |||||
| , &Register_L[0x1103 + 0x10 * i]); | |||||
| Set16_32(&temp_PulseCount, &PulseCountDatL, &PulseCountDatH); | |||||
| PulseOutput[i].Frequency = temp_Frequency; | |||||
| PulseOutput[i].PulseCount = temp_PulseCount; | |||||
| PulseOutput[i].EXT = Register_L[0x1104 + 0x10 * i]; | |||||
| PulseOutput[i].NextPulse = Register_L[0x1105 + 0x10 * i]; | |||||
| } | |||||
| } | |||||
| void CountSave(void) | |||||
| { | |||||
| int32_t temp_Count = 0; | |||||
| uint16_t DatH, DatL; | |||||
| memcpy(&temp_Count, &AllPulseCNT, 4); | |||||
| DatH = temp_Count / 0xffff; | |||||
| DatL = temp_Count % 0xffff; | |||||
| Register_H[0x2001] = DatH / 0xff; | |||||
| Register_L[0x2001] = DatH % 0xff; | |||||
| Register_H[0x2000] = DatL / 0xff; | |||||
| Register_L[0x2000] = DatL % 0xff; | |||||
| } | } | ||||
| @@ -25,8 +25,8 @@ typedef struct | |||||
| uint8_t AllPulse; ///<<脉冲总段数 | uint8_t AllPulse; ///<<脉冲总段数 | ||||
| uint8_t StartPulse; ///<<起始执行段数 | uint8_t StartPulse; ///<<起始执行段数 | ||||
| uint32_t InitSpeed; ///<<脉冲默认速度 | uint32_t InitSpeed; ///<<脉冲默认速度 | ||||
| uint8_t AddUpTime; ///<<脉冲默认速度加速时间 | |||||
| uint8_t AddDownTime; ///<<脉冲默认速度减速时间 | |||||
| uint8_t AccUpTime; ///<<脉冲默认速度加速时间 | |||||
| uint8_t AccDownTime; ///<<脉冲默认速度减速时间 | |||||
| } Option; | } Option; | ||||
| /* 变量声明 */ | /* 变量声明 */ | ||||
| @@ -51,11 +51,11 @@ 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 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 PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse); | ||||
| void SetNextPulse(void); | void SetNextPulse(void); | ||||
| void PLSROptionLoad(void); | |||||
| void PLSRPluseLoad(void); | |||||
| void CountSave(void); | |||||
| uint32_t GetBase(uint8_t NowPulseNUM); | uint32_t GetBase(uint8_t NowPulseNUM); | ||||
| //掉电保持 | |||||
| void PLSRSramSave(void); | |||||
| void PLSRSramRead(void); | |||||
| #endif | #endif | ||||
| @@ -2,8 +2,8 @@ | |||||
| #include "PLSR.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[16384]; ///<寄存器的高字节 | |||||
| uint8_t Register_L[16384]; ///<寄存器的低字节 | |||||
| uint8_t EXRegister_H[10000]; ///<0x10000开始寄存器的高字节 | uint8_t EXRegister_H[10000]; ///<0x10000开始寄存器的高字节 | ||||
| uint8_t EXRegister_L[10000]; ///<0x10000开始寄存器的低字节 | uint8_t EXRegister_L[10000]; ///<0x10000开始寄存器的低字节 | ||||
| @@ -92,6 +92,8 @@ void ProcessModbusFrame(uint8_t buffer[], uint16_t longth) | |||||
| ;break; | ;break; | ||||
| case WRITE_MUL_EXREGISTER_CODE: WriteEXRegisterProcess(buffer, longth) /* 写0x10000处的寄存器 31*/ | case WRITE_MUL_EXREGISTER_CODE: WriteEXRegisterProcess(buffer, longth) /* 写0x10000处的寄存器 31*/ | ||||
| ;break; | ;break; | ||||
| case WRITE_ONLY_REGISTER: WriteOnlyRegister(buffer, longth) | |||||
| ;break; | |||||
| default :ErrorBack(buffer, longth); /* 无效指令码 */ | default :ErrorBack(buffer, longth); /* 无效指令码 */ | ||||
| ;break; | ;break; | ||||
| @@ -576,13 +578,41 @@ void WriteCoilProcess(uint8_t buffer[], uint16_t longth) | |||||
| /* 如果不是广播,发送返回消息 */ | /* 如果不是广播,发送返回消息 */ | ||||
| if(buffer[0] == SLAVES_ADDRES) | if(buffer[0] == SLAVES_ADDRES) | ||||
| { | { | ||||
| HAL_UART_Transmit_DMA(&huart1, buffer, longth); | |||||
| memcpy(SentPocket, buffer, longth); | |||||
| HAL_UART_Transmit_DMA(&huart1, SentPocket, longth); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * @brief 0x06指令码的执行,写入单寄存器 | |||||
| * @param[in] buffer[] 预处理的数据 | |||||
| * @param[in] longth 数据的长度 | |||||
| * @return 无 | |||||
| */ | |||||
| void WriteOnlyRegister(uint8_t buffer[], uint16_t longth) | |||||
| { | |||||
| uint16_t startPoint; | |||||
| startPoint = (buffer[2] << 8 )| buffer[3]; /* 将8位数据组装位16位 */ | |||||
| if ((buffer[0] == SLAVES_ADDRES || buffer[0] == 0x00))/* 如果是与本设备通信 */ | |||||
| { | |||||
| Register_H[startPoint] = buffer[4]; | |||||
| Register_L[startPoint] = buffer[5]; | |||||
| /* 如果不是广播,发送返回消息 */ | |||||
| if(buffer[0] == SLAVES_ADDRES) | |||||
| { | |||||
| memcpy(SentPocket, buffer, longth); | |||||
| HAL_UART_Transmit_DMA(&huart1, SentPocket, longth); | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * @brief 指令码错误的返回报文 | * @brief 指令码错误的返回报文 | ||||
| * @param[in] buffer[] 预处理的数据 | * @param[in] buffer[] 预处理的数据 | ||||
| @@ -668,13 +698,13 @@ void GetHistory(uint8_t buffer[], uint16_t longth) | |||||
| */ | */ | ||||
| void ModbusLoadSRAM(void) | void ModbusLoadSRAM(void) | ||||
| { | { | ||||
| uint32_t temp[5]; | |||||
| Read_Backup_SRAM(temp,5); | |||||
| memcpy(SramData, temp, 20); | |||||
| for(int i = 0; i < 10; i++) | |||||
| uint32_t temp[256] = {0}; | |||||
| Read_Backup_SRAM(temp,256); | |||||
| memcpy(SramData, temp, 1024); | |||||
| for(int i = 0; i < 512; i++) | |||||
| { | { | ||||
| Register_H[i] = SramData[i * 2]; | |||||
| Register_L[i] = SramData[i * 2 + 1]; | |||||
| Register_H[i + 4096] = SramData[i * 2]; | |||||
| Register_L[i + 4096] = SramData[i * 2 + 1]; | |||||
| } | } | ||||
| } | } | ||||
| @@ -684,12 +714,12 @@ void ModbusLoadSRAM(void) | |||||
| */ | */ | ||||
| void ModbusSaveSRAM(void) | void ModbusSaveSRAM(void) | ||||
| { | { | ||||
| uint32_t temp[5]; | |||||
| for (int i = 0; i < 10; i++) | |||||
| uint32_t temp[256] = {0}; | |||||
| for (int i = 0; i < 512; i++) | |||||
| { | { | ||||
| SramData[i * 2] = Register_H[i]; | |||||
| SramData[i * 2 + 1] = Register_L[i]; | |||||
| SramData[i * 2] = Register_H[i + 4096]; | |||||
| SramData[i * 2 + 1] = Register_L[i + 4096]; | |||||
| } | } | ||||
| memcpy(temp, SramData, 20); | |||||
| Write_Backup_SRAM(temp, 5); | |||||
| memcpy(temp, SramData, 1024); | |||||
| Write_Backup_SRAM(temp, 256); | |||||
| } | } | ||||
| @@ -19,6 +19,7 @@ | |||||
| #define WRITE_MUL_EXREGISTER_CODE 0x31 | #define WRITE_MUL_EXREGISTER_CODE 0x31 | ||||
| #define GET_HISTORY_CODE 0x55 | #define GET_HISTORY_CODE 0x55 | ||||
| #define READ_ODD_REGUSTER_CODE 0x33 | #define READ_ODD_REGUSTER_CODE 0x33 | ||||
| #define WRITE_ONLY_REGISTER 0x06 | |||||
| #define SLAVES_ADDRES 0x01 | #define SLAVES_ADDRES 0x01 | ||||
| @@ -34,6 +35,7 @@ void WriteCoilProcess(uint8_t buffer[], uint16_t longth); | |||||
| void ReadOddRegisterProcess(uint8_t buffer[], uint16_t longth); | void ReadOddRegisterProcess(uint8_t buffer[], uint16_t longth); | ||||
| void ReadEXRegisterProcess(uint8_t buffer[], uint16_t longth); | void ReadEXRegisterProcess(uint8_t buffer[], uint16_t longth); | ||||
| void WriteEXRegisterProcess(uint8_t buffer[], uint16_t longth); | void WriteEXRegisterProcess(uint8_t buffer[], uint16_t longth); | ||||
| void WriteOnlyRegister(uint8_t buffer[], uint16_t longth); | |||||
| void SaveHistory(uint8_t buffer[], uint16_t longth); | void SaveHistory(uint8_t buffer[], uint16_t longth); | ||||
| void LoadHistory(void); | void LoadHistory(void); | ||||
| @@ -48,7 +50,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]; ///<寄存器的低字节 | |||||
| extern uint8_t Register_H[16384]; ///<寄存器的高字节 | |||||
| extern uint8_t Register_L[16384]; ///<寄存器的低字节 | |||||
| #endif | #endif | ||||
| @@ -1,7 +1,7 @@ | |||||
| #include "sram.h" | #include "sram.h" | ||||
| uint8_t SramData[20]; | |||||
| uint8_t SramData[1024]; | |||||
| // 写入数据到备份SRAM | // 写入数据到备份SRAM | ||||
| void Write_Backup_SRAM(uint32_t* data, uint32_t size) | void Write_Backup_SRAM(uint32_t* data, uint32_t size) | ||||
| @@ -6,7 +6,7 @@ | |||||
| #define BKP_SRAM_BASE 0x40024000 // F4系列备份SRAM基地址 | #define BKP_SRAM_BASE 0x40024000 // F4系列备份SRAM基地址 | ||||
| #define DATA_SIZE 1024 // 要读写的数据量 | #define DATA_SIZE 1024 // 要读写的数据量 | ||||
| extern uint8_t SramData[20]; | |||||
| extern uint8_t SramData[1024]; | |||||
| void Write_Backup_SRAM(uint32_t* data, uint32_t size); | 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) ; | ||||
| @@ -4,10 +4,12 @@ | |||||
| ```mermaid | ```mermaid | ||||
| flowchart | flowchart | ||||
| A[开始] --> B(脉冲完成) | |||||
| B --> C(中断) | |||||
| C -->D(脉冲计数) | |||||
| D --> E[结束] | |||||
| A[开始] --> B(根据脉冲段的要求设置对应的ARR) | |||||
| B -->|达到要求| C(进入中断) | |||||
| C -->D{是否有下一段脉冲} | |||||
| D --> |无下一段脉冲|E[结束] | |||||
| D --> |有下一段脉冲|F(设置ARR为下一段脉冲的脉冲数) | |||||
| F --> E[结束] | |||||
| ``` | ``` | ||||
| ```mermaid | ```mermaid | ||||
| @@ -47,3 +49,55 @@ C --> E[结束] | |||||
| D --> E[结束] | D --> E[结束] | ||||
| ``` | ``` | ||||
| ## PLSR多段脉冲输出功能实现流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B(根据频率设置对应的PSC和ARR) | |||||
| B --> C(根据当前运行的脉冲设置计数定时器的ARR) | |||||
| C -->|脉冲段结束| D{检查是否存在下一段} | |||||
| D -->|有下一段脉冲| E(进行脉冲替换和脉冲加减速) | |||||
| D -->|没有下一段脉冲|F(停止脉冲发送定时器) | |||||
| E --> G[结束] | |||||
| F --> G[结束] | |||||
| ``` | |||||
| ## 掉电保存流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B(开始并使能Sram区域) | |||||
| B --> C(创建掉电保存任务) | |||||
| C --> D(每个一段时间保存对应的数据) | |||||
| D --> E[结束] | |||||
| ``` | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] --> B(从Sram区域读取保存的数据) | |||||
| B --> C(将读取到的数据进行解析并存入结构体) | |||||
| C --> D[结束] | |||||
| ``` | |||||
| ## 系统结构图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[主控] --> B(脉冲计数) | |||||
| A[主控] --> C(脉冲的加减速) | |||||
| A[主控] --> D(脉冲的方向) | |||||
| A[主控] --> E(运动模式切换) | |||||
| A[主控] --> F(多段脉冲输出) | |||||
| A[主控] --> G(掉电保存) | |||||
| ``` | |||||
| ## 与上位机通信流程图 | |||||
| ```mermaid | |||||
| flowchart | |||||
| A[开始] -->B(收到数据) | |||||
| B --> C(解析并处理数据) | |||||
| C --> D(根据数据进行相关处理) | |||||
| D --> E[结束] | |||||
| ``` | |||||