mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
PID retune, ADC Blocks PID properly
This commit is contained in:
@@ -27,8 +27,8 @@ osThreadId GUITaskHandle;
|
||||
osThreadId PIDTaskHandle;
|
||||
osThreadId ROTTaskHandle;
|
||||
osThreadId MOVTaskHandle;
|
||||
SemaphoreHandle_t rotationChangedSemaphore = NULL;
|
||||
SemaphoreHandle_t accelDataAvailableSemaphore = NULL;
|
||||
|
||||
static TaskHandle_t pidTaskNotification = NULL;
|
||||
|
||||
void startGUITask(void const *argument);
|
||||
void startPIDTask(void const *argument);
|
||||
@@ -62,7 +62,7 @@ int main(void) {
|
||||
PCBVersion = 3;
|
||||
systemSettings.SleepTime = 0;
|
||||
systemSettings.ShutdownTime = 0; //No accel -> disable sleep
|
||||
systemSettings.sensitivity=0;
|
||||
systemSettings.sensitivity = 0;
|
||||
}
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
restoreSettings(); // load the settings from flash
|
||||
@@ -85,11 +85,7 @@ int main(void) {
|
||||
osThreadDef(MOVTask, startMOVTask, osPriorityNormal, 0, 512); //2k
|
||||
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
|
||||
}
|
||||
/* Create the objects*/
|
||||
rotationChangedSemaphore = xSemaphoreCreateBinary();
|
||||
// Used to unlock rotation thread
|
||||
accelDataAvailableSemaphore = xSemaphoreCreateBinary();
|
||||
// Used to unlock the movement thread
|
||||
|
||||
/* Start scheduler */
|
||||
osKernelStart();
|
||||
|
||||
@@ -98,7 +94,7 @@ int main(void) {
|
||||
}
|
||||
}
|
||||
void GUIDelay() {
|
||||
osDelay(50); // 20Hz
|
||||
osDelay(66); // 15Hz
|
||||
}
|
||||
void gui_drawTipTemp() {
|
||||
// Draw tip temp handling unit conversion & tolerance near setpoint
|
||||
@@ -762,7 +758,7 @@ void startGUITask(void const *argument) {
|
||||
|
||||
currentlyActiveTemperatureTarget = 0; // ensure tip is off
|
||||
|
||||
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(1));//This forces a faster update rate on the filtering
|
||||
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(1)); //This forces a faster update rate on the filtering
|
||||
|
||||
if (tipTemp < 50) {
|
||||
|
||||
@@ -854,17 +850,20 @@ void startPIDTask(void const *argument) {
|
||||
int32_t kp, ki, kd;
|
||||
kp = 40;
|
||||
ki = 60;
|
||||
kd = 20;
|
||||
kd = 15;
|
||||
// REMEBER ^^^^ These constants are backwards
|
||||
// They act as dividers, so to 'increase' a P term, you make the number
|
||||
// smaller.
|
||||
if(getInputVoltageX10(systemSettings.voltageDiv) < 150)
|
||||
{
|
||||
if (getInputVoltageX10(systemSettings.voltageDiv) < 150) {
|
||||
//Boot P term if < 15 Volts
|
||||
kp=30;
|
||||
kp = 30;
|
||||
}
|
||||
const int32_t itermMax = 100;
|
||||
pidTaskNotification = xTaskGetCurrentTaskHandle();
|
||||
uint32_t ulNotificationValue;
|
||||
for (;;) {
|
||||
ulNotificationValue = ulTaskNotifyTake( pdTRUE, 100);//Wait a max of 100ms
|
||||
//This is a call to block this thread until the ADC does its samples
|
||||
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
|
||||
if (currentlyActiveTemperatureTarget) {
|
||||
// Compute the PID loop in here
|
||||
@@ -900,9 +899,9 @@ void startPIDTask(void const *argument) {
|
||||
output = 0;
|
||||
}
|
||||
|
||||
if (currentlyActiveTemperatureTarget < rawTemp) {
|
||||
/*if (currentlyActiveTemperatureTarget < rawTemp) {
|
||||
output = 0;
|
||||
}
|
||||
}*/
|
||||
setTipPWM(output);
|
||||
derivativeLastValue = rawTemp; // store for next loop
|
||||
|
||||
@@ -914,12 +913,11 @@ void startPIDTask(void const *argument) {
|
||||
}
|
||||
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
osDelay(10); // 100 Hz temp loop
|
||||
}
|
||||
}
|
||||
#define MOVFilter 8
|
||||
void startMOVTask(void const *argument) {
|
||||
osDelay(4000); // wait for accel to stabilize
|
||||
osDelay(250); // wait for accelerometer to stabilize
|
||||
lastMovementTime = 0;
|
||||
int16_t datax[MOVFilter];
|
||||
int16_t datay[MOVFilter];
|
||||
@@ -936,10 +934,6 @@ void startMOVTask(void const *argument) {
|
||||
uint32_t max = 0;
|
||||
#endif
|
||||
|
||||
if (PCBVersion == 3) {
|
||||
for (;;)
|
||||
osDelay(5000);
|
||||
}
|
||||
for (;;) {
|
||||
int32_t threshold = 1500 + (9 * 200);
|
||||
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
|
||||
@@ -1009,10 +1003,6 @@ void startRotationTask(void const *argument) {
|
||||
* This task is used to manage rotation of the LCD screen & button re-mapping
|
||||
*
|
||||
*/
|
||||
if (PCBVersion == 3) {
|
||||
for (;;)
|
||||
osDelay(5000);
|
||||
}
|
||||
switch (systemSettings.OrientationMode) {
|
||||
case 0:
|
||||
lcd.setRotation(false);
|
||||
@@ -1026,7 +1016,7 @@ void startRotationTask(void const *argument) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
osDelay(500); // wait for accel to stabilize
|
||||
osDelay(250); // wait for accel to stabilize
|
||||
|
||||
for (;;) {
|
||||
|
||||
@@ -1077,3 +1067,18 @@ bool showBootLogoIfavailable() {
|
||||
lcd.refresh();
|
||||
return true;
|
||||
}
|
||||
|
||||
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) {
|
||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||
|
||||
if (pidTaskNotification) {
|
||||
/* Notify the task that the transmission is complete. */
|
||||
vTaskNotifyGiveFromISR(pidTaskNotification, &xHigherPriorityTaskWoken);
|
||||
|
||||
/* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch
|
||||
should be performed to ensure the interrupt returns directly to the highest
|
||||
priority task. The macro used for this purpose is dependent on the port in
|
||||
use and may be called portEND_SWITCHING_ISR(). */
|
||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user