diff options
-rw-r--r-- | workspace/TS100/.settings/language.settings.xml | 4 | ||||
-rw-r--r-- | workspace/TS100/inc/main.hpp | 8 | ||||
-rw-r--r-- | workspace/TS100/src/Setup.c | 9 | ||||
-rw-r--r-- | workspace/TS100/src/hardware.c | 52 | ||||
-rw-r--r-- | workspace/TS100/src/main.cpp | 59 |
5 files changed, 59 insertions, 73 deletions
diff --git a/workspace/TS100/.settings/language.settings.xml b/workspace/TS100/.settings/language.settings.xml index 3174fb8a..1765bf7f 100644 --- a/workspace/TS100/.settings/language.settings.xml +++ b/workspace/TS100/.settings/language.settings.xml @@ -6,7 +6,7 @@ <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
- <provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="1750838549288477430" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
+ <provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="1349131645423570210" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@@ -18,7 +18,7 @@ <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
- <provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="1750838549288477430" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
+ <provider class="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" console="false" env-hash="1349131645423570210" id="fr.ac6.mcu.ide.build.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="Ac6 SW4 STM32 MCU Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
diff --git a/workspace/TS100/inc/main.hpp b/workspace/TS100/inc/main.hpp index 3e522de0..91ebaa86 100644 --- a/workspace/TS100/inc/main.hpp +++ b/workspace/TS100/inc/main.hpp @@ -25,5 +25,11 @@ enum ButtonState { ButtonState getButtonState(); void waitForButtonPressOrTimeout(uint32_t timeout); - +#ifdef __cplusplus + extern "C" { +#endif + void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc); +#ifdef __cplusplus + } +#endif #endif /* __MAIN_H */ diff --git a/workspace/TS100/src/Setup.c b/workspace/TS100/src/Setup.c index 7f5a450b..d3ab5c9d 100644 --- a/workspace/TS100/src/Setup.c +++ b/workspace/TS100/src/Setup.c @@ -134,11 +134,12 @@ static void MX_ADC1_Init(void) { sConfigInjected.InjectedChannel = ADC_CHANNEL_8; sConfigInjected.InjectedRank = 1; sConfigInjected.InjectedNbrOfConversion = 4; - sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_13CYCLES_5; + sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_7CYCLES_5; sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T2_CC1; sConfigInjected.AutoInjectedConv = DISABLE; sConfigInjected.InjectedDiscontinuousConvMode = DISABLE; sConfigInjected.InjectedOffset = 0; + HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); sConfigInjected.InjectedRank = 2; HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); @@ -146,14 +147,14 @@ static void MX_ADC1_Init(void) { HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); sConfigInjected.InjectedRank = 4; HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected); - //SET_BIT(hadc1.Instance->CR1, ( ADC_CR1_JEOCIE ));//Enable end of injected conv irq + SET_BIT(hadc1.Instance->CR1, ( ADC_CR1_JEOCIE ));//Enable end of injected conv irq } /* I2C1 init function */ static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; - hi2c1.Init.ClockSpeed = 300000; //200Khz + hi2c1.Init.ClockSpeed = 300000; //300Khz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; @@ -256,7 +257,7 @@ static void MX_TIM2_Init(void) { /* * It takes 4 milliseconds for output to be stable after PWM turns off. * Assume ADC samples in 0.5ms - * We need to set this to 100% + 4.5ms + * We need to set this to 100% + 5.5ms * */ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; diff --git a/workspace/TS100/src/hardware.c b/workspace/TS100/src/hardware.c index 84359c11..37955e70 100644 --- a/workspace/TS100/src/hardware.c +++ b/workspace/TS100/src/hardware.c @@ -60,35 +60,17 @@ uint16_t getTipInstantTemperature() { } uint16_t getTipRawTemp(uint8_t instant) { -#define filterDepth1 1 - /*Pre filter used before PID*/ -#define filterDepth2 48 - /*Post filter used for UI display*/ - static uint16_t filterLayer1[filterDepth1]; - static uint16_t filterLayer2[filterDepth2]; - static uint8_t index = 0; - static uint8_t indexFilter = 0; + static int64_t filterFP = 0; + const uint8_t filterBeta = 5; //higher values smooth out more, but reduce responsiveness if (instant) { uint16_t itemp = getTipInstantTemperature(); - filterLayer1[index] = itemp; - index = (index + 1) % filterDepth1; - uint32_t total = 0; - for (uint8_t i = 0; i < filterDepth1; i++) - total += filterLayer1[i]; - - return total / filterDepth1; + filterFP = (filterFP << filterBeta) - filterFP; + filterFP += (itemp << 9); + filterFP = filterFP >> filterBeta; + return itemp; } else { - uint32_t total = 0; - for (uint8_t i = 0; i < filterDepth1; i++) - total += filterLayer1[i]; - filterLayer2[indexFilter] = total / filterDepth1; - indexFilter = (indexFilter + 1) % filterDepth2; - total = 0; - for (uint8_t i = 0; i < filterDepth2; i++) - total += filterLayer2[i]; - - return total / filterDepth2; + return filterFP >> 9; } } uint16_t getInputVoltageX10(uint8_t divisor) { @@ -120,15 +102,10 @@ uint8_t getTipPWM() { return htim2.Instance->CCR4; } void setTipPWM(uint8_t pulse) { - PWMSafetyTimer = 640; //This is decremented in the handler for PWM so that the tip pwm is disabled if the PID task is not scheduled often enough. + PWMSafetyTimer = 2; //This is decremented in the handler for PWM so that the tip pwm is disabled if the PID task is not scheduled often enough. if (pulse > 100) pulse = 100; - if (pulse) { - htim2.Instance->CCR4 = pulse; - } else { - htim2.Instance->CCR4 = 0; - } - + htim2.Instance->CCR4 = pulse; } //Thse are called by the HAL after the corresponding events from the system timers. @@ -138,7 +115,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { //we want to turn on the output again PWMSafetyTimer--; //We decrement this safety value so that lockups in the scheduler will not cause the PWM to become locked in an active driving state. - //While we could assume this could never happened, its a small price for increased safety + //While we could assume this could never happen, its a small price for increased safety if (htim2.Instance->CCR4 && PWMSafetyTimer) { htim3.Instance->CCR1 = 50; HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); @@ -159,12 +136,9 @@ void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { htim3.Instance->CCR1 = 0; } /*else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET); - }*/ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET); + }*/ } } -void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) { - -} diff --git a/workspace/TS100/src/main.cpp b/workspace/TS100/src/main.cpp index a32de0ad..acb7a467 100644 --- a/workspace/TS100/src/main.cpp +++ b/workspace/TS100/src/main.cpp @@ -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); + } +} |