@@ -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[结束] | |||||
``` | |||||