wip
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
8276
workspace/.metadata/.ide.log-2026-05-15.log
Normal file
8276
workspace/.metadata/.ide.log-2026-05-15.log
Normal file
File diff suppressed because it is too large
Load Diff
7640
workspace/.metadata/.ide.log-2026-05-18.log
Normal file
7640
workspace/.metadata/.ide.log-2026-05-18.log
Normal file
File diff suppressed because it is too large
Load Diff
54
workspace/.metadata/.ide.log-2026-05-25.log
Normal file
54
workspace/.metadata/.ide.log-2026-05-25.log
Normal file
@@ -0,0 +1,54 @@
|
||||
2026-05-26 04:03:54,775 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:54,787 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:54,897 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:54,897 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:54,996 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:54,996 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,077 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,077 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,270 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,271 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,358 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,358 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,406 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,406 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,446 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,446 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,500 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,500 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,557 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,558 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,650 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,650 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,695 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,696 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,746 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,747 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,795 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,795 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,855 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,855 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,903 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,904 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,944 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,945 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:55,989 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:55,989 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,033 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,033 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,075 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,075 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,145 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,145 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,201 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,201 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,245 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,245 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,291 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,291 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,341 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,342 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,383 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,383 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
2026-05-26 04:03:56,432 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT] [Fatal Error] :1:1: Premature end of file.
|
||||
2026-05-26 04:03:56,433 [ERROR] LogOutputStream:75 - [STDERR_REDIRECT]
|
||||
10942
workspace/.metadata/.log
10942
workspace/.metadata/.log
File diff suppressed because it is too large
Load Diff
@@ -34,3 +34,5 @@
|
||||
*** SESSION mag 14, 2026 17:57:36.107 ------------------------------------------
|
||||
*** SESSION mag 15, 2026 18:08:46.927 ------------------------------------------
|
||||
*** SESSION mag 15, 2026 19:11:28.596 ------------------------------------------
|
||||
*** SESSION mag 18, 2026 22:38:45.547 ------------------------------------------
|
||||
*** SESSION mag 25, 2026 23:06:45.383 ------------------------------------------
|
||||
|
||||
Binary file not shown.
@@ -1,10 +1,20 @@
|
||||
19:11:41 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||
04:30:25 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||
make -j12 all
|
||||
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xB -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I../USB_DEVICE/App -I../USB_DEVICE/Target -I../Middlewares/ST/STM32_USB_Device_Library/Core/Inc -I../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o"
|
||||
arm-none-eabi-gcc -o "AUTOM10.elf" @"objects.list" -mcpu=cortex-m3 -T"C:\progetti\AUTOM\workspace\AUTOM10\STM32F103C8TX_FLASH.ld" --specs=nosys.specs -Wl,-Map="AUTOM10.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
|
||||
Finished building target: AUTOM10.elf
|
||||
|
||||
arm-none-eabi-size AUTOM10.elf
|
||||
arm-none-eabi-objdump -h -S AUTOM10.elf > "AUTOM10.list"
|
||||
arm-none-eabi-objcopy -O ihex AUTOM10.elf "AUTOM10.hex"
|
||||
text data bss dec hex filename
|
||||
60652 476 7360 68488 10b88 AUTOM10.elf
|
||||
62596 476 7368 70440 11328 AUTOM10.elf
|
||||
Finished building: default.size.stdout
|
||||
|
||||
Finished building: AUTOM10.hex
|
||||
|
||||
Finished building: AUTOM10.list
|
||||
|
||||
|
||||
19:11:42 Build Finished. 0 errors, 0 warnings. (took 655ms)
|
||||
04:30:27 Build Finished. 0 errors, 0 warnings. (took 1s.356ms)
|
||||
|
||||
|
||||
@@ -37,4 +37,7 @@
|
||||
<item key="size.width" value="595"/>
|
||||
<item key="size.height" value="180"/>
|
||||
</section>
|
||||
<section name="OptionalMessageDialog.hide.">
|
||||
<item key="askReindex.detail" value="0"/>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
@@ -1,28 +1,17 @@
|
||||
19:03:59 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||
04:30:25 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||
make -j12 all
|
||||
arm-none-eabi-gcc "../Core/Src/eeprom.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xB -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I../USB_DEVICE/App -I../USB_DEVICE/Target -I../Middlewares/ST/STM32_USB_Device_Library/Core/Inc -I../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/eeprom.d" -MT"Core/Src/eeprom.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/eeprom.o"
|
||||
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m3 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F103xB -c -I../Core/Inc -I../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy -I../Drivers/STM32F1xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F1xx/Include -I../Drivers/CMSIS/Include -I../USB_DEVICE/App -I../USB_DEVICE/Target -I../Middlewares/ST/STM32_USB_Device_Library/Core/Inc -I../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o"
|
||||
arm-none-eabi-gcc -o "AUTOM10.elf" @"objects.list" -mcpu=cortex-m3 -T"C:\progetti\AUTOM\workspace\AUTOM10\STM32F103C8TX_FLASH.ld" --specs=nosys.specs -Wl,-Map="AUTOM10.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
|
||||
Finished building target: AUTOM10.elf
|
||||
|
||||
arm-none-eabi-size AUTOM10.elf
|
||||
arm-none-eabi-objdump -h -S AUTOM10.elf > "AUTOM10.list"
|
||||
arm-none-eabi-objcopy -O ihex AUTOM10.elf "AUTOM10.hex"
|
||||
text data bss dec hex filename
|
||||
60652 476 7360 68488 10b88 AUTOM10.elf
|
||||
62596 476 7368 70440 11328 AUTOM10.elf
|
||||
Finished building: default.size.stdout
|
||||
|
||||
Finished building: AUTOM10.hex
|
||||
|
||||
Finished building: AUTOM10.list
|
||||
|
||||
19:04:33 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||
make -j12 all
|
||||
arm-none-eabi-size AUTOM10.elf
|
||||
text data bss dec hex filename
|
||||
60652 476 7360 68488 10b88 AUTOM10.elf
|
||||
Finished building: default.size.stdout
|
||||
|
||||
19:11:41 **** Incremental Build of configuration Debug for project AUTOM10 ****
|
||||
make -j12 all
|
||||
arm-none-eabi-size AUTOM10.elf
|
||||
text data bss dec hex filename
|
||||
60652 476 7360 68488 10b88 AUTOM10.elf
|
||||
Finished building: default.size.stdout
|
||||
|
||||
|
||||
@@ -1,288 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
char s[10];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=rtramp[mot-1]=tr;
|
||||
SetMotPerc(mot,dir,percStart);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
sprintf((char*)s,"\n%d",percStart+delta);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
@@ -1,396 +0,0 @@
|
||||
/*
|
||||
* mot.c
|
||||
*
|
||||
* Created on: May 2, 2026
|
||||
* Author: user
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "main.h"
|
||||
#include "mot.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern uint16_t apM1start;
|
||||
extern uint16_t apM1stop;
|
||||
extern uint16_t apM2start;
|
||||
extern uint16_t apM2stop;
|
||||
extern uint16_t apM3start;
|
||||
extern uint16_t apM3stop;
|
||||
extern uint16_t apM4start;
|
||||
extern uint16_t apM4stop;
|
||||
extern uint16_t chM1start;
|
||||
extern uint16_t chM1stop;
|
||||
extern uint16_t chM2start;
|
||||
extern uint16_t chM2stop;
|
||||
extern uint16_t chM3start;
|
||||
extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
extern volatile uint16_t rtCiclo;
|
||||
extern uint16_t m1pwmap;
|
||||
extern uint16_t m1pwmch;
|
||||
extern uint16_t m2pwmap;
|
||||
extern uint16_t m2pwmch;
|
||||
extern uint16_t m3pwmap;
|
||||
extern uint16_t m3pwmch;
|
||||
extern uint16_t m4pwmap;
|
||||
extern uint16_t m4pwmch;
|
||||
extern uint16_t mrampstart[4];
|
||||
extern uint16_t tramp;
|
||||
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
motMov_st m1ap(void){
|
||||
static motMov_st m1st=motWaiting;
|
||||
static motMov_st memm1st=motStop;
|
||||
char s[100];
|
||||
if(memm1st!=m1st){
|
||||
memm1st=m1st;
|
||||
sprintf(s,"\nm1ap=%d",m1st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM1start)m1st=motWaiting;
|
||||
switch(m1st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
if(rtCiclo>=apM1start){
|
||||
(void)ramp(M1,FW,mrampstart[M1-1],m1pwmap,tramp,RAMPINIT);
|
||||
m1st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M1,FW,mrampstart[M1-1],m1pwmap,tramp,RAMPRUN)==DONE){
|
||||
m1st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM1stop){
|
||||
(void)ramp(M1,FW,m1pwmap,0,tramp,RAMPINIT);
|
||||
m1st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M1,FW,m1pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m1st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
break;
|
||||
}
|
||||
return m1st;
|
||||
}
|
||||
|
||||
motMov_st m2ap(void){
|
||||
static motMov_st m2st;
|
||||
static motMov_st memm2st=motStop;
|
||||
char s[100];
|
||||
if(memm2st!=m2st){
|
||||
memm2st=m2st;
|
||||
sprintf(s,"\nm2ap=%d",m2st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM2start)m2st=motWaiting;
|
||||
switch(m2st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
if(rtCiclo>=apM2start){
|
||||
(void)ramp(M2,BW,mrampstart[M2-1],m2pwmap,tramp,RAMPINIT);
|
||||
m2st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M2,BW,mrampstart[M2-1],m2pwmap,tramp,RAMPRUN)==DONE){
|
||||
m2st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM2stop){
|
||||
(void)ramp(M2,BW,m2pwmap,0,tramp,RAMPINIT);
|
||||
m2st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M2,BW,m2pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m2st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
break;
|
||||
}
|
||||
return m2st;
|
||||
}
|
||||
|
||||
motMov_st m3ap(void){
|
||||
static motMov_st m3st;
|
||||
static motMov_st memm3st=motStop;
|
||||
char s[100];
|
||||
if(memm3st!=m3st){
|
||||
memm3st=m3st;
|
||||
sprintf(s,"\nm3ap=%d",m3st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM3start)m3st=motWaiting;
|
||||
switch(m3st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
if(rtCiclo>=apM3start){
|
||||
(void)ramp(M3,FW,mrampstart[M3-1],m2pwmap,tramp,RAMPINIT);
|
||||
m3st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M3,FW,mrampstart[M3-1],m3pwmap,tramp,RAMPRUN)==DONE){
|
||||
m3st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM3stop){
|
||||
(void)ramp(M3,FW,m3pwmap,0,tramp,RAMPINIT);
|
||||
m3st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M3,FW,m3pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m3st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
break;
|
||||
}
|
||||
return m3st;
|
||||
}
|
||||
|
||||
motMov_st m4ap(void){
|
||||
static motMov_st m4st;
|
||||
static motMov_st memm4st=motStop;
|
||||
char s[100];
|
||||
if(memm4st!=m4st){
|
||||
memm4st=m4st;
|
||||
sprintf(s,"\nm4ap=%d",m4st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM4start)m4st=motWaiting;
|
||||
switch(m4st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
if(rtCiclo>=apM4start){
|
||||
(void)ramp(M4,BW,mrampstart[M4-1],m2pwmap,tramp,RAMPINIT);
|
||||
m4st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M4,BW,mrampstart[M4-1],m4pwmap,tramp,RAMPRUN)==DONE){
|
||||
m4st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM4stop){
|
||||
(void)ramp(M4,BW,m4pwmap,0,tramp,RAMPINIT);
|
||||
m4st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M4,BW,m4pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m4st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
break;
|
||||
}
|
||||
return m4st;
|
||||
}
|
||||
|
||||
motMov_st m1ch(void){
|
||||
static motMov_st m1st;
|
||||
static motMov_st memm1st=motStop;
|
||||
char s[100];
|
||||
if(memm1st!=m1st){
|
||||
memm1st=m1st;
|
||||
sprintf(s,"\nm1ch=%d",m1st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<chM1start)m1st=motWaiting;
|
||||
switch(m1st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
if(rtCiclo>=chM1start){
|
||||
(void)ramp(M1,BW,mrampstart[M1-1],m1pwmch,tramp,RAMPINIT);
|
||||
m1st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M1,BW,mrampstart[M1-1],m1pwmch,tramp,RAMPRUN)==DONE){
|
||||
m1st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM1stop){
|
||||
(void)ramp(M1,BW,m1pwmch,0,tramp,RAMPINIT);
|
||||
m1st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M1,BW,m1pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m1st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
break;
|
||||
}
|
||||
return m1st;
|
||||
}
|
||||
|
||||
motMov_st m2ch(void){
|
||||
static motMov_st m2st;
|
||||
static motMov_st memm2st=motStop;
|
||||
char s[100];
|
||||
if(memm2st!=m2st){
|
||||
memm2st=m2st;
|
||||
sprintf(s,"\nm2ch=%d",m2st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM2start)m2st=motWaiting;
|
||||
switch(m2st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
if(rtCiclo>=chM2start){
|
||||
(void)ramp(M2,FW,mrampstart[M2-1],m2pwmch,tramp,RAMPINIT);
|
||||
m2st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M2,FW,mrampstart[M2-1],m2pwmch,tramp,RAMPRUN)==DONE){
|
||||
m2st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM2stop){
|
||||
(void)ramp(M2,FW,m2pwmch,0,tramp,RAMPINIT);
|
||||
m2st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M2,FW,m2pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m2st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
break;
|
||||
}
|
||||
return m2st;
|
||||
}
|
||||
|
||||
motMov_st m3ch(void){
|
||||
static motMov_st m3st;
|
||||
static motMov_st memm3st=motStop;
|
||||
char s[100];
|
||||
if(memm3st!=m3st){
|
||||
memm3st=m3st;
|
||||
sprintf(s,"\nm3ch=%d",m3st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM3start)m3st=motWaiting;
|
||||
switch(m3st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
if(rtCiclo>=chM3start){
|
||||
(void)ramp(M3,BW,mrampstart[M3-1],m2pwmch,tramp,RAMPINIT);
|
||||
m3st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M3,BW,mrampstart[M3-1],m3pwmch,tramp,RAMPRUN)==DONE){
|
||||
m3st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM3stop){
|
||||
(void)ramp(M3,BW,m3pwmch,0,tramp,RAMPINIT);
|
||||
m3st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M3,BW,m3pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m3st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
break;
|
||||
}
|
||||
return m3st;
|
||||
}
|
||||
|
||||
motMov_st m4ch(void){
|
||||
static motMov_st m4st;
|
||||
static motMov_st memm4st=motStop;
|
||||
char s[100];
|
||||
if(memm4st!=m4st){
|
||||
memm4st=m4st;
|
||||
sprintf(s,"\nm4ch=%d",m4st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM4start)m4st=motWaiting;
|
||||
switch(m4st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
if(rtCiclo>=chM4start){
|
||||
(void)ramp(M4,FW,mrampstart[M4-1],m4pwmch,tramp,RAMPINIT);
|
||||
m4st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M4,FW,mrampstart[M4-1],m4pwmch,tramp,RAMPRUN)==DONE){
|
||||
m4st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM4stop){
|
||||
(void)ramp(M4,FW,m4pwmch,0,tramp,RAMPINIT);
|
||||
m4st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M4,FW,m4pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m4st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
break;
|
||||
}
|
||||
return m4st;
|
||||
}
|
||||
@@ -1,396 +0,0 @@
|
||||
/*
|
||||
* mot.c
|
||||
*
|
||||
* Created on: May 2, 2026
|
||||
* Author: user
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "main.h"
|
||||
#include "mot.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern uint16_t apM1start;
|
||||
extern uint16_t apM1stop;
|
||||
extern uint16_t apM2start;
|
||||
extern uint16_t apM2stop;
|
||||
extern uint16_t apM3start;
|
||||
extern uint16_t apM3stop;
|
||||
extern uint16_t apM4start;
|
||||
extern uint16_t apM4stop;
|
||||
extern uint16_t chM1start;
|
||||
extern uint16_t chM1stop;
|
||||
extern uint16_t chM2start;
|
||||
extern uint16_t chM2stop;
|
||||
extern uint16_t chM3start;
|
||||
extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
extern volatile uint16_t rtCiclo;
|
||||
extern uint16_t m1pwmap;
|
||||
extern uint16_t m1pwmch;
|
||||
extern uint16_t m2pwmap;
|
||||
extern uint16_t m2pwmch;
|
||||
extern uint16_t m3pwmap;
|
||||
extern uint16_t m3pwmch;
|
||||
extern uint16_t m4pwmap;
|
||||
extern uint16_t m4pwmch;
|
||||
extern uint16_t mrampstart[4];
|
||||
extern uint16_t tramp;
|
||||
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
motMov_st m1ap(void){
|
||||
static motMov_st m1st=motWaiting;
|
||||
static motMov_st memm1st=motStop;
|
||||
char s[100];
|
||||
if(memm1st!=m1st){
|
||||
memm1st=m1st;
|
||||
sprintf(s,"\nm1ap=%d",m1st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM1start)m1st=motWaiting;
|
||||
switch(m1st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
if(rtCiclo>=apM1start){
|
||||
(void)ramp(M1,BW,mrampstart[M1-1],m1pwmap,tramp,RAMPINIT);
|
||||
m1st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M1,BW,mrampstart[M1-1],m1pwmap,tramp,RAMPRUN)==DONE){
|
||||
m1st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM1stop){
|
||||
(void)ramp(M1,BW,m1pwmap,0,tramp,RAMPINIT);
|
||||
m1st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M1,BW,m1pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m1st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
break;
|
||||
}
|
||||
return m1st;
|
||||
}
|
||||
|
||||
motMov_st m2ap(void){
|
||||
static motMov_st m2st;
|
||||
static motMov_st memm2st=motStop;
|
||||
char s[100];
|
||||
if(memm2st!=m2st){
|
||||
memm2st=m2st;
|
||||
sprintf(s,"\nm2ap=%d",m2st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM2start)m2st=motWaiting;
|
||||
switch(m2st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
if(rtCiclo>=apM2start){
|
||||
(void)ramp(M2,BW,mrampstart[M2-1],m2pwmap,tramp,RAMPINIT);
|
||||
m2st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M2,BW,mrampstart[M2-1],m2pwmap,tramp,RAMPRUN)==DONE){
|
||||
m2st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM2stop){
|
||||
(void)ramp(M2,BW,m2pwmap,0,tramp,RAMPINIT);
|
||||
m2st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M2,BW,m2pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m2st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
break;
|
||||
}
|
||||
return m2st;
|
||||
}
|
||||
|
||||
motMov_st m3ap(void){
|
||||
static motMov_st m3st;
|
||||
static motMov_st memm3st=motStop;
|
||||
char s[100];
|
||||
if(memm3st!=m3st){
|
||||
memm3st=m3st;
|
||||
sprintf(s,"\nm3ap=%d",m3st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM3start)m3st=motWaiting;
|
||||
switch(m3st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
if(rtCiclo>=apM3start){
|
||||
(void)ramp(M3,BW,mrampstart[M3-1],m2pwmap,tramp,RAMPINIT);
|
||||
m3st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M3,BW,mrampstart[M3-1],m3pwmap,tramp,RAMPRUN)==DONE){
|
||||
m3st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM3stop){
|
||||
(void)ramp(M3,BW,m3pwmap,0,tramp,RAMPINIT);
|
||||
m3st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M3,BW,m3pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m3st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
break;
|
||||
}
|
||||
return m3st;
|
||||
}
|
||||
|
||||
motMov_st m4ap(void){
|
||||
static motMov_st m4st;
|
||||
static motMov_st memm4st=motStop;
|
||||
char s[100];
|
||||
if(memm4st!=m4st){
|
||||
memm4st=m4st;
|
||||
sprintf(s,"\nm4ap=%d",m4st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM4start)m4st=motWaiting;
|
||||
switch(m4st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
if(rtCiclo>=apM4start){
|
||||
(void)ramp(M4,BW,mrampstart[M4-1],m2pwmap,tramp,RAMPINIT);
|
||||
m4st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M4,BW,mrampstart[M4-1],m4pwmap,tramp,RAMPRUN)==DONE){
|
||||
m4st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM4stop){
|
||||
(void)ramp(M4,BW,m4pwmap,0,tramp,RAMPINIT);
|
||||
m4st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M4,BW,m4pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m4st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
break;
|
||||
}
|
||||
return m4st;
|
||||
}
|
||||
|
||||
motMov_st m1ch(void){
|
||||
static motMov_st m1st;
|
||||
static motMov_st memm1st=motStop;
|
||||
char s[100];
|
||||
if(memm1st!=m1st){
|
||||
memm1st=m1st;
|
||||
sprintf(s,"\nm1ch=%d",m1st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<chM1start)m1st=motWaiting;
|
||||
switch(m1st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
if(rtCiclo>=chM1start){
|
||||
(void)ramp(M1,FW,mrampstart[M1-1],m1pwmch,tramp,RAMPINIT);
|
||||
m1st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M1,FW,mrampstart[M1-1],m1pwmch,tramp,RAMPRUN)==DONE){
|
||||
m1st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM1stop){
|
||||
(void)ramp(M1,FW,m1pwmch,0,tramp,RAMPINIT);
|
||||
m1st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M1,FW,m1pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m1st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
break;
|
||||
}
|
||||
return m1st;
|
||||
}
|
||||
|
||||
motMov_st m2ch(void){
|
||||
static motMov_st m2st;
|
||||
static motMov_st memm2st=motStop;
|
||||
char s[100];
|
||||
if(memm2st!=m2st){
|
||||
memm2st=m2st;
|
||||
sprintf(s,"\nm2ch=%d",m2st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM2start)m2st=motWaiting;
|
||||
switch(m2st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
if(rtCiclo>=chM2start){
|
||||
(void)ramp(M2,FW,mrampstart[M2-1],m2pwmch,tramp,RAMPINIT);
|
||||
m2st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M2,FW,mrampstart[M2-1],m2pwmch,tramp,RAMPRUN)==DONE){
|
||||
m2st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM2stop){
|
||||
(void)ramp(M2,FW,m2pwmch,0,tramp,RAMPINIT);
|
||||
m2st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M2,FW,m2pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m2st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
break;
|
||||
}
|
||||
return m2st;
|
||||
}
|
||||
|
||||
motMov_st m3ch(void){
|
||||
static motMov_st m3st;
|
||||
static motMov_st memm3st=motStop;
|
||||
char s[100];
|
||||
if(memm3st!=m3st){
|
||||
memm3st=m3st;
|
||||
sprintf(s,"\nm3ch=%d",m3st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM3start)m3st=motWaiting;
|
||||
switch(m3st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
if(rtCiclo>=chM3start){
|
||||
(void)ramp(M3,FW,mrampstart[M3-1],m2pwmch,tramp,RAMPINIT);
|
||||
m3st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M3,FW,mrampstart[M3-1],m3pwmch,tramp,RAMPRUN)==DONE){
|
||||
m3st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM3stop){
|
||||
(void)ramp(M3,FW,m3pwmch,0,tramp,RAMPINIT);
|
||||
m3st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M3,FW,m3pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m3st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
break;
|
||||
}
|
||||
return m3st;
|
||||
}
|
||||
|
||||
motMov_st m4ch(void){
|
||||
static motMov_st m4st;
|
||||
static motMov_st memm4st=motStop;
|
||||
char s[100];
|
||||
if(memm4st!=m4st){
|
||||
memm4st=m4st;
|
||||
sprintf(s,"\nm4ch=%d",m4st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM4start)m4st=motWaiting;
|
||||
switch(m4st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
if(rtCiclo>=chM4start){
|
||||
(void)ramp(M4,FW,mrampstart[M4-1],m2pwmch,tramp,RAMPINIT);
|
||||
m4st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M4,FW,mrampstart[M4-1],m4pwmch,tramp,RAMPRUN)==DONE){
|
||||
m4st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM4stop){
|
||||
(void)ramp(M4,FW,m4pwmch,0,tramp,RAMPINIT);
|
||||
m4st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M4,FW,m4pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m4st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
break;
|
||||
}
|
||||
return m4st;
|
||||
}
|
||||
@@ -1,396 +0,0 @@
|
||||
/*
|
||||
* mot.c
|
||||
*
|
||||
* Created on: May 2, 2026
|
||||
* Author: user
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "main.h"
|
||||
#include "mot.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern uint16_t apM1start;
|
||||
extern uint16_t apM1stop;
|
||||
extern uint16_t apM2start;
|
||||
extern uint16_t apM2stop;
|
||||
extern uint16_t apM3start;
|
||||
extern uint16_t apM3stop;
|
||||
extern uint16_t apM4start;
|
||||
extern uint16_t apM4stop;
|
||||
extern uint16_t chM1start;
|
||||
extern uint16_t chM1stop;
|
||||
extern uint16_t chM2start;
|
||||
extern uint16_t chM2stop;
|
||||
extern uint16_t chM3start;
|
||||
extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
extern volatile uint16_t rtCiclo;
|
||||
extern uint16_t m1pwmap;
|
||||
extern uint16_t m1pwmch;
|
||||
extern uint16_t m2pwmap;
|
||||
extern uint16_t m2pwmch;
|
||||
extern uint16_t m3pwmap;
|
||||
extern uint16_t m3pwmch;
|
||||
extern uint16_t m4pwmap;
|
||||
extern uint16_t m4pwmch;
|
||||
extern uint16_t mrampstart[4];
|
||||
extern uint16_t tramp;
|
||||
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
motMov_st m1ap(void){
|
||||
static motMov_st m1st=motWaiting;
|
||||
static motMov_st memm1st=motStop;
|
||||
char s[100];
|
||||
if(memm1st!=m1st){
|
||||
memm1st=m1st;
|
||||
sprintf(s,"\nm1ap=%d",m1st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM1start)m1st=motWaiting;
|
||||
switch(m1st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
if(rtCiclo>=apM1start){
|
||||
(void)ramp(M1,BW,mrampstart[M1-1],m1pwmap,tramp,RAMPINIT);
|
||||
m1st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M1,BW,mrampstart[M1-1],m1pwmap,tramp,RAMPRUN)==DONE){
|
||||
m1st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM1stop){
|
||||
(void)ramp(M1,BW,m1pwmap,0,tramp,RAMPINIT);
|
||||
m1st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M1,BW,m1pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m1st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
break;
|
||||
}
|
||||
return m1st;
|
||||
}
|
||||
|
||||
motMov_st m2ap(void){
|
||||
static motMov_st m2st;
|
||||
static motMov_st memm2st=motStop;
|
||||
char s[100];
|
||||
if(memm2st!=m2st){
|
||||
memm2st=m2st;
|
||||
sprintf(s,"\nm2ap=%d",m2st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM2start)m2st=motWaiting;
|
||||
switch(m2st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
if(rtCiclo>=apM2start){
|
||||
(void)ramp(M2,BW,mrampstart[M2-1],m2pwmap,tramp,RAMPINIT);
|
||||
m2st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M2,BW,mrampstart[M2-1],m2pwmap,tramp,RAMPRUN)==DONE){
|
||||
m2st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM2stop){
|
||||
(void)ramp(M2,BW,m2pwmap,0,tramp,RAMPINIT);
|
||||
m2st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M2,BW,m2pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m2st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
break;
|
||||
}
|
||||
return m2st;
|
||||
}
|
||||
|
||||
motMov_st m3ap(void){
|
||||
static motMov_st m3st;
|
||||
static motMov_st memm3st=motStop;
|
||||
char s[100];
|
||||
if(memm3st!=m3st){
|
||||
memm3st=m3st;
|
||||
sprintf(s,"\nm3ap=%d",m3st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM3start)m3st=motWaiting;
|
||||
switch(m3st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
if(rtCiclo>=apM3start){
|
||||
(void)ramp(M3,BW,mrampstart[M3-1],m2pwmap,tramp,RAMPINIT);
|
||||
m3st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M3,BW,mrampstart[M3-1],m3pwmap,tramp,RAMPRUN)==DONE){
|
||||
m3st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM3stop){
|
||||
(void)ramp(M3,BW,m3pwmap,0,tramp,RAMPINIT);
|
||||
m3st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M3,BW,m3pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m3st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
break;
|
||||
}
|
||||
return m3st;
|
||||
}
|
||||
|
||||
motMov_st m4ap(void){
|
||||
static motMov_st m4st;
|
||||
static motMov_st memm4st=motStop;
|
||||
char s[100];
|
||||
if(memm4st!=m4st){
|
||||
memm4st=m4st;
|
||||
sprintf(s,"\nm4ap=%d",m4st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<apM4start)m4st=motWaiting;
|
||||
switch(m4st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
if(rtCiclo>=apM4start){
|
||||
(void)ramp(M4,BW,mrampstart[M4-1],m2pwmap,tramp,RAMPINIT);
|
||||
m4st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M4,BW,mrampstart[M4-1],m4pwmap,tramp,RAMPRUN)==DONE){
|
||||
m4st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=apM4stop){
|
||||
(void)ramp(M4,BW,m4pwmap,0,tramp,RAMPINIT);
|
||||
m4st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M4,BW,m4pwmap,0,tramp,RAMPRUN)==DONE){
|
||||
m4st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
break;
|
||||
}
|
||||
return m4st;
|
||||
}
|
||||
|
||||
motMov_st m1ch(void){
|
||||
static motMov_st m1st;
|
||||
static motMov_st memm1st=motStop;
|
||||
char s[100];
|
||||
if(memm1st!=m1st){
|
||||
memm1st=m1st;
|
||||
sprintf(s,"\nm1ch=%d",m1st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
if(rtCiclo<chM1start)m1st=motWaiting;
|
||||
switch(m1st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
if(rtCiclo>=chM1start){
|
||||
(void)ramp(M1,FW,mrampstart[M1-1],m1pwmch,tramp,RAMPINIT);
|
||||
m1st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M1,FW,mrampstart[M1-1],m1pwmch,tramp,RAMPRUN)==DONE){
|
||||
m1st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM1stop){
|
||||
(void)ramp(M1,FW,m1pwmch,0,tramp,RAMPINIT);
|
||||
m1st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M1,FW,m1pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m1st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M1,FW,0);
|
||||
SetMotPerc(M1,BW,0);
|
||||
break;
|
||||
}
|
||||
return m1st;
|
||||
}
|
||||
|
||||
motMov_st m2ch(void){
|
||||
static motMov_st m2st;
|
||||
static motMov_st memm2st=motStop;
|
||||
char s[100];
|
||||
if(memm2st!=m2st){
|
||||
memm2st=m2st;
|
||||
sprintf(s,"\nm2ch=%d",m2st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM2start)m2st=motWaiting;
|
||||
switch(m2st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
if(rtCiclo>=chM2start){
|
||||
(void)ramp(M2,FW,mrampstart[M2-1],m2pwmch,tramp,RAMPINIT);
|
||||
m2st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M2,FW,mrampstart[M2-1],m2pwmch,tramp,RAMPRUN)==DONE){
|
||||
m2st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM2stop){
|
||||
(void)ramp(M2,FW,m2pwmch,0,tramp,RAMPINIT);
|
||||
m2st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M2,FW,m2pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m2st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M2,FW,0);
|
||||
SetMotPerc(M2,BW,0);
|
||||
break;
|
||||
}
|
||||
return m2st;
|
||||
}
|
||||
|
||||
motMov_st m3ch(void){
|
||||
static motMov_st m3st;
|
||||
static motMov_st memm3st=motStop;
|
||||
char s[100];
|
||||
if(memm3st!=m3st){
|
||||
memm3st=m3st;
|
||||
sprintf(s,"\nm3ch=%d",m3st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM3start)m3st=motWaiting;
|
||||
switch(m3st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
if(rtCiclo>=chM3start){
|
||||
(void)ramp(M3,FW,mrampstart[M3-1],m2pwmch,tramp,RAMPINIT);
|
||||
m3st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M3,FW,mrampstart[M3-1],m3pwmch,tramp,RAMPRUN)==DONE){
|
||||
m3st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM3stop){
|
||||
(void)ramp(M3,FW,m3pwmch,0,tramp,RAMPINIT);
|
||||
m3st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M3,FW,m3pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m3st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M3,FW,0);
|
||||
SetMotPerc(M3,BW,0);
|
||||
break;
|
||||
}
|
||||
return m3st;
|
||||
}
|
||||
|
||||
motMov_st m4ch(void){
|
||||
static motMov_st m4st;
|
||||
static motMov_st memm4st=motStop;
|
||||
char s[100];
|
||||
if(memm4st!=m4st){
|
||||
memm4st=m4st;
|
||||
sprintf(s,"\nm4ch=%d",m4st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
}
|
||||
|
||||
if(rtCiclo<chM4start)m4st=motWaiting;
|
||||
switch(m4st){
|
||||
case motWaiting:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
if(rtCiclo>=chM4start){
|
||||
(void)ramp(M4,FW,mrampstart[M4-1],m4pwmch,tramp,RAMPINIT);
|
||||
m4st=motStartRamp;
|
||||
}
|
||||
break;
|
||||
case motStartRamp:
|
||||
if(ramp(M4,FW,mrampstart[M4-1],m4pwmch,tramp,RAMPRUN)==DONE){
|
||||
m4st=motWaitingTime;
|
||||
}
|
||||
break;
|
||||
case motWaitingTime:
|
||||
if(rtCiclo>=chM4stop){
|
||||
(void)ramp(M4,FW,m4pwmch,0,tramp,RAMPINIT);
|
||||
m4st=motStopRamp;
|
||||
}
|
||||
break;
|
||||
case motStopRamp:
|
||||
if(ramp(M4,FW,m4pwmch,0,tramp,RAMPRUN)==DONE){
|
||||
m4st=motStop;
|
||||
}
|
||||
break;
|
||||
case motStop:
|
||||
default:
|
||||
SetMotPerc(M4,FW,0);
|
||||
SetMotPerc(M4,BW,0);
|
||||
break;
|
||||
}
|
||||
return m4st;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,286 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
char s[10];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=rtramp[mot-1]=tr;
|
||||
SetMotPerc(mot,dir,percStart);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
sprintf((char*)s,"\n%d");
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,491 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "eeprom.h"
|
||||
extern UART_HandleTypeDef huart1;
|
||||
/*
|
||||
* Record format (4 bytes):
|
||||
* [0] VirtAddress (uint16_t)
|
||||
* [2] Data (uint16_t)
|
||||
*
|
||||
* Page layout:
|
||||
* [0] PageStatus (uint16_t)
|
||||
* [2..] Records...
|
||||
*/
|
||||
|
||||
extern uint16_t m1pwmap;
|
||||
extern uint16_t m1pwmch;
|
||||
extern uint16_t m2pwmap;
|
||||
extern uint16_t m2pwmch;
|
||||
extern uint16_t m3pwmap;
|
||||
extern uint16_t m3pwmch;
|
||||
extern uint16_t m4pwmap;
|
||||
extern uint16_t m4pwmch;
|
||||
extern uint16_t m1TimeoutMan;
|
||||
extern uint16_t m2TimeoutMan;
|
||||
extern uint16_t m3TimeoutMan;
|
||||
extern uint16_t m4TimeoutMan;
|
||||
extern uint16_t twap;
|
||||
extern uint16_t tramp;
|
||||
extern uint16_t t1ch;
|
||||
extern uint16_t t2ch;
|
||||
extern uint16_t t3ch;
|
||||
extern uint16_t t4ch;
|
||||
extern uint16_t twch;
|
||||
extern uint16_t tramp1;
|
||||
extern uint16_t trampman;
|
||||
extern uint16_t m1pwmMan;
|
||||
extern uint16_t m2pwmMan;
|
||||
extern uint16_t m3pwmMan;
|
||||
extern uint16_t m4pwmMan;
|
||||
|
||||
|
||||
extern uint16_t apM1start;
|
||||
extern uint16_t apM1stop;
|
||||
extern uint16_t apM2start;
|
||||
extern uint16_t apM2stop;
|
||||
extern uint16_t apM3start;
|
||||
extern uint16_t apM3stop;
|
||||
extern uint16_t apM4start;
|
||||
extern uint16_t apM4stop;
|
||||
extern uint16_t chM1start;
|
||||
extern uint16_t chM1stop;
|
||||
extern uint16_t chM2start;
|
||||
extern uint16_t chM2stop;
|
||||
extern uint16_t chM3start;
|
||||
extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
|
||||
const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
40, //m1pwmap
|
||||
60, //m1pwmch
|
||||
70, //m2pwmap
|
||||
70, //m2pwmch
|
||||
35, //m3pwmap
|
||||
40, //m3pwmch
|
||||
40, //m4pwmap
|
||||
40, //m4pwmch
|
||||
20, //m1rampstart
|
||||
20, //m2rampstart
|
||||
20, //m3rampstart
|
||||
20, //m4rampstart
|
||||
230,//m1timeoutman
|
||||
100,//m2timeoutman
|
||||
130,//m3timeoutman
|
||||
300,//m4timeoutman
|
||||
1, //twap
|
||||
27, //t1ch
|
||||
10, //t2ch
|
||||
30, //t3ch
|
||||
1, //t4ch
|
||||
1, //twch
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100, //tramp1
|
||||
60, //m1pwmMan
|
||||
70, //m2pwmMan
|
||||
40, //m3pwmMan
|
||||
40, //m4pwmMan
|
||||
50, //trampman
|
||||
10, //tramp
|
||||
310, //apM1start;
|
||||
450, //apM1stop;
|
||||
30, //apM2start;
|
||||
310, //apM2stop;
|
||||
350, //apM3start;
|
||||
450, //apM3stop;
|
||||
450, //apM4start;
|
||||
850, //apM4stop;
|
||||
10, //chM1start;
|
||||
280, //chM1stop;
|
||||
280, //chM2start;
|
||||
580, //chM2stop;
|
||||
20, //chM3start;
|
||||
280, //chM3stop;
|
||||
280, //chM4start;
|
||||
680, //chM4stop;
|
||||
1,
|
||||
27,
|
||||
10,
|
||||
30,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
60,
|
||||
70,
|
||||
40,
|
||||
40,
|
||||
50,
|
||||
10,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t VirtAddress;
|
||||
uint16_t Data;
|
||||
} EE_Record_t;
|
||||
|
||||
/* Active page base address (runtime selected in EE_Init) */
|
||||
static uint32_t EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
|
||||
/* 32 sequential virtual addresses */
|
||||
const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR] =
|
||||
{
|
||||
0x0001, 0x0002, 0x0003, 0x0004,
|
||||
0x0005, 0x0006, 0x0007, 0x0008,
|
||||
0x0009, 0x000A, 0x000B, 0x000C,
|
||||
0x000D, 0x000E, 0x000F, 0x0010,
|
||||
0x0011, 0x0012, 0x0013, 0x0014,
|
||||
0x0015, 0x0016, 0x0017, 0x0018,
|
||||
0x0019, 0x001A, 0x001B, 0x001C,
|
||||
0x001D, 0x001E, 0x001F, 0x0020,
|
||||
|
||||
0x0021, 0x0022, 0x0023, 0x0024,
|
||||
0x0025, 0x0026, 0x0027, 0x0028,
|
||||
0x0029, 0x002A, 0x002B, 0x002C,
|
||||
0x002D, 0x002E, 0x002F, 0x0030,
|
||||
0x0031, 0x0032, 0x0033, 0x0034,
|
||||
0x0035, 0x0036, 0x0037, 0x0038,
|
||||
0x0039, 0x003A, 0x003B, 0x003C,
|
||||
0x003D, 0x003E, 0x003F, 0x0040
|
||||
};
|
||||
/* ========================================================================= */
|
||||
|
||||
/* --- Internal helpers ---------------------------------------------------- */
|
||||
|
||||
static uint16_t EE_GetPageStatus(uint32_t pageBase)
|
||||
{
|
||||
return *(__IO uint16_t *)pageBase;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef EE_FlashProgramHalfWord(uint32_t Address, uint16_t Data)
|
||||
{
|
||||
HAL_StatusTypeDef status;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data);
|
||||
HAL_FLASH_Lock();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef EE_FlashErasePage(uint32_t PageAddress)
|
||||
{
|
||||
HAL_StatusTypeDef status;
|
||||
FLASH_EraseInitTypeDef EraseInit;
|
||||
uint32_t PageError = 0;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
|
||||
EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
EraseInit.PageAddress = PageAddress;
|
||||
EraseInit.NbPages = 1;
|
||||
|
||||
status = HAL_FLASHEx_Erase(&EraseInit, &PageError);
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Find first free record address in given page (returns 0 if full) */
|
||||
static uint32_t EE_FindFreeAddress(uint32_t pageBase)
|
||||
{
|
||||
uint32_t addr = pageBase + 2U; /* Skip status word */
|
||||
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||
|
||||
while (addr < (pageEnd - sizeof(EE_Record_t) + 1U))
|
||||
{
|
||||
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||
|
||||
if (vaddr == 0xFFFFU)
|
||||
{
|
||||
/* Empty slot */
|
||||
return addr;
|
||||
}
|
||||
addr += sizeof(EE_Record_t);
|
||||
}
|
||||
|
||||
return 0U; /* No space */
|
||||
}
|
||||
|
||||
/* Find latest value of VirtAddress in a specific page (internal, uses EE_Status) */
|
||||
/* Find latest value of VirtAddress in a specific page (scan forward) */
|
||||
static EE_Status EE_FindInPage(uint32_t pageBase, uint16_t VirtAddress, uint16_t *Data)
|
||||
{
|
||||
uint32_t addr = pageBase + 2U; // skip status halfword
|
||||
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||
EE_Status result = EE_NOT_FOUND;
|
||||
uint16_t lastVal = 0;
|
||||
|
||||
if (Data == NULL)
|
||||
return EE_ERROR;
|
||||
|
||||
while (addr <= (pageEnd - sizeof(EE_Record_t)))
|
||||
{
|
||||
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||
|
||||
if (vaddr == 0xFFFFU)
|
||||
{
|
||||
// First empty slot => no more records in this page
|
||||
break;
|
||||
}
|
||||
|
||||
uint16_t value = *(__IO uint16_t *)(addr + 2U);
|
||||
|
||||
if (vaddr == VirtAddress)
|
||||
{
|
||||
lastVal = value; // keep most recent
|
||||
result = EE_OK;
|
||||
}
|
||||
|
||||
addr += sizeof(EE_Record_t); // move 4 bytes forward
|
||||
}
|
||||
|
||||
if (result == EE_OK)
|
||||
*Data = lastVal;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Format both pages: erase and set PAGE0 as VALID */
|
||||
static EE_Status EE_Format(void)
|
||||
{
|
||||
if (EE_FlashErasePage(EE_PAGE0_BASE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
if (EE_FlashErasePage(EE_PAGE1_BASE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
if (EE_FlashProgramHalfWord(EE_PAGE0_BASE, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* PAGE1 will remain erased (status = 0xFFFF) */
|
||||
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
|
||||
return EE_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Get the base of the other page */
|
||||
static uint32_t EE_GetOtherPageBase(uint32_t pageBase)
|
||||
{
|
||||
return (pageBase == EE_PAGE0_BASE) ? EE_PAGE1_BASE : EE_PAGE0_BASE;
|
||||
}
|
||||
|
||||
/* Page transfer (garbage collection + new write) */
|
||||
static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
|
||||
{
|
||||
uint32_t oldBase = EE_ActivePageBase;
|
||||
uint32_t newBase = EE_GetOtherPageBase(oldBase);
|
||||
uint32_t addr;
|
||||
uint16_t value;
|
||||
EE_Status st;
|
||||
|
||||
/* Erase new page */
|
||||
if (EE_FlashErasePage(newBase) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Mark new page as RECEIVE */
|
||||
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_RECEIVE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Start writing records just after status */
|
||||
addr = newBase + 2U;
|
||||
|
||||
/* For each known virtual variable */
|
||||
for (uint16_t i = 0; i < EE_NUM_VIRTUAL_ADDR; i++)
|
||||
{
|
||||
uint16_t vaddr = EE_VirtAddrs[i];
|
||||
|
||||
if (vaddr == VirtAddress)
|
||||
{
|
||||
/* Use the new data passed into PageTransfer */
|
||||
value = Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Read latest value from old active page */
|
||||
st = EE_FindInPage(oldBase, vaddr, &value);
|
||||
if (st != EE_STATUS_OK)
|
||||
{
|
||||
/* Variable never written -> skip */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write record to new page */
|
||||
if (EE_FlashProgramHalfWord(addr, vaddr) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
if (EE_FlashProgramHalfWord(addr + 2U, value) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
addr += sizeof(EE_Record_t);
|
||||
if (addr >= (newBase + EE_PAGE_SIZE))
|
||||
return EE_STATUS_NO_SPACE;
|
||||
}
|
||||
|
||||
/* Erase old page */
|
||||
if (EE_FlashErasePage(oldBase) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Mark new page as VALID */
|
||||
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Update active page */
|
||||
EE_ActivePageBase = newBase;
|
||||
|
||||
return EE_STATUS_OK;
|
||||
}
|
||||
|
||||
/* --- Public API ----------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Initialize the EEPROM emulation.
|
||||
* - Checks page statuses and chooses the active page.
|
||||
* - If inconsistent or blank, formats pages.
|
||||
* PUBLIC RETURN TYPE: uint16_t (EE_OK / EE_ERROR / ...)
|
||||
*/
|
||||
uint16_t EE_Init(void)
|
||||
{
|
||||
uint16_t status0 = EE_GetPageStatus(EE_PAGE0_BASE);
|
||||
uint16_t status1 = EE_GetPageStatus(EE_PAGE1_BASE);
|
||||
|
||||
if ((status0 == EE_PAGE_STATUS_ERASED) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
/* Fresh device -> format */
|
||||
return (uint16_t)EE_Format();
|
||||
}
|
||||
else if ((status0 == EE_PAGE_STATUS_VALID) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
return EE_OK;
|
||||
}
|
||||
else if ((status1 == EE_PAGE_STATUS_VALID) && (status0 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
EE_ActivePageBase = EE_PAGE1_BASE;
|
||||
return EE_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Any weird or inconsistent state -> reformat */
|
||||
return (uint16_t)EE_Format();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a 16-bit variable by its virtual address.
|
||||
* PUBLIC RETURN: EE_OK / EE_NOT_FOUND / EE_ERROR (as uint16_t)
|
||||
*/
|
||||
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
|
||||
{
|
||||
EE_Status st;
|
||||
|
||||
if (Data == NULL)
|
||||
return EE_ERROR;
|
||||
|
||||
st = EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write (append) a 16-bit variable.
|
||||
* - Writes a new record in the active page.
|
||||
* - If the page is full, triggers a page transfer (GC).
|
||||
* PUBLIC RETURN: EE_OK / EE_ERROR / EE_NO_SPACE (as uint16_t)
|
||||
*/
|
||||
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
|
||||
{
|
||||
uint32_t freeAddr;
|
||||
EE_Status st;
|
||||
|
||||
/* Find free space in active page */
|
||||
freeAddr = EE_FindFreeAddress(EE_ActivePageBase);
|
||||
if (freeAddr != 0U)
|
||||
{
|
||||
/* Write new record */
|
||||
if (EE_FlashProgramHalfWord(freeAddr, VirtAddress) != HAL_OK)
|
||||
return EE_ERROR;
|
||||
if (EE_FlashProgramHalfWord(freeAddr + 2U, Data) != HAL_OK)
|
||||
return EE_ERROR;
|
||||
|
||||
return EE_OK;
|
||||
}
|
||||
|
||||
/* No space -> page transfer */
|
||||
st = EE_PageTransfer(VirtAddress, Data);
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
void loadEE(void){
|
||||
char s [200];
|
||||
EEW_Read(M1PWMAP, &m1pwmap);
|
||||
EEW_Read(M1PWMCH, &m1pwmch);
|
||||
EEW_Read(M2PWMAP, &m2pwmap);
|
||||
EEW_Read(M2PWMCH, &m2pwmch);
|
||||
EEW_Read(M3PWMAP, &m3pwmap);
|
||||
EEW_Read(M3PWMCH, &m3pwmch);
|
||||
EEW_Read(M4PWMAP, &m4pwmap);
|
||||
EEW_Read(M4PWMCH, &m4pwmch);
|
||||
|
||||
EEW_Read(M1RAMPSTART, &mrampstart[M1-1]);
|
||||
EEW_Read(M2RAMPSTART, &mrampstart[M2-1]);
|
||||
EEW_Read(M3RAMPSTART, &mrampstart[M3-1]);
|
||||
EEW_Read(M4RAMPSTART, &mrampstart[M4-1]);
|
||||
|
||||
|
||||
EEW_Read(M1TIMEOUTMAN, &m1TimeoutMan);
|
||||
EEW_Read(M2TIMEOUTMAN, &m2TimeoutMan);
|
||||
EEW_Read(M3TIMEOUTMAN, &m3TimeoutMan);
|
||||
EEW_Read(M4TIMEOUTMAN, &m4TimeoutMan);
|
||||
|
||||
EEW_Read(TRAMP1, &tramp1);
|
||||
EEW_Read(M1PWMMAN, &m1pwmMan);
|
||||
EEW_Read(M2PWMMAN, &m2pwmMan);
|
||||
EEW_Read(M3PWMMAN, &m3pwmMan);
|
||||
EEW_Read(M4PWMMAN, &m4pwmMan);
|
||||
EEW_Read(TRAMPMAN, &trampman);
|
||||
EEW_Read(TRAMP, &tramp);
|
||||
|
||||
EEW_Read(APM1START,&apM1start);
|
||||
EEW_Read(APM1STOP ,&apM1stop);
|
||||
EEW_Read(APM2START,&apM2start);
|
||||
EEW_Read(APM2STOP ,&apM2stop);
|
||||
EEW_Read(APM3START,&apM3start);
|
||||
EEW_Read(APM3STOP ,&apM3stop);
|
||||
EEW_Read(APM4START,&apM4start);
|
||||
EEW_Read(APM4STOP ,&apM4stop);
|
||||
EEW_Read(CHM1START,&chM1start);
|
||||
EEW_Read(CHM1STOP ,&chM1stop);
|
||||
EEW_Read(CHM2START,&chM2start);
|
||||
EEW_Read(CHM2STOP ,&chM2stop);
|
||||
EEW_Read(CHM3START,&chM3start);
|
||||
EEW_Read(CHM3STOP ,&chM3stop);
|
||||
EEW_Read(CHM4START,&chM4start);
|
||||
EEW_Read(CHM4STOP ,&chM4stop);
|
||||
|
||||
sprintf((char*)s,"LoadEE\n");
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmap=%d m1pwmch=%d m2pwmap=%d m2pwmch=%d m3pwmap=%d m3pwmch=%d m4pwmap=%d m4pwmch=%d",m1pwmap,m1pwmch,m2pwmap,m2pwmch,m3pwmap,m3pwmch,m4pwmap, m4pwmch);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1TimeoutMan=%d m2TimeoutMan=%d m3TimeoutMan=%d m4TimeoutMan=%d ",m1TimeoutMan,m2TimeoutMan,m3TimeoutMan,m4TimeoutMan);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\ntramp=%d trampman=%d",tramp,trampman);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmMan=%d m2pwmMan=%d m3pwmMan=%d m4pwmMan=%d",m1pwmMan,m2pwmMan,m3pwmMan,m4pwmMan);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM1start=%d apM1stop=%d chM1start=%d chM1stop=%d",apM1start,apM1stop,chM1start,chM1stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM2start=%d apM2stop=%d chM2start=%d chM2stop=%d",apM2start,apM2stop,chM2start,chM2stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM3start=%d apM3stop=%d chM3start=%d chM3stop=%d",apM3start,apM3stop,chM3start,chM3stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM4start=%d apM4stop=%d chM4start=%d chM4stop=%d",apM4start,apM4stop,chM4start,chM4stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
|
||||
}
|
||||
@@ -1,289 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
char s[10];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=rtramp[mot-1]=tr;
|
||||
SetMotPerc(mot,dir,percStart);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
sprintf((char*)s,"\n%d",percStart+delta);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
@@ -1,288 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
char s[10];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=rtramp[mot-1]=tr;
|
||||
SetMotPerc(mot,dir,percStart);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
sprintf((char*)s,"\n%d");
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
@@ -1,283 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=percStart=tr;
|
||||
SetMotPerc(mot,dir,mrampstart[mot-1]);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,283 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=percStart=tr;
|
||||
SetMotPerc(mot,dir,mrampstart[mot-1]);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(mrampstart[mot-1]>percEnd){
|
||||
delta=mrampstart[mot-1]-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,mrampstart[mot-1]-delta);
|
||||
return RUNNING;
|
||||
}else if(mrampstart[mot-1]<percEnd){
|
||||
delta=percEnd-mrampstart[mot-1];
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,mrampstart[mot-1]+delta);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
@@ -1,492 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "eeprom.h"
|
||||
#include "pwm.h"
|
||||
extern UART_HandleTypeDef huart1;
|
||||
/*
|
||||
* Record format (4 bytes):
|
||||
* [0] VirtAddress (uint16_t)
|
||||
* [2] Data (uint16_t)
|
||||
*
|
||||
* Page layout:
|
||||
* [0] PageStatus (uint16_t)
|
||||
* [2..] Records...
|
||||
*/
|
||||
|
||||
extern uint16_t m1pwmap;
|
||||
extern uint16_t m1pwmch;
|
||||
extern uint16_t m2pwmap;
|
||||
extern uint16_t m2pwmch;
|
||||
extern uint16_t m3pwmap;
|
||||
extern uint16_t m3pwmch;
|
||||
extern uint16_t m4pwmap;
|
||||
extern uint16_t m4pwmch;
|
||||
extern uint16_t m1TimeoutMan;
|
||||
extern uint16_t m2TimeoutMan;
|
||||
extern uint16_t m3TimeoutMan;
|
||||
extern uint16_t m4TimeoutMan;
|
||||
extern uint16_t twap;
|
||||
extern uint16_t tramp;
|
||||
extern uint16_t t1ch;
|
||||
extern uint16_t t2ch;
|
||||
extern uint16_t t3ch;
|
||||
extern uint16_t t4ch;
|
||||
extern uint16_t twch;
|
||||
extern uint16_t tramp1;
|
||||
extern uint16_t trampman;
|
||||
extern uint16_t m1pwmMan;
|
||||
extern uint16_t m2pwmMan;
|
||||
extern uint16_t m3pwmMan;
|
||||
extern uint16_t m4pwmMan;
|
||||
|
||||
|
||||
extern uint16_t apM1start;
|
||||
extern uint16_t apM1stop;
|
||||
extern uint16_t apM2start;
|
||||
extern uint16_t apM2stop;
|
||||
extern uint16_t apM3start;
|
||||
extern uint16_t apM3stop;
|
||||
extern uint16_t apM4start;
|
||||
extern uint16_t apM4stop;
|
||||
extern uint16_t chM1start;
|
||||
extern uint16_t chM1stop;
|
||||
extern uint16_t chM2start;
|
||||
extern uint16_t chM2stop;
|
||||
extern uint16_t chM3start;
|
||||
extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
|
||||
const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
40, //m1pwmap
|
||||
60, //m1pwmch
|
||||
70, //m2pwmap
|
||||
70, //m2pwmch
|
||||
35, //m3pwmap
|
||||
40, //m3pwmch
|
||||
40, //m4pwmap
|
||||
40, //m4pwmch
|
||||
20, //m1rampstart
|
||||
20, //m2rampstart
|
||||
20, //m3rampstart
|
||||
20, //m4rampstart
|
||||
230,//m1timeoutman
|
||||
100,//m2timeoutman
|
||||
130,//m3timeoutman
|
||||
300,//m4timeoutman
|
||||
1, //twap
|
||||
27, //t1ch
|
||||
10, //t2ch
|
||||
30, //t3ch
|
||||
1, //t4ch
|
||||
1, //twch
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100, //tramp1
|
||||
60, //m1pwmMan
|
||||
70, //m2pwmMan
|
||||
40, //m3pwmMan
|
||||
40, //m4pwmMan
|
||||
50, //trampman
|
||||
10, //tramp
|
||||
310, //apM1start;
|
||||
450, //apM1stop;
|
||||
30, //apM2start;
|
||||
310, //apM2stop;
|
||||
350, //apM3start;
|
||||
450, //apM3stop;
|
||||
450, //apM4start;
|
||||
850, //apM4stop;
|
||||
10, //chM1start;
|
||||
280, //chM1stop;
|
||||
280, //chM2start;
|
||||
580, //chM2stop;
|
||||
20, //chM3start;
|
||||
280, //chM3stop;
|
||||
280, //chM4start;
|
||||
680, //chM4stop;
|
||||
1,
|
||||
27,
|
||||
10,
|
||||
30,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
60,
|
||||
70,
|
||||
40,
|
||||
40,
|
||||
50,
|
||||
10,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t VirtAddress;
|
||||
uint16_t Data;
|
||||
} EE_Record_t;
|
||||
|
||||
/* Active page base address (runtime selected in EE_Init) */
|
||||
static uint32_t EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
|
||||
/* 32 sequential virtual addresses */
|
||||
const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR] =
|
||||
{
|
||||
0x0001, 0x0002, 0x0003, 0x0004,
|
||||
0x0005, 0x0006, 0x0007, 0x0008,
|
||||
0x0009, 0x000A, 0x000B, 0x000C,
|
||||
0x000D, 0x000E, 0x000F, 0x0010,
|
||||
0x0011, 0x0012, 0x0013, 0x0014,
|
||||
0x0015, 0x0016, 0x0017, 0x0018,
|
||||
0x0019, 0x001A, 0x001B, 0x001C,
|
||||
0x001D, 0x001E, 0x001F, 0x0020,
|
||||
|
||||
0x0021, 0x0022, 0x0023, 0x0024,
|
||||
0x0025, 0x0026, 0x0027, 0x0028,
|
||||
0x0029, 0x002A, 0x002B, 0x002C,
|
||||
0x002D, 0x002E, 0x002F, 0x0030,
|
||||
0x0031, 0x0032, 0x0033, 0x0034,
|
||||
0x0035, 0x0036, 0x0037, 0x0038,
|
||||
0x0039, 0x003A, 0x003B, 0x003C,
|
||||
0x003D, 0x003E, 0x003F, 0x0040
|
||||
};
|
||||
/* ========================================================================= */
|
||||
|
||||
/* --- Internal helpers ---------------------------------------------------- */
|
||||
|
||||
static uint16_t EE_GetPageStatus(uint32_t pageBase)
|
||||
{
|
||||
return *(__IO uint16_t *)pageBase;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef EE_FlashProgramHalfWord(uint32_t Address, uint16_t Data)
|
||||
{
|
||||
HAL_StatusTypeDef status;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data);
|
||||
HAL_FLASH_Lock();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef EE_FlashErasePage(uint32_t PageAddress)
|
||||
{
|
||||
HAL_StatusTypeDef status;
|
||||
FLASH_EraseInitTypeDef EraseInit;
|
||||
uint32_t PageError = 0;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
|
||||
EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
EraseInit.PageAddress = PageAddress;
|
||||
EraseInit.NbPages = 1;
|
||||
|
||||
status = HAL_FLASHEx_Erase(&EraseInit, &PageError);
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Find first free record address in given page (returns 0 if full) */
|
||||
static uint32_t EE_FindFreeAddress(uint32_t pageBase)
|
||||
{
|
||||
uint32_t addr = pageBase + 2U; /* Skip status word */
|
||||
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||
|
||||
while (addr < (pageEnd - sizeof(EE_Record_t) + 1U))
|
||||
{
|
||||
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||
|
||||
if (vaddr == 0xFFFFU)
|
||||
{
|
||||
/* Empty slot */
|
||||
return addr;
|
||||
}
|
||||
addr += sizeof(EE_Record_t);
|
||||
}
|
||||
|
||||
return 0U; /* No space */
|
||||
}
|
||||
|
||||
/* Find latest value of VirtAddress in a specific page (internal, uses EE_Status) */
|
||||
/* Find latest value of VirtAddress in a specific page (scan forward) */
|
||||
static EE_Status EE_FindInPage(uint32_t pageBase, uint16_t VirtAddress, uint16_t *Data)
|
||||
{
|
||||
uint32_t addr = pageBase + 2U; // skip status halfword
|
||||
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||
EE_Status result = EE_NOT_FOUND;
|
||||
uint16_t lastVal = 0;
|
||||
|
||||
if (Data == NULL)
|
||||
return EE_ERROR;
|
||||
|
||||
while (addr <= (pageEnd - sizeof(EE_Record_t)))
|
||||
{
|
||||
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||
|
||||
if (vaddr == 0xFFFFU)
|
||||
{
|
||||
// First empty slot => no more records in this page
|
||||
break;
|
||||
}
|
||||
|
||||
uint16_t value = *(__IO uint16_t *)(addr + 2U);
|
||||
|
||||
if (vaddr == VirtAddress)
|
||||
{
|
||||
lastVal = value; // keep most recent
|
||||
result = EE_OK;
|
||||
}
|
||||
|
||||
addr += sizeof(EE_Record_t); // move 4 bytes forward
|
||||
}
|
||||
|
||||
if (result == EE_OK)
|
||||
*Data = lastVal;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Format both pages: erase and set PAGE0 as VALID */
|
||||
static EE_Status EE_Format(void)
|
||||
{
|
||||
if (EE_FlashErasePage(EE_PAGE0_BASE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
if (EE_FlashErasePage(EE_PAGE1_BASE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
if (EE_FlashProgramHalfWord(EE_PAGE0_BASE, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* PAGE1 will remain erased (status = 0xFFFF) */
|
||||
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
|
||||
return EE_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Get the base of the other page */
|
||||
static uint32_t EE_GetOtherPageBase(uint32_t pageBase)
|
||||
{
|
||||
return (pageBase == EE_PAGE0_BASE) ? EE_PAGE1_BASE : EE_PAGE0_BASE;
|
||||
}
|
||||
|
||||
/* Page transfer (garbage collection + new write) */
|
||||
static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
|
||||
{
|
||||
uint32_t oldBase = EE_ActivePageBase;
|
||||
uint32_t newBase = EE_GetOtherPageBase(oldBase);
|
||||
uint32_t addr;
|
||||
uint16_t value;
|
||||
EE_Status st;
|
||||
|
||||
/* Erase new page */
|
||||
if (EE_FlashErasePage(newBase) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Mark new page as RECEIVE */
|
||||
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_RECEIVE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Start writing records just after status */
|
||||
addr = newBase + 2U;
|
||||
|
||||
/* For each known virtual variable */
|
||||
for (uint16_t i = 0; i < EE_NUM_VIRTUAL_ADDR; i++)
|
||||
{
|
||||
uint16_t vaddr = EE_VirtAddrs[i];
|
||||
|
||||
if (vaddr == VirtAddress)
|
||||
{
|
||||
/* Use the new data passed into PageTransfer */
|
||||
value = Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Read latest value from old active page */
|
||||
st = EE_FindInPage(oldBase, vaddr, &value);
|
||||
if (st != EE_STATUS_OK)
|
||||
{
|
||||
/* Variable never written -> skip */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write record to new page */
|
||||
if (EE_FlashProgramHalfWord(addr, vaddr) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
if (EE_FlashProgramHalfWord(addr + 2U, value) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
addr += sizeof(EE_Record_t);
|
||||
if (addr >= (newBase + EE_PAGE_SIZE))
|
||||
return EE_STATUS_NO_SPACE;
|
||||
}
|
||||
|
||||
/* Erase old page */
|
||||
if (EE_FlashErasePage(oldBase) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Mark new page as VALID */
|
||||
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Update active page */
|
||||
EE_ActivePageBase = newBase;
|
||||
|
||||
return EE_STATUS_OK;
|
||||
}
|
||||
|
||||
/* --- Public API ----------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Initialize the EEPROM emulation.
|
||||
* - Checks page statuses and chooses the active page.
|
||||
* - If inconsistent or blank, formats pages.
|
||||
* PUBLIC RETURN TYPE: uint16_t (EE_OK / EE_ERROR / ...)
|
||||
*/
|
||||
uint16_t EE_Init(void)
|
||||
{
|
||||
uint16_t status0 = EE_GetPageStatus(EE_PAGE0_BASE);
|
||||
uint16_t status1 = EE_GetPageStatus(EE_PAGE1_BASE);
|
||||
|
||||
if ((status0 == EE_PAGE_STATUS_ERASED) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
/* Fresh device -> format */
|
||||
return (uint16_t)EE_Format();
|
||||
}
|
||||
else if ((status0 == EE_PAGE_STATUS_VALID) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
return EE_OK;
|
||||
}
|
||||
else if ((status1 == EE_PAGE_STATUS_VALID) && (status0 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
EE_ActivePageBase = EE_PAGE1_BASE;
|
||||
return EE_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Any weird or inconsistent state -> reformat */
|
||||
return (uint16_t)EE_Format();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a 16-bit variable by its virtual address.
|
||||
* PUBLIC RETURN: EE_OK / EE_NOT_FOUND / EE_ERROR (as uint16_t)
|
||||
*/
|
||||
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
|
||||
{
|
||||
EE_Status st;
|
||||
|
||||
if (Data == NULL)
|
||||
return EE_ERROR;
|
||||
|
||||
st = EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write (append) a 16-bit variable.
|
||||
* - Writes a new record in the active page.
|
||||
* - If the page is full, triggers a page transfer (GC).
|
||||
* PUBLIC RETURN: EE_OK / EE_ERROR / EE_NO_SPACE (as uint16_t)
|
||||
*/
|
||||
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
|
||||
{
|
||||
uint32_t freeAddr;
|
||||
EE_Status st;
|
||||
|
||||
/* Find free space in active page */
|
||||
freeAddr = EE_FindFreeAddress(EE_ActivePageBase);
|
||||
if (freeAddr != 0U)
|
||||
{
|
||||
/* Write new record */
|
||||
if (EE_FlashProgramHalfWord(freeAddr, VirtAddress) != HAL_OK)
|
||||
return EE_ERROR;
|
||||
if (EE_FlashProgramHalfWord(freeAddr + 2U, Data) != HAL_OK)
|
||||
return EE_ERROR;
|
||||
|
||||
return EE_OK;
|
||||
}
|
||||
|
||||
/* No space -> page transfer */
|
||||
st = EE_PageTransfer(VirtAddress, Data);
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
void loadEE(void){
|
||||
char s [200];
|
||||
EEW_Read(M1PWMAP, &m1pwmap);
|
||||
EEW_Read(M1PWMCH, &m1pwmch);
|
||||
EEW_Read(M2PWMAP, &m2pwmap);
|
||||
EEW_Read(M2PWMCH, &m2pwmch);
|
||||
EEW_Read(M3PWMAP, &m3pwmap);
|
||||
EEW_Read(M3PWMCH, &m3pwmch);
|
||||
EEW_Read(M4PWMAP, &m4pwmap);
|
||||
EEW_Read(M4PWMCH, &m4pwmch);
|
||||
|
||||
EEW_Read(M1RAMPSTART, &mrampstart[M1-1]);
|
||||
EEW_Read(M2RAMPSTART, &mrampstart[M2-1]);
|
||||
EEW_Read(M3RAMPSTART, &mrampstart[M3-1]);
|
||||
EEW_Read(M4RAMPSTART, &mrampstart[M4-1]);
|
||||
|
||||
|
||||
EEW_Read(M1TIMEOUTMAN, &m1TimeoutMan);
|
||||
EEW_Read(M2TIMEOUTMAN, &m2TimeoutMan);
|
||||
EEW_Read(M3TIMEOUTMAN, &m3TimeoutMan);
|
||||
EEW_Read(M4TIMEOUTMAN, &m4TimeoutMan);
|
||||
|
||||
EEW_Read(TRAMP1, &tramp1);
|
||||
EEW_Read(M1PWMMAN, &m1pwmMan);
|
||||
EEW_Read(M2PWMMAN, &m2pwmMan);
|
||||
EEW_Read(M3PWMMAN, &m3pwmMan);
|
||||
EEW_Read(M4PWMMAN, &m4pwmMan);
|
||||
EEW_Read(TRAMPMAN, &trampman);
|
||||
EEW_Read(TRAMP, &tramp);
|
||||
|
||||
EEW_Read(APM1START,&apM1start);
|
||||
EEW_Read(APM1STOP ,&apM1stop);
|
||||
EEW_Read(APM2START,&apM2start);
|
||||
EEW_Read(APM2STOP ,&apM2stop);
|
||||
EEW_Read(APM3START,&apM3start);
|
||||
EEW_Read(APM3STOP ,&apM3stop);
|
||||
EEW_Read(APM4START,&apM4start);
|
||||
EEW_Read(APM4STOP ,&apM4stop);
|
||||
EEW_Read(CHM1START,&chM1start);
|
||||
EEW_Read(CHM1STOP ,&chM1stop);
|
||||
EEW_Read(CHM2START,&chM2start);
|
||||
EEW_Read(CHM2STOP ,&chM2stop);
|
||||
EEW_Read(CHM3START,&chM3start);
|
||||
EEW_Read(CHM3STOP ,&chM3stop);
|
||||
EEW_Read(CHM4START,&chM4start);
|
||||
EEW_Read(CHM4STOP ,&chM4stop);
|
||||
|
||||
sprintf((char*)s,"LoadEE\n");
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmap=%d m1pwmch=%d m2pwmap=%d m2pwmch=%d m3pwmap=%d m3pwmch=%d m4pwmap=%d m4pwmch=%d",m1pwmap,m1pwmch,m2pwmap,m2pwmch,m3pwmap,m3pwmch,m4pwmap, m4pwmch);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1TimeoutMan=%d m2TimeoutMan=%d m3TimeoutMan=%d m4TimeoutMan=%d ",m1TimeoutMan,m2TimeoutMan,m3TimeoutMan,m4TimeoutMan);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\ntramp=%d trampman=%d",tramp,trampman);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmMan=%d m2pwmMan=%d m3pwmMan=%d m4pwmMan=%d",m1pwmMan,m2pwmMan,m3pwmMan,m4pwmMan);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM1start=%d apM1stop=%d chM1start=%d chM1stop=%d",apM1start,apM1stop,chM1start,chM1stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM2start=%d apM2stop=%d chM2start=%d chM2stop=%d",apM2start,apM2stop,chM2start,chM2stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM3start=%d apM3stop=%d chM3start=%d chM3stop=%d",apM3start,apM3stop,chM3start,chM3stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM4start=%d apM4stop=%d chM4start=%d chM4stop=%d",apM4start,apM4stop,chM4start,chM4stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
|
||||
}
|
||||
@@ -1,283 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint8_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=rtramp[mot-1]=tr;
|
||||
SetMotPerc(mot,dir,percStart);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -32,7 +32,8 @@ extern uint16_t t2ch;
|
||||
extern uint16_t t3ch;
|
||||
extern uint16_t t4ch;
|
||||
extern uint16_t twch;
|
||||
extern uint16_t tramp1;
|
||||
extern uint16_t tanem;
|
||||
extern uint16_t thanem;
|
||||
extern uint16_t trampman;
|
||||
extern uint16_t m1pwmMan;
|
||||
extern uint16_t m2pwmMan;
|
||||
@@ -58,6 +59,8 @@ extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
|
||||
extern uint16_t flagPar;
|
||||
|
||||
const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
40, //m1pwmap
|
||||
60, //m1pwmch
|
||||
@@ -83,8 +86,8 @@ const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
1, //twch
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100, //tramp1
|
||||
0x200,//thanem
|
||||
20, //tanem
|
||||
60, //m1pwmMan
|
||||
70, //m2pwmMan
|
||||
40, //m3pwmMan
|
||||
@@ -96,7 +99,7 @@ const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
30, //apM2start;
|
||||
310, //apM2stop;
|
||||
340, //apM3start;
|
||||
420, //apM3stop;
|
||||
430, //apM3stop;
|
||||
30, //apM4start;
|
||||
430, //apM4stop;
|
||||
10, //chM1start;
|
||||
@@ -122,7 +125,7 @@ const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
40,
|
||||
40,
|
||||
50,
|
||||
10,
|
||||
0xa5,//flag parametri caricati correttamente. deve valere 0xa5
|
||||
};
|
||||
|
||||
typedef struct
|
||||
@@ -424,6 +427,19 @@ uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
void loadDefault(void){
|
||||
uint8_t i;
|
||||
char s[100];
|
||||
uint16_t st;
|
||||
for(i=0;i<EE_NUM_VIRTUAL_ADDR;i++){
|
||||
st=EEW_Write(i,deftab[i]);
|
||||
if (st == EE_OK)sprintf((char*)s,"\ndone %d=%d",i,deftab[i]);
|
||||
else sprintf((char*)s,"\nee write error %d", st);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void loadEE(void){
|
||||
char s [200];
|
||||
EEW_Read(M1PWMAP, &m1pwmap);
|
||||
@@ -446,7 +462,8 @@ void loadEE(void){
|
||||
EEW_Read(M3TIMEOUTMAN, &m3TimeoutMan);
|
||||
EEW_Read(M4TIMEOUTMAN, &m4TimeoutMan);
|
||||
|
||||
EEW_Read(TRAMP1, &tramp1);
|
||||
EEW_Read(THANEM, &thanem);
|
||||
EEW_Read(TANEM, &thanem);
|
||||
EEW_Read(M1PWMMAN, &m1pwmMan);
|
||||
EEW_Read(M2PWMMAN, &m2pwmMan);
|
||||
EEW_Read(M3PWMMAN, &m3pwmMan);
|
||||
@@ -471,6 +488,8 @@ void loadEE(void){
|
||||
EEW_Read(CHM4START,&chM4start);
|
||||
EEW_Read(CHM4STOP ,&chM4stop);
|
||||
|
||||
EEW_Read(FLAGPAR ,&flagPar);
|
||||
|
||||
sprintf((char*)s,"LoadEE\n");
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmap=%d m1pwmch=%d m2pwmap=%d m2pwmch=%d m3pwmap=%d m3pwmch=%d m4pwmap=%d m4pwmch=%d",m1pwmap,m1pwmch,m2pwmap,m2pwmch,m3pwmap,m3pwmch,m4pwmap, m4pwmch);
|
||||
@@ -1,493 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "eeprom.h"
|
||||
#include "pwm.h"
|
||||
extern UART_HandleTypeDef huart1;
|
||||
/*
|
||||
* Record format (4 bytes):
|
||||
* [0] VirtAddress (uint16_t)
|
||||
* [2] Data (uint16_t)
|
||||
*
|
||||
* Page layout:
|
||||
* [0] PageStatus (uint16_t)
|
||||
* [2..] Records...
|
||||
*/
|
||||
|
||||
extern uint16_t m1pwmap;
|
||||
extern uint16_t m1pwmch;
|
||||
extern uint16_t m2pwmap;
|
||||
extern uint16_t m2pwmch;
|
||||
extern uint16_t m3pwmap;
|
||||
extern uint16_t m3pwmch;
|
||||
extern uint16_t m4pwmap;
|
||||
extern uint16_t m4pwmch;
|
||||
extern uint16_t m1TimeoutMan;
|
||||
extern uint16_t m2TimeoutMan;
|
||||
extern uint16_t m3TimeoutMan;
|
||||
extern uint16_t m4TimeoutMan;
|
||||
extern uint16_t twap;
|
||||
extern uint16_t tramp;
|
||||
extern uint16_t t1ch;
|
||||
extern uint16_t t2ch;
|
||||
extern uint16_t t3ch;
|
||||
extern uint16_t t4ch;
|
||||
extern uint16_t twch;
|
||||
extern uint16_t tramp1;
|
||||
extern uint16_t trampman;
|
||||
extern uint16_t m1pwmMan;
|
||||
extern uint16_t m2pwmMan;
|
||||
extern uint16_t m3pwmMan;
|
||||
extern uint16_t m4pwmMan;
|
||||
extern uint16_t mrampstart[];
|
||||
|
||||
|
||||
extern uint16_t apM1start;
|
||||
extern uint16_t apM1stop;
|
||||
extern uint16_t apM2start;
|
||||
extern uint16_t apM2stop;
|
||||
extern uint16_t apM3start;
|
||||
extern uint16_t apM3stop;
|
||||
extern uint16_t apM4start;
|
||||
extern uint16_t apM4stop;
|
||||
extern uint16_t chM1start;
|
||||
extern uint16_t chM1stop;
|
||||
extern uint16_t chM2start;
|
||||
extern uint16_t chM2stop;
|
||||
extern uint16_t chM3start;
|
||||
extern uint16_t chM3stop;
|
||||
extern uint16_t chM4start;
|
||||
extern uint16_t chM4stop;
|
||||
|
||||
const uint16_t deftab[EE_NUM_VIRTUAL_ADDR]={
|
||||
40, //m1pwmap
|
||||
60, //m1pwmch
|
||||
70, //m2pwmap
|
||||
70, //m2pwmch
|
||||
35, //m3pwmap
|
||||
40, //m3pwmch
|
||||
40, //m4pwmap
|
||||
40, //m4pwmch
|
||||
20, //m1rampstart
|
||||
20, //m2rampstart
|
||||
20, //m3rampstart
|
||||
20, //m4rampstart
|
||||
230,//m1timeoutman
|
||||
100,//m2timeoutman
|
||||
130,//m3timeoutman
|
||||
300,//m4timeoutman
|
||||
1, //twap
|
||||
27, //t1ch
|
||||
10, //t2ch
|
||||
30, //t3ch
|
||||
1, //t4ch
|
||||
1, //twch
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100, //tramp1
|
||||
60, //m1pwmMan
|
||||
70, //m2pwmMan
|
||||
40, //m3pwmMan
|
||||
40, //m4pwmMan
|
||||
50, //trampman
|
||||
10, //tramp
|
||||
310, //apM1start;
|
||||
450, //apM1stop;
|
||||
30, //apM2start;
|
||||
310, //apM2stop;
|
||||
350, //apM3start;
|
||||
450, //apM3stop;
|
||||
450, //apM4start;
|
||||
850, //apM4stop;
|
||||
10, //chM1start;
|
||||
280, //chM1stop;
|
||||
280, //chM2start;
|
||||
580, //chM2stop;
|
||||
20, //chM3start;
|
||||
280, //chM3stop;
|
||||
280, //chM4start;
|
||||
680, //chM4stop;
|
||||
1,
|
||||
27,
|
||||
10,
|
||||
30,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
60,
|
||||
70,
|
||||
40,
|
||||
40,
|
||||
50,
|
||||
10,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t VirtAddress;
|
||||
uint16_t Data;
|
||||
} EE_Record_t;
|
||||
|
||||
/* Active page base address (runtime selected in EE_Init) */
|
||||
static uint32_t EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
|
||||
/* 32 sequential virtual addresses */
|
||||
const uint16_t EE_VirtAddrs[EE_NUM_VIRTUAL_ADDR] =
|
||||
{
|
||||
0x0001, 0x0002, 0x0003, 0x0004,
|
||||
0x0005, 0x0006, 0x0007, 0x0008,
|
||||
0x0009, 0x000A, 0x000B, 0x000C,
|
||||
0x000D, 0x000E, 0x000F, 0x0010,
|
||||
0x0011, 0x0012, 0x0013, 0x0014,
|
||||
0x0015, 0x0016, 0x0017, 0x0018,
|
||||
0x0019, 0x001A, 0x001B, 0x001C,
|
||||
0x001D, 0x001E, 0x001F, 0x0020,
|
||||
|
||||
0x0021, 0x0022, 0x0023, 0x0024,
|
||||
0x0025, 0x0026, 0x0027, 0x0028,
|
||||
0x0029, 0x002A, 0x002B, 0x002C,
|
||||
0x002D, 0x002E, 0x002F, 0x0030,
|
||||
0x0031, 0x0032, 0x0033, 0x0034,
|
||||
0x0035, 0x0036, 0x0037, 0x0038,
|
||||
0x0039, 0x003A, 0x003B, 0x003C,
|
||||
0x003D, 0x003E, 0x003F, 0x0040
|
||||
};
|
||||
/* ========================================================================= */
|
||||
|
||||
/* --- Internal helpers ---------------------------------------------------- */
|
||||
|
||||
static uint16_t EE_GetPageStatus(uint32_t pageBase)
|
||||
{
|
||||
return *(__IO uint16_t *)pageBase;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef EE_FlashProgramHalfWord(uint32_t Address, uint16_t Data)
|
||||
{
|
||||
HAL_StatusTypeDef status;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, Data);
|
||||
HAL_FLASH_Lock();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static HAL_StatusTypeDef EE_FlashErasePage(uint32_t PageAddress)
|
||||
{
|
||||
HAL_StatusTypeDef status;
|
||||
FLASH_EraseInitTypeDef EraseInit;
|
||||
uint32_t PageError = 0;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
|
||||
EraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
EraseInit.PageAddress = PageAddress;
|
||||
EraseInit.NbPages = 1;
|
||||
|
||||
status = HAL_FLASHEx_Erase(&EraseInit, &PageError);
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Find first free record address in given page (returns 0 if full) */
|
||||
static uint32_t EE_FindFreeAddress(uint32_t pageBase)
|
||||
{
|
||||
uint32_t addr = pageBase + 2U; /* Skip status word */
|
||||
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||
|
||||
while (addr < (pageEnd - sizeof(EE_Record_t) + 1U))
|
||||
{
|
||||
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||
|
||||
if (vaddr == 0xFFFFU)
|
||||
{
|
||||
/* Empty slot */
|
||||
return addr;
|
||||
}
|
||||
addr += sizeof(EE_Record_t);
|
||||
}
|
||||
|
||||
return 0U; /* No space */
|
||||
}
|
||||
|
||||
/* Find latest value of VirtAddress in a specific page (internal, uses EE_Status) */
|
||||
/* Find latest value of VirtAddress in a specific page (scan forward) */
|
||||
static EE_Status EE_FindInPage(uint32_t pageBase, uint16_t VirtAddress, uint16_t *Data)
|
||||
{
|
||||
uint32_t addr = pageBase + 2U; // skip status halfword
|
||||
uint32_t pageEnd = pageBase + EE_PAGE_SIZE;
|
||||
EE_Status result = EE_NOT_FOUND;
|
||||
uint16_t lastVal = 0;
|
||||
|
||||
if (Data == NULL)
|
||||
return EE_ERROR;
|
||||
|
||||
while (addr <= (pageEnd - sizeof(EE_Record_t)))
|
||||
{
|
||||
uint16_t vaddr = *(__IO uint16_t *)addr;
|
||||
|
||||
if (vaddr == 0xFFFFU)
|
||||
{
|
||||
// First empty slot => no more records in this page
|
||||
break;
|
||||
}
|
||||
|
||||
uint16_t value = *(__IO uint16_t *)(addr + 2U);
|
||||
|
||||
if (vaddr == VirtAddress)
|
||||
{
|
||||
lastVal = value; // keep most recent
|
||||
result = EE_OK;
|
||||
}
|
||||
|
||||
addr += sizeof(EE_Record_t); // move 4 bytes forward
|
||||
}
|
||||
|
||||
if (result == EE_OK)
|
||||
*Data = lastVal;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Format both pages: erase and set PAGE0 as VALID */
|
||||
static EE_Status EE_Format(void)
|
||||
{
|
||||
if (EE_FlashErasePage(EE_PAGE0_BASE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
if (EE_FlashErasePage(EE_PAGE1_BASE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
if (EE_FlashProgramHalfWord(EE_PAGE0_BASE, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* PAGE1 will remain erased (status = 0xFFFF) */
|
||||
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
|
||||
return EE_STATUS_OK;
|
||||
}
|
||||
|
||||
/* Get the base of the other page */
|
||||
static uint32_t EE_GetOtherPageBase(uint32_t pageBase)
|
||||
{
|
||||
return (pageBase == EE_PAGE0_BASE) ? EE_PAGE1_BASE : EE_PAGE0_BASE;
|
||||
}
|
||||
|
||||
/* Page transfer (garbage collection + new write) */
|
||||
static EE_Status EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
|
||||
{
|
||||
uint32_t oldBase = EE_ActivePageBase;
|
||||
uint32_t newBase = EE_GetOtherPageBase(oldBase);
|
||||
uint32_t addr;
|
||||
uint16_t value;
|
||||
EE_Status st;
|
||||
|
||||
/* Erase new page */
|
||||
if (EE_FlashErasePage(newBase) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Mark new page as RECEIVE */
|
||||
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_RECEIVE) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Start writing records just after status */
|
||||
addr = newBase + 2U;
|
||||
|
||||
/* For each known virtual variable */
|
||||
for (uint16_t i = 0; i < EE_NUM_VIRTUAL_ADDR; i++)
|
||||
{
|
||||
uint16_t vaddr = EE_VirtAddrs[i];
|
||||
|
||||
if (vaddr == VirtAddress)
|
||||
{
|
||||
/* Use the new data passed into PageTransfer */
|
||||
value = Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Read latest value from old active page */
|
||||
st = EE_FindInPage(oldBase, vaddr, &value);
|
||||
if (st != EE_STATUS_OK)
|
||||
{
|
||||
/* Variable never written -> skip */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write record to new page */
|
||||
if (EE_FlashProgramHalfWord(addr, vaddr) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
if (EE_FlashProgramHalfWord(addr + 2U, value) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
addr += sizeof(EE_Record_t);
|
||||
if (addr >= (newBase + EE_PAGE_SIZE))
|
||||
return EE_STATUS_NO_SPACE;
|
||||
}
|
||||
|
||||
/* Erase old page */
|
||||
if (EE_FlashErasePage(oldBase) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Mark new page as VALID */
|
||||
if (EE_FlashProgramHalfWord(newBase, EE_PAGE_STATUS_VALID) != HAL_OK)
|
||||
return EE_STATUS_ERROR;
|
||||
|
||||
/* Update active page */
|
||||
EE_ActivePageBase = newBase;
|
||||
|
||||
return EE_STATUS_OK;
|
||||
}
|
||||
|
||||
/* --- Public API ----------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Initialize the EEPROM emulation.
|
||||
* - Checks page statuses and chooses the active page.
|
||||
* - If inconsistent or blank, formats pages.
|
||||
* PUBLIC RETURN TYPE: uint16_t (EE_OK / EE_ERROR / ...)
|
||||
*/
|
||||
uint16_t EE_Init(void)
|
||||
{
|
||||
uint16_t status0 = EE_GetPageStatus(EE_PAGE0_BASE);
|
||||
uint16_t status1 = EE_GetPageStatus(EE_PAGE1_BASE);
|
||||
|
||||
if ((status0 == EE_PAGE_STATUS_ERASED) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
/* Fresh device -> format */
|
||||
return (uint16_t)EE_Format();
|
||||
}
|
||||
else if ((status0 == EE_PAGE_STATUS_VALID) && (status1 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
EE_ActivePageBase = EE_PAGE0_BASE;
|
||||
return EE_OK;
|
||||
}
|
||||
else if ((status1 == EE_PAGE_STATUS_VALID) && (status0 == EE_PAGE_STATUS_ERASED))
|
||||
{
|
||||
EE_ActivePageBase = EE_PAGE1_BASE;
|
||||
return EE_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Any weird or inconsistent state -> reformat */
|
||||
return (uint16_t)EE_Format();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a 16-bit variable by its virtual address.
|
||||
* PUBLIC RETURN: EE_OK / EE_NOT_FOUND / EE_ERROR (as uint16_t)
|
||||
*/
|
||||
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
|
||||
{
|
||||
EE_Status st;
|
||||
|
||||
if (Data == NULL)
|
||||
return EE_ERROR;
|
||||
|
||||
st = EE_FindInPage(EE_ActivePageBase, VirtAddress, Data);
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write (append) a 16-bit variable.
|
||||
* - Writes a new record in the active page.
|
||||
* - If the page is full, triggers a page transfer (GC).
|
||||
* PUBLIC RETURN: EE_OK / EE_ERROR / EE_NO_SPACE (as uint16_t)
|
||||
*/
|
||||
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
|
||||
{
|
||||
uint32_t freeAddr;
|
||||
EE_Status st;
|
||||
|
||||
/* Find free space in active page */
|
||||
freeAddr = EE_FindFreeAddress(EE_ActivePageBase);
|
||||
if (freeAddr != 0U)
|
||||
{
|
||||
/* Write new record */
|
||||
if (EE_FlashProgramHalfWord(freeAddr, VirtAddress) != HAL_OK)
|
||||
return EE_ERROR;
|
||||
if (EE_FlashProgramHalfWord(freeAddr + 2U, Data) != HAL_OK)
|
||||
return EE_ERROR;
|
||||
|
||||
return EE_OK;
|
||||
}
|
||||
|
||||
/* No space -> page transfer */
|
||||
st = EE_PageTransfer(VirtAddress, Data);
|
||||
return (uint16_t)st;
|
||||
}
|
||||
|
||||
void loadEE(void){
|
||||
char s [200];
|
||||
EEW_Read(M1PWMAP, &m1pwmap);
|
||||
EEW_Read(M1PWMCH, &m1pwmch);
|
||||
EEW_Read(M2PWMAP, &m2pwmap);
|
||||
EEW_Read(M2PWMCH, &m2pwmch);
|
||||
EEW_Read(M3PWMAP, &m3pwmap);
|
||||
EEW_Read(M3PWMCH, &m3pwmch);
|
||||
EEW_Read(M4PWMAP, &m4pwmap);
|
||||
EEW_Read(M4PWMCH, &m4pwmch);
|
||||
|
||||
EEW_Read(M1RAMPSTART, &mrampstart[M1-1]);
|
||||
EEW_Read(M2RAMPSTART, &mrampstart[M2-1]);
|
||||
EEW_Read(M3RAMPSTART, &mrampstart[M3-1]);
|
||||
EEW_Read(M4RAMPSTART, &mrampstart[M4-1]);
|
||||
|
||||
|
||||
EEW_Read(M1TIMEOUTMAN, &m1TimeoutMan);
|
||||
EEW_Read(M2TIMEOUTMAN, &m2TimeoutMan);
|
||||
EEW_Read(M3TIMEOUTMAN, &m3TimeoutMan);
|
||||
EEW_Read(M4TIMEOUTMAN, &m4TimeoutMan);
|
||||
|
||||
EEW_Read(TRAMP1, &tramp1);
|
||||
EEW_Read(M1PWMMAN, &m1pwmMan);
|
||||
EEW_Read(M2PWMMAN, &m2pwmMan);
|
||||
EEW_Read(M3PWMMAN, &m3pwmMan);
|
||||
EEW_Read(M4PWMMAN, &m4pwmMan);
|
||||
EEW_Read(TRAMPMAN, &trampman);
|
||||
EEW_Read(TRAMP, &tramp);
|
||||
|
||||
EEW_Read(APM1START,&apM1start);
|
||||
EEW_Read(APM1STOP ,&apM1stop);
|
||||
EEW_Read(APM2START,&apM2start);
|
||||
EEW_Read(APM2STOP ,&apM2stop);
|
||||
EEW_Read(APM3START,&apM3start);
|
||||
EEW_Read(APM3STOP ,&apM3stop);
|
||||
EEW_Read(APM4START,&apM4start);
|
||||
EEW_Read(APM4STOP ,&apM4stop);
|
||||
EEW_Read(CHM1START,&chM1start);
|
||||
EEW_Read(CHM1STOP ,&chM1stop);
|
||||
EEW_Read(CHM2START,&chM2start);
|
||||
EEW_Read(CHM2STOP ,&chM2stop);
|
||||
EEW_Read(CHM3START,&chM3start);
|
||||
EEW_Read(CHM3STOP ,&chM3stop);
|
||||
EEW_Read(CHM4START,&chM4start);
|
||||
EEW_Read(CHM4STOP ,&chM4stop);
|
||||
|
||||
sprintf((char*)s,"LoadEE\n");
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmap=%d m1pwmch=%d m2pwmap=%d m2pwmch=%d m3pwmap=%d m3pwmch=%d m4pwmap=%d m4pwmch=%d",m1pwmap,m1pwmch,m2pwmap,m2pwmch,m3pwmap,m3pwmch,m4pwmap, m4pwmch);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1TimeoutMan=%d m2TimeoutMan=%d m3TimeoutMan=%d m4TimeoutMan=%d ",m1TimeoutMan,m2TimeoutMan,m3TimeoutMan,m4TimeoutMan);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\ntramp=%d trampman=%d",tramp,trampman);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\nm1pwmMan=%d m2pwmMan=%d m3pwmMan=%d m4pwmMan=%d",m1pwmMan,m2pwmMan,m3pwmMan,m4pwmMan);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM1start=%d apM1stop=%d chM1start=%d chM1stop=%d",apM1start,apM1stop,chM1start,chM1stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM2start=%d apM2stop=%d chM2start=%d chM2stop=%d",apM2start,apM2stop,chM2start,chM2stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM3start=%d apM3stop=%d chM3start=%d chM3stop=%d",apM3start,apM3stop,chM3start,chM3stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
sprintf((char*)s,"\napM4start=%d apM4stop=%d chM4start=%d chM4stop=%d",apM4start,apM4stop,chM4start,chM4stop);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
|
||||
}
|
||||
@@ -1,289 +0,0 @@
|
||||
/*
|
||||
* pwm.c
|
||||
*
|
||||
* Created on: Dec 6, 2025
|
||||
* Author: user
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "stm32f1xx_hal.h"
|
||||
#include "main.h"
|
||||
#include "pwm.h"
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern TIM_HandleTypeDef htim3;
|
||||
extern TIM_HandleTypeDef htim4;
|
||||
extern volatile uint16_t rtramp[4];
|
||||
extern uint16_t mrampstart[4];
|
||||
extern UART_HandleTypeDef huart1;
|
||||
|
||||
bool IsPwmRunning(TIM_HandleTypeDef *htim, uint32_t Channel)
|
||||
{
|
||||
HAL_TIM_ChannelStateTypeDef chState = HAL_TIM_GetChannelState(htim, Channel);
|
||||
|
||||
return (chState == HAL_TIM_CHANNEL_STATE_BUSY);
|
||||
}
|
||||
|
||||
void StopMot(TIM_HandleTypeDef *htim,uint32_t Channel){
|
||||
HAL_TIM_PWM_Stop(htim, Channel);
|
||||
}
|
||||
|
||||
void StartMot(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
HAL_TIM_PWM_Start(htim, Channel);
|
||||
}
|
||||
|
||||
void SetMotPwm(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t pwmval){
|
||||
__HAL_TIM_SET_COMPARE(htim, Channel, pwmval);
|
||||
}
|
||||
|
||||
void SetMot(uint8_t mot,uint8_t dir,uint16_t pwmval){
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetMotPerc(uint8_t mot,uint8_t dir,uint8_t perc){
|
||||
uint16_t pwmval;
|
||||
uint32_t tempval;
|
||||
tempval=perc;
|
||||
tempval*=16384;
|
||||
tempval/=100;
|
||||
pwmval=(uint16_t)tempval;
|
||||
switch(mot){
|
||||
case 1:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,FWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, FWMot1)){
|
||||
SetMotPwm(timMot1,FWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,FWMot1,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot1,BWMot1);
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot1, BWMot1)){
|
||||
SetMotPwm(timMot1,BWMot1,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH1_GPIO_Port, INH1_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot1,BWMot1,pwmval);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,FWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, FWMot2)){
|
||||
SetMotPwm(timMot2,FWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,FWMot2,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot2,BWMot2);
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot2, BWMot2)){
|
||||
SetMotPwm(timMot2,BWMot2,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH2_GPIO_Port, INH2_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot2,BWMot2,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,FWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, FWMot3)){
|
||||
SetMotPwm(timMot3,FWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,FWMot3,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot3,BWMot3);
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot3, BWMot3)){
|
||||
SetMotPwm(timMot3,BWMot3,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH3_GPIO_Port, INH3_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot3,BWMot3,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(dir==FW){
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,FWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, FWMot4)){
|
||||
SetMotPwm(timMot4,FWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,FWMot4,pwmval);
|
||||
}
|
||||
}else{
|
||||
if(pwmval==0){
|
||||
StopMot(timMot4,BWMot4);
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_RESET);
|
||||
}else if(IsPwmRunning(timMot4, BWMot4)){
|
||||
SetMotPwm(timMot4,BWMot4,pwmval);
|
||||
}else{
|
||||
HAL_GPIO_WritePin(INH4_GPIO_Port, INH4_Pin, GPIO_PIN_SET);
|
||||
StartMot(timMot4,BWMot4,pwmval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uint8_t ramp(uint8_t mot,uint8_t dir,uint8_t percStart,uint8_t percEnd,uint8_t tr,uint8_t mode){
|
||||
static uint8_t memrtramp[4];
|
||||
char s[10];
|
||||
uint16_t delta;
|
||||
switch(mode){
|
||||
case RAMPINIT:
|
||||
memrtramp[mot-1]=rtramp[mot-1]=tr;
|
||||
SetMotPerc(mot,dir,percStart);
|
||||
return DONE;
|
||||
case RAMPRUN:
|
||||
if(memrtramp[mot-1]!=rtramp[mot-1]){
|
||||
memrtramp[mot-1]=rtramp[mot-1];
|
||||
if(rtramp[mot-1]){
|
||||
if(percStart>percEnd){
|
||||
delta=percStart-percEnd;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart-delta);
|
||||
return RUNNING;
|
||||
}else if(percStart<percEnd){
|
||||
delta=percEnd-percStart;
|
||||
delta=delta*(uint16_t)(tr-rtramp[mot-1]);
|
||||
delta=delta/tr;
|
||||
SetMotPerc(mot,dir,percStart+delta);
|
||||
sprintf((char*)s,"\n%d",percStart+delta);
|
||||
HAL_UART_Transmit(&huart1,(uint8_t*) s, strlen(s), HAL_MAX_DELAY);
|
||||
return RUNNING;
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else{
|
||||
SetMotPerc(mot,dir,percEnd);
|
||||
return DONE;
|
||||
}
|
||||
}else return RUNNING;
|
||||
break;
|
||||
}
|
||||
return DONE;
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -38,7 +38,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="rtramp"/>
|
||||
<item key="textPattern" value="rtCiclo"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -53,7 +53,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="mrampstart"/>
|
||||
<item key="textPattern" value="flagPar"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -65,7 +65,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="M1PWMAP"/>
|
||||
<item key="textPattern" value="tramp1"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -77,7 +77,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="chM3start"/>
|
||||
<item key="textPattern" value="ch8"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -89,7 +89,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="cm3start"/>
|
||||
<item key="textPattern" value="flagpar"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -101,7 +101,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="chM1start"/>
|
||||
<item key="textPattern" value="chM4stop"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -113,7 +113,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="m1ch"/>
|
||||
<item key="textPattern" value="loaddefault"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -125,7 +125,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="bool"/>
|
||||
<item key="textPattern" value="twap"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -137,7 +137,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="deftab"/>
|
||||
<item key="textPattern" value="rtramp"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -149,7 +149,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="rtCiclo"/>
|
||||
<item key="textPattern" value="mrampstart"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -161,7 +161,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="tramp1"/>
|
||||
<item key="textPattern" value="M1PWMAP"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
@@ -173,7 +173,7 @@
|
||||
<item key="ignoreCase" value="true"/>
|
||||
<item key="isRegExSearch" value="false"/>
|
||||
<item key="isWholeWord" value="false"/>
|
||||
<item key="textPattern" value="t4ch"/>
|
||||
<item key="textPattern" value="chM3start"/>
|
||||
<item key="scope" value="0"/>
|
||||
<list key="fileNamePatterns">
|
||||
<item value="*"/>
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
<item key="hasShownOverlayPopupBefore" value="true"/>
|
||||
<item key="replaceBarOpen" value="false"/>
|
||||
<list key="searchhistory">
|
||||
<item value="ch8"/>
|
||||
<item value="p1star"/>
|
||||
<item value="bool"/>
|
||||
<item value="omM1fw1"/>
|
||||
<item value="M1FW"/>
|
||||
@@ -16,7 +18,5 @@
|
||||
<item value="P2STOP"/>
|
||||
<item value="rtramp"/>
|
||||
<item value="extern uint16_t "/>
|
||||
<item value="deftab"/>
|
||||
<item value="rtp1"/>
|
||||
</list>
|
||||
</section>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#Fri May 15 19:11:24 CEST 2026
|
||||
#Mon May 25 23:06:40 CEST 2026
|
||||
org.eclipse.core.runtime=2
|
||||
org.eclipse.platform=4.33.0.v20240903-0240
|
||||
|
||||
Reference in New Issue
Block a user