Advanced Distributed Systems module at HSLU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

84 lines
2.2 KiB

/**
* \file
* \brief This is the interface to PID Module
* \author Erich Styger, erich.styger@hslu.ch
* \license SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef PID_H_
#define PID_H_
#include "platform.h"
#if PL_CONFIG_USE_PID
#include <stdint.h>
typedef enum {
PID_CONFIG_LINE_FW,
PID_CONFIG_LINE_BW,
PID_CONFIG_POS_LEFT,
PID_CONFIG_POS_RIGHT,
PID_CONFIG_SPEED_LEFT,
PID_CONFIG_SPEED_RIGHT
} PID_ConfigType;
typedef struct {
int32_t pFactor100;
int32_t iFactor100;
int32_t dFactor100;
int32_t iAntiWindup;
uint8_t maxSpeedPercent; /* max speed if 100% on the line, 0xffff would be full speed */
int32_t lastError;
int32_t integral;
} PID_Config;
uint8_t PID_GetPIDConfig(PID_ConfigType config, PID_Config **confP);
#if PL_CONFIG_USE_SHELL
#include "McuShell.h"
/*!
* \brief Shell command line parser.
* \param[in] cmd Pointer to command string
* \param[out] handled If command is handled by the parser
* \param[in] io Std I/O handler of shell
*/
uint8_t PID_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io);
#endif
/*!
* \brief Performs PID on a line
* \param currLinePos Current line position
* \param setLinePos Desired line position
* \param currLineWidth Indication of line width (in 1000er units for a line)
* \param forward If we are moving forward or backward
*/
void PID_Line(uint16_t currLinePos, uint16_t setLinePos, uint16_t currLineWidth, bool forward);
/*!
* \brief Performs PID closed loop calculation for the speed
* \param currSpeed Current speed of motor
* \param setSpeed desired speed of motor
* \param isLeft TRUE if is for the left motor, otherwise for the right motor
*/
void PID_Speed(int32_t currSpeed, int32_t setSpeed, bool isLeft);
/*!
* \brief Performs PID closed loop calculation for the line position
* \param currPos Current position of wheel
* \param setPos Desired wheel position
* \param isLeft TRUE if is for the left wheel, otherwise for the right wheel
*/
void PID_Pos(int32_t currPos, int32_t setPos, bool isLeft);
/*! \brief Driver initialization */
void PID_Start(void);
/*! \brief Driver initialization */
void PID_Init(void);
/*! \brief Driver de-initialization */
void PID_Deinit(void);
#endif /* PL_CONFIG_USE_PID */
#endif /* PID_H_ */