More cleanups and improvements

This commit is contained in:
2021-05-14 21:31:12 +02:00
parent 94ded84e82
commit 274466e017
3 changed files with 69 additions and 51 deletions

View File

@ -40,6 +40,8 @@ add_definitions(-DFEATURE_IGNORE_OTHER_MOTOR)
add_definitions(-DPETERS_PLATINE)
add_definitions(-DHUARN2)
#add_definitions(-DHUARN3)
add_definitions(-DFEATURE_SERIAL_CONTROL)
add_definitions(-DFEATURE_SERIAL_FEEDBACK)
add_executable(firmware.elf
STM32CubeF1/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c

View File

@ -22,6 +22,7 @@
*/
#include <algorithm>
#include <atomic>
#include "stm32f1xx_hal.h"
@ -71,7 +72,7 @@ volatile struct {
// ###############################################################################
volatile uint32_t timeout;
std::atomic<uint32_t> timeout;
int16_t timeoutCntSerial = 0; // Timeout counter for Rx Serial command
uint32_t main_loop_counter;
@ -136,9 +137,13 @@ void MX_ADC2_Init();
void poweroff();
#ifdef FEATURE_SERIAL_CONTROL
void parseCommand();
#endif
#ifdef FEATURE_SERIAL_FEEDBACK
void sendFeedback();
#endif
} // anonymous namespace
@ -235,7 +240,9 @@ int main()
#ifdef MOTOR_TEST
int pwm = 0;
int8_t dir = 1;
#else
#endif
#ifdef FEATURE_SERIAL_CONTROL
#ifdef HUARN2
HAL_UART_Receive_DMA(&huart2, (uint8_t *)&command, sizeof(command));
#endif
@ -244,10 +251,11 @@ int main()
#endif
#endif
for (;;) {
while (true)
{
HAL_Delay(DELAY_IN_MAIN_LOOP); //delay in ms
#ifndef MOTOR_TEST
#ifdef FEATURE_SERIAL_CONTROL
parseCommand();
#endif
@ -283,7 +291,10 @@ int main()
board_temp_adcFilt = (int16_t)(board_temp_adcFixdt >> 20); // convert fixed-point to integer
board_temp_deg_c = (TEMP_CAL_HIGH_DEG_C - TEMP_CAL_LOW_DEG_C) * (board_temp_adcFilt - TEMP_CAL_LOW_ADC) / (TEMP_CAL_HIGH_ADC - TEMP_CAL_LOW_ADC) + TEMP_CAL_LOW_DEG_C;
#ifdef FEATURE_SERIAL_FEEDBACK
if (main_loop_counter % 50 != 0) // Send data periodically
sendFeedback();
#endif
#ifdef FEATURE_BUTTON
if (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN))
@ -358,15 +369,22 @@ void updateMotors()
// Disable PWM when current limit is reached (current chopping)
// This is the Level 2 of current protection. The Level 1 should kick in first given by I_MOT_MAX
if(chopL || timeout > TIMEOUT || left.state.enable == 0) {
const auto timeoutVal = timeout.load();
if (chopL || timeoutVal > TIMEOUT || left.state.enable == 0)
{
LEFT_TIM->BDTR &= ~TIM_BDTR_MOE;
} else {
}
else
{
LEFT_TIM->BDTR |= TIM_BDTR_MOE;
}
if(chopR || timeout > TIMEOUT || right.state.enable == 0) {
if (chopR || timeoutVal > TIMEOUT || right.state.enable == 0)
{
RIGHT_TIM->BDTR &= ~TIM_BDTR_MOE;
} else {
}
else
{
RIGHT_TIM->BDTR |= TIM_BDTR_MOE;
}
@ -389,9 +407,8 @@ void updateMotors()
static boolean_T OverrunFlag = false;
/* Check for overrun */
if (OverrunFlag) {
if (OverrunFlag)
return;
}
OverrunFlag = true;
constexpr int32_t pwm_res = 64000000 / 2 / PWM_FREQ; // = 2000
@ -1069,6 +1086,7 @@ void poweroff()
// }
}
#ifdef FEATURE_SERIAL_CONTROL
void parseCommand()
{
bool any_parsed{false};
@ -1126,10 +1144,10 @@ void parseCommand()
}
}
}
#endif
#ifdef FEATURE_SERIAL_FEEDBACK
void sendFeedback()
{
if (main_loop_counter % 50 == 0) // Send data periodically
{
#ifdef HUARN2
#define UART_DMA_CHANNEL DMA1_Channel7
@ -1138,8 +1156,9 @@ void sendFeedback()
#define UART_DMA_CHANNEL DMA1_Channel2
#endif
if (UART_DMA_CHANNEL->CNDTR == 0)
{
if (UART_DMA_CHANNEL->CNDTR != 0)
return;
feedback.start = Feedback::VALID_HEADER;
feedback.left.angle = left.rtY.a_elecAngle;
@ -1173,14 +1192,11 @@ void sendFeedback()
feedback.checksum = calculateChecksum(feedback);
UART_DMA_CHANNEL->CCR &= ~DMA_CCR_EN;
//UART_DMA_CHANNEL->CNDTR = sizeof(feedback);
//UART_DMA_CHANNEL->CMAR = uint64_t(&feedback);
UART_DMA_CHANNEL->CNDTR = 21;
UART_DMA_CHANNEL->CMAR = uint64_t((const char *)"Sending feedback...\r\n");
UART_DMA_CHANNEL->CNDTR = sizeof(feedback);
UART_DMA_CHANNEL->CMAR = uint64_t(&feedback);
UART_DMA_CHANNEL->CCR |= DMA_CCR_EN;
}
}
}
#endif
} // anonymous namespace