@@ -55,6 +55,7 @@ void SVC_Handler(void); | |||
void DebugMon_Handler(void); | |||
void PendSV_Handler(void); | |||
void SysTick_Handler(void); | |||
void TIM1_UP_TIM10_IRQHandler(void); | |||
void TIM2_IRQHandler(void); | |||
void USART1_IRQHandler(void); | |||
void DMA2_Stream2_IRQHandler(void); | |||
@@ -48,6 +48,8 @@ void MX_GPIO_Init(void) | |||
__HAL_RCC_GPIOF_CLK_ENABLE(); | |||
__HAL_RCC_GPIOH_CLK_ENABLE(); | |||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||
__HAL_RCC_GPIOG_CLK_ENABLE(); | |||
__HAL_RCC_GPIOB_CLK_ENABLE(); | |||
/*Configure GPIO pin Output Level */ | |||
HAL_GPIO_WritePin(GPIOH, Y15_Pin|Y14_Pin|Y13_Pin|Y12_Pin, GPIO_PIN_RESET); | |||
@@ -59,6 +61,18 @@ void MX_GPIO_Init(void) | |||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | |||
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); | |||
/*Configure GPIO pin : PG12 */ | |||
GPIO_InitStruct.Pin = GPIO_PIN_12; | |||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; | |||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); | |||
/*Configure GPIO pin : PB5 */ | |||
GPIO_InitStruct.Pin = GPIO_PIN_5; | |||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; | |||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |||
} | |||
/* USER CODE BEGIN 2 */ | |||
@@ -29,6 +29,8 @@ | |||
#include "includes.h" | |||
#include "modbus.h" | |||
#include "bitset.h" | |||
/* USER CODE END Includes */ | |||
/* Private typedef -----------------------------------------------------------*/ | |||
@@ -38,8 +40,9 @@ float Acc; /* | |||
int32_t AllPulseCNT = 0; | |||
int32_t BaseCNT = 0; | |||
uint8_t EndFlag = 0; | |||
uint8_t FullFlag = 0; | |||
uint8_t AccITCount = 0; | |||
uint8_t PulseStartFlag = 0; | |||
extern uint8_t Register_H[16384]; ///<寄存器的高字节 | |||
extern uint8_t Register_L[16384]; ///<寄存器的低字节 | |||
@@ -72,7 +75,7 @@ void PVD_Init(void); | |||
/* 任务优先级 */ | |||
#define TASK_Y1Direction 4 | |||
#define TASK_PulseStart 4 | |||
#define TASK_PulseStart 3 | |||
#define TASK_DirOutput 4 | |||
/* 任务堆栈大小 */ | |||
@@ -279,7 +282,7 @@ void Y1Direction(void *p_arg) | |||
/* 脉冲加速 */ | |||
if (Acc > 0) | |||
{ | |||
if (TIM2->CNT < AccUpCount) | |||
if (TIM2->CNT <= AccUpCount) | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc); | |||
if (TIM2->CNT == 0) PulseStart(); /* 开始产生脉冲 */ | |||
@@ -293,7 +296,7 @@ void Y1Direction(void *p_arg) | |||
/* 脉冲减速 */ | |||
else if (Acc <= 0) | |||
{ | |||
if (TIM2->CNT < AccDownCount) | |||
if (TIM2->CNT <= AccDownCount) | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[PrePulse].Frequency + TIM2->CNT * Acc); | |||
if(TIM2->CNT == 0) PulseStart(); /* 开始产生脉冲 */ | |||
@@ -303,42 +306,9 @@ void Y1Direction(void *p_arg) | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | |||
ArrFlag = 0; | |||
} | |||
} | |||
} | |||
/* 最后一段脉冲的减速 */ | |||
if (NowPulse == Options.AllPulse - 1) | |||
{ | |||
Acc = - (float)PulseOutput[NowPulse].Frequency / (float)AccDownCount;/* 计算加速度 */ | |||
if (TIM2->CNT > PulseOutput[NowPulse].PulseCount - AccUpCount - AccDownCount) /* 当达到脉冲减速的位置开始减速 */ | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency + TIM2->CNT * Acc); | |||
} | |||
} | |||
/* 第一段脉冲的加速 */ | |||
if (NowPulse == Options.StartPulse) | |||
{ | |||
Acc = (float)PulseOutput[NowPulse].Frequency / (float)AccUpCount;/* 计算加速度 */ | |||
if (AccUpCount < PulseOutput[NowPulse].PulseCount)//如果能够完成加速 | |||
{ | |||
if(TIM2->CNT < AccUpCount) | |||
{ | |||
SetFrequency(Options.SentPost, TIM2->CNT * Acc); | |||
} | |||
else | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | |||
} | |||
} | |||
else //不能完成加速 | |||
{ | |||
} | |||
} | |||
} | |||
AllPulseCNT = BaseCNT + TIM2->CNT; | |||
CountSave(); | |||
@@ -363,18 +333,53 @@ void PulseStartTsk(void *p_arg) | |||
PLSROptionLoad(); //读取脉冲基础设置 | |||
if(Register_L[0x3000] == 0x01 && EN == 1) | |||
{ | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | |||
PulseStart(); | |||
EN = 0; | |||
PulseStartFlag = 1; | |||
} | |||
else if(Register_L[0x3000] == 0x02 && EN == 0) | |||
{ | |||
EN = 1; | |||
} | |||
ModbusSaveSRAM(); | |||
ModbusSaveSRAM(); | |||
/* 第一段脉冲的加速 */ | |||
if (NowPulse == Options.StartPulse && PulseStartFlag == 1) | |||
{ | |||
Acc = (float)PulseOutput[NowPulse].Frequency / (float)AccUpCount;/* 计算加速度 */ | |||
if (AccUpCount < PulseOutput[NowPulse].PulseCount)//如果能够完成加速 | |||
{ | |||
if(TIM2->CNT < AccUpCount) | |||
{ | |||
SetFrequency(Options.SentPost, TIM2->CNT * Acc); | |||
} | |||
else | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | |||
PulseStartFlag = 0; | |||
} | |||
} | |||
else //不能完成加速 | |||
{ | |||
} | |||
} | |||
OSTimeDly(100, OS_OPT_TIME_DLY, &err); // 延时 100 个节拍 | |||
/* 最后一段脉冲的减速 */ | |||
if (NowPulse == Options.AllPulse - 1) | |||
{ | |||
Acc = - (float)PulseOutput[NowPulse].Frequency / (float)AccDownCount;/* 计算加速度 */ | |||
if (TIM2->CNT > PulseOutput[NowPulse].PulseCount - AccUpCount - AccDownCount) /* 当达到脉冲减速的位置开始减速 */ | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency + TIM2->CNT * Acc); | |||
} | |||
} | |||
OSTimeDly(10, OS_OPT_TIME_DLY, &err); // 延时 10 个节拍 | |||
} | |||
} | |||
@@ -440,6 +445,7 @@ void DirOutput(void *p_arg) | |||
} | |||
} | |||
/* USER CODE END 4 */ | |||
/** | |||
@@ -61,6 +61,7 @@ | |||
/* External variables --------------------------------------------------------*/ | |||
extern TIM_HandleTypeDef htim2; | |||
extern TIM_HandleTypeDef htim10; | |||
extern DMA_HandleTypeDef hdma_usart1_rx; | |||
extern DMA_HandleTypeDef hdma_usart1_tx; | |||
extern UART_HandleTypeDef huart1; | |||
@@ -206,6 +207,20 @@ void SysTick_Handler(void) | |||
/* please refer to the startup file (startup_stm32f4xx.s). */ | |||
/******************************************************************************/ | |||
/** | |||
* @brief This function handles TIM1 update interrupt and TIM10 global interrupt. | |||
*/ | |||
void TIM1_UP_TIM10_IRQHandler(void) | |||
{ | |||
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */ | |||
/* USER CODE END TIM1_UP_TIM10_IRQn 0 */ | |||
HAL_TIM_IRQHandler(&htim10); | |||
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */ | |||
/* USER CODE END TIM1_UP_TIM10_IRQn 1 */ | |||
} | |||
/** | |||
* @brief This function handles TIM2 global interrupt. | |||
*/ | |||
@@ -246,19 +261,17 @@ void TIM2_IRQHandler(void) | |||
{ | |||
Acc = GetAcc(PulseOutput[PrePulse].Frequency, | |||
PulseOutput[NowPulse].Frequency, Options.AccDownTime); /* 计算加速度 */ | |||
} | |||
ArrFlag = 1; | |||
SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | |||
} | |||
ArrFlag = 1; | |||
SetNextPulse();/* 设置下一次进入中断的脉冲数 */ | |||
} | |||
/* 如果之后没有脉冲 */ | |||
else | |||
{ | |||
PulseCount = 0; | |||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||
EndFlag = 1; | |||
ArrFlag = 0; | |||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||
} | |||
} | |||
if(Options.RunMod == 1) | |||
@@ -266,8 +279,7 @@ void TIM2_IRQHandler(void) | |||
if(AllPulseCNT >= MAX_Pulse) | |||
{ | |||
PulseCount = 0; | |||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||
FullFlag = 1; | |||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||
} | |||
else | |||
{ | |||
@@ -296,8 +308,7 @@ void TIM2_IRQHandler(void) | |||
else | |||
{ | |||
PulseCount = 0; | |||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||
EndFlag = 1; | |||
HAL_TIM_PWM_Stop_IT(&htim10,TIM_CHANNEL_1); /* 停止PWM输出 */ | |||
} | |||
} | |||
} | |||
@@ -114,10 +114,7 @@ void MX_TIM10_Init(void) | |||
__HAL_TIM_CLEAR_IT(&htim10, TIM_IT_UPDATE); | |||
TIM10->SR = 0; // 直接清除状态寄存器 | |||
TIM_MasterConfigTypeDef sMasterConfig = {0}; | |||
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; // TRGO信号源为更新事件 | |||
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; // 仅主模式 | |||
HAL_TIMEx_MasterConfigSynchronization(&htim10, &sMasterConfig); | |||
/* USER CODE END TIM10_Init 2 */ | |||
HAL_TIM_MspPostInit(&htim10); | |||
@@ -283,6 +280,10 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) | |||
/* USER CODE END TIM10_MspInit 0 */ | |||
/* TIM10 clock enable */ | |||
__HAL_RCC_TIM10_CLK_ENABLE(); | |||
/* TIM10 interrupt Init */ | |||
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0); | |||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); | |||
/* USER CODE BEGIN TIM10_MspInit 1 */ | |||
/* USER CODE END TIM10_MspInit 1 */ | |||
@@ -440,6 +441,9 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) | |||
/* USER CODE END TIM10_MspDeInit 0 */ | |||
/* Peripheral clock disable */ | |||
__HAL_RCC_TIM10_CLK_DISABLE(); | |||
/* TIM10 interrupt Deinit */ | |||
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn); | |||
/* USER CODE BEGIN TIM10_MspDeInit 1 */ | |||
/* USER CODE END TIM10_MspDeInit 1 */ | |||
@@ -21,6 +21,25 @@ | |||
#include "usart.h" | |||
/* USER CODE BEGIN 0 */ | |||
#ifdef USE_printf | |||
#include <stdio.h> | |||
#ifdef __GNUC__ | |||
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) | |||
#else | |||
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) | |||
#endif | |||
PUTCHAR_PROTOTYPE | |||
{ | |||
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100); | |||
return ch; | |||
} | |||
#endif | |||
uint8_t RX1DataTemp = 0; | |||
uint8_t RX1Data[RX_BUFFER_SIZE] = {0}; | |||
uint8_t RX1Flag = 0; | |||
@@ -226,6 +226,7 @@ | |||
<name>CCDefines</name> | |||
<state>USE_HAL_DRIVER</state> | |||
<state>STM32F407xx</state> | |||
<state>USE_printf</state> | |||
</option> | |||
<option> | |||
<name>CCPreprocFile</name> | |||
@@ -20,7 +20,7 @@ | |||
<LeaveTargetRunning>_ 0</LeaveTargetRunning> | |||
</StLinkDriver> | |||
<DebugChecksum> | |||
<Checksum>3713707742</Checksum> | |||
<Checksum>3456179106</Checksum> | |||
</DebugChecksum> | |||
<Exceptions> | |||
<StopOnUncaught>_ 0</StopOnUncaught> | |||
@@ -58,6 +58,7 @@ | |||
</SWOTraceHWSettings> | |||
<Registers> | |||
<regBase0>TIM2_CNT 10</regBase0> | |||
<regBase1>TIM2_ARR 10</regBase1> | |||
</Registers> | |||
<struct_types> | |||
<Fmt0>Option-AccDownTime 3 0</Fmt0> | |||
@@ -71,9 +72,10 @@ | |||
<Fmt0>uint8_t[10000] 4 0</Fmt0> | |||
</array_types> | |||
<watch_formats> | |||
<Fmt0>{W}1:AllPulseCNT 3 0</Fmt0> | |||
<Fmt1>{W}1:c 4 0</Fmt1> | |||
<Fmt2>{W}1:datCount 3 0</Fmt2> | |||
<Fmt0>{W}1:AccITCount 3 0</Fmt0> | |||
<Fmt1>{W}1:AllPulseCNT 3 0</Fmt1> | |||
<Fmt2>{W}1:c 4 0</Fmt2> | |||
<Fmt3>{W}1:datCount 3 0</Fmt3> | |||
</watch_formats> | |||
<Trace2> | |||
<Enabled>0</Enabled> | |||
@@ -6,6 +6,8 @@ | |||
#include "modbus.h" | |||
#include "bitset.h" | |||
#include <stdio.h> | |||
Pulse PulseOutput[10]; // Ê®¶ÎÂö³åµÄÅäÖà | |||
Option Options; | |||
@@ -29,6 +31,7 @@ int32_t PulseCount = 0; | |||
void SetFrequency(uint8_t SentPost, uint32_t Frequency) | |||
{ | |||
Frequency_Change_PSC_And_ARR(Frequency, &psc, &arr); | |||
printf("Fre=%d,",Frequency); | |||
switch(SentPost) | |||
{ | |||
case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break; | |||
@@ -77,7 +80,6 @@ void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse) | |||
*/ | |||
void PulseStart(void) | |||
{ | |||
SetFrequency(Options.SentPost, PulseOutput[NowPulse].Frequency); | |||
TIM2->ARR = PulseOutput[NowPulse].PulseCount; | |||
switch(Options.SentPost) | |||
@@ -235,7 +237,7 @@ void PLSROptionLoad(void) | |||
Options.AccMod = Register_L[0x1005]; | |||
Options.RunMod = Register_L[0x1006]; | |||
Options.AllPulse = Register_L[0x1007]; | |||
Options.StartPulse = Register_L[0x1008]; | |||
Options.StartPulse = Register_L[0x1008] - 1; | |||
Options.InitSpeed = InitSpeed; | |||
Options.AccUpTime = (Register_H[0x100B]<< 8) | Register_L[0x100B]; | |||
Options.AccDownTime = (Register_H[0x100C]<< 8) | Register_L[0x100C]; | |||
@@ -293,6 +295,14 @@ void CountSave(void) | |||
*/ | |||
void GetAddCount(void) | |||
{ | |||
AccUpCount = Options.AccUpTime * PulseOutput[NowPulse].Frequency / 1000; | |||
AccDownCount = Options.AccDownTime * PulseOutput[NowPulse].Frequency / 1000; | |||
if(NowPulse == Options.StartPulse) | |||
{ | |||
AccUpCount = Options.AccUpTime * PulseOutput[NowPulse].Frequency / 1000; | |||
} | |||
else | |||
{ | |||
AccUpCount = Options.AccUpTime * (PulseOutput[NowPulse].Frequency - PulseOutput[PrePulse].Frequency) / 1000; | |||
AccDownCount = Options.AccDownTime * (PulseOutput[PrePulse].Frequency - PulseOutput[NowPulse].Frequency) / 1000; | |||
} | |||
} |
@@ -50,12 +50,14 @@ Mcu.Pin11=PA10 | |||
Mcu.Pin12=PA13 | |||
Mcu.Pin13=PA14 | |||
Mcu.Pin14=PA15 | |||
Mcu.Pin15=VP_SYS_VS_Systick | |||
Mcu.Pin16=VP_TIM10_VS_ClockSourceINT | |||
Mcu.Pin17=VP_TIM11_VS_ClockSourceINT | |||
Mcu.Pin18=VP_TIM13_VS_ClockSourceINT | |||
Mcu.Pin19=VP_TIM14_VS_ClockSourceINT | |||
Mcu.Pin15=PG12 | |||
Mcu.Pin16=PB5 | |||
Mcu.Pin17=VP_SYS_VS_Systick | |||
Mcu.Pin18=VP_TIM10_VS_ClockSourceINT | |||
Mcu.Pin19=VP_TIM11_VS_ClockSourceINT | |||
Mcu.Pin2=PF8 | |||
Mcu.Pin20=VP_TIM13_VS_ClockSourceINT | |||
Mcu.Pin21=VP_TIM14_VS_ClockSourceINT | |||
Mcu.Pin3=PF9 | |||
Mcu.Pin4=PH0-OSC_IN | |||
Mcu.Pin5=PH1-OSC_OUT | |||
@@ -63,7 +65,7 @@ Mcu.Pin6=PH6 | |||
Mcu.Pin7=PH7 | |||
Mcu.Pin8=PH8 | |||
Mcu.Pin9=PH9 | |||
Mcu.PinsNb=20 | |||
Mcu.PinsNb=22 | |||
Mcu.ThirdPartyNb=0 | |||
Mcu.UserConstants= | |||
Mcu.UserName=STM32F407IGTx | |||
@@ -81,6 +83,7 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | |||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 | |||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | |||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false | |||
NVIC.TIM1_UP_TIM10_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.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false | |||
@@ -96,6 +99,8 @@ PA15.Locked=true | |||
PA15.Signal=S_TIM2_CH1_ETR | |||
PA9.Mode=Asynchronous | |||
PA9.Signal=USART1_TX | |||
PB5.Locked=true | |||
PB5.Signal=GPIO_Input | |||
PF6.Locked=true | |||
PF6.Signal=S_TIM10_CH1 | |||
PF7.Locked=true | |||
@@ -104,6 +109,8 @@ PF8.Locked=true | |||
PF8.Signal=S_TIM13_CH1 | |||
PF9.Locked=true | |||
PF9.Signal=S_TIM14_CH1 | |||
PG12.Locked=true | |||
PG12.Signal=GPIO_Input | |||
PH0-OSC_IN.Mode=HSE-External-Oscillator | |||
PH0-OSC_IN.Signal=RCC_OSC_IN | |||
PH1-OSC_OUT.Mode=HSE-External-Oscillator | |||