Pārlūkot izejas kodu

2025.08.11

实现与上位机的基本通信
脉冲直线加减速
master
Chiri pirms 2 dienas
vecāks
revīzija
a76d8e5656
20 mainītis faili ar 2342 papildinājumiem un 2093 dzēšanām
  1. +2
    -1
      Core/Inc/main.h
  2. +63
    -41
      Core/Src/main.c
  3. +8
    -7
      Core/Src/stm32f4xx_it.c
  4. +635
    -612
      EWARM/PLSR.dep
  5. +1319
    -1317
      EWARM/PLSR.ewp
  6. +3
    -0
      EWARM/PLSR.ewt
  7. +80
    -38
      EWARM/settings/PLSR.dbgdt
  8. +11
    -4
      EWARM/settings/PLSR.dnx
  9. +18
    -19
      EWARM/settings/Project.wsdt
  10. +26
    -0
      Hardware/BitSet.c
  11. +9
    -0
      Hardware/BitSet.h
  12. +54
    -26
      Hardware/PLSR.c
  13. +5
    -5
      Hardware/PLSR.h
  14. +45
    -15
      Hardware/modbus.c
  15. +4
    -2
      Hardware/modbus.h
  16. +1
    -1
      Hardware/sram.c
  17. +1
    -1
      Hardware/sram.h
  18. +58
    -4
      Words/流程图.md
  19. Binārs
      Words/设计方案书 .doc
  20. Binārs
      Words/需求规格书.doc

+ 2
- 1
Core/Inc/main.h Parādīt failu

@@ -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;


+ 63
- 41
Core/Src/main.c Parādīt failu

@@ -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);


+ 8
- 7
Core/Src/stm32f4xx_it.c Parādīt failu

@@ -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();/* 设置下一次进入中断的脉冲数 */


+ 635
- 612
EWARM/PLSR.dep
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


+ 1319
- 1317
EWARM/PLSR.ewp
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


+ 3
- 0
EWARM/PLSR.ewt Parādīt failu

@@ -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>


+ 80
- 38
EWARM/settings/PLSR.dbgdt
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


+ 11
- 4
EWARM/settings/PLSR.dnx Parādīt failu

@@ -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>


+ 18
- 19
EWARM/settings/Project.wsdt
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


+ 26
- 0
Hardware/BitSet.c Parādīt failu

@@ -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);
}

+ 9
- 0
Hardware/BitSet.h Parādīt failu

@@ -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

+ 54
- 26
Hardware/PLSR.c Parādīt failu

@@ -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;
} }

+ 5
- 5
Hardware/PLSR.h Parādīt failu

@@ -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

+ 45
- 15
Hardware/modbus.c Parādīt failu

@@ -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);
} }

+ 4
- 2
Hardware/modbus.h Parādīt failu

@@ -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
- 1
Hardware/sram.c Parādīt failu

@@ -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)


+ 1
- 1
Hardware/sram.h Parādīt failu

@@ -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) ;


+ 58
- 4
Words/流程图.md Parādīt failu

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


Binārs
Words/设计方案书 .doc Parādīt failu


Binārs
Words/需求规格书.doc Parādīt failu


Notiek ielāde…
Atcelt
Saglabāt