Improve sphinx
This commit is contained in:
parent
d6815f8285
commit
f6f01b0510
@ -38,7 +38,7 @@ PROJECT_NAME = "Reflow Oven Controller"
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = $(PROJECT_VERSION)
|
PROJECT_NUMBER =
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
@ -461,7 +461,7 @@ LOOKUP_CACHE_SIZE = 0
|
|||||||
# normally produced when WARNINGS is set to YES.
|
# normally produced when WARNINGS is set to YES.
|
||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
|
|
||||||
EXTRACT_ALL = NO
|
EXTRACT_ALL = YES
|
||||||
|
|
||||||
# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
|
# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
|
||||||
# be included in the documentation.
|
# be included in the documentation.
|
||||||
@ -485,7 +485,7 @@ EXTRACT_PACKAGE = NO
|
|||||||
# included in the documentation.
|
# included in the documentation.
|
||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
|
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = YES
|
||||||
|
|
||||||
# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
|
# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
|
||||||
# locally in source files will be included in the documentation. If set to NO,
|
# locally in source files will be included in the documentation. If set to NO,
|
||||||
|
3432
doc/source/_static/ibom.html
Normal file
3432
doc/source/_static/ibom.html
Normal file
File diff suppressed because one or more lines are too long
@ -38,6 +38,7 @@ subprocess.call('doxygen Doxyfile.in', shell=True)
|
|||||||
extensions = [
|
extensions = [
|
||||||
'sphinx_rtd_theme',
|
'sphinx_rtd_theme',
|
||||||
'sphinx.ext.autodoc',
|
'sphinx.ext.autodoc',
|
||||||
|
'sphinxcontrib.blockdiag',
|
||||||
'breathe'
|
'breathe'
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -71,3 +72,5 @@ breathe_domain_by_extension = { "h" : "c",
|
|||||||
breathe_default_project = "Reflow Controller Firmware"
|
breathe_default_project = "Reflow Controller Firmware"
|
||||||
breathe_default_members = ('members', 'undoc-members')
|
breathe_default_members = ('members', 'undoc-members')
|
||||||
|
|
||||||
|
blockdiag_html_image_format = 'SVG'
|
||||||
|
blockdiag_latex_image_format = 'PDF'
|
||||||
|
14
doc/source/firmware/flags.rst
Normal file
14
doc/source/firmware/flags.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.. _safety_flags:
|
||||||
|
|
||||||
|
Safety Flags
|
||||||
|
============
|
||||||
|
|
||||||
|
.. _safety_flags_adc_watchdog:
|
||||||
|
|
||||||
|
ERR_FLAG_MEAS_ADC_WATCHDOG
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. _safety_flags_adc_unstable:
|
||||||
|
|
||||||
|
ERR_FLAG_MEAS_ADC_UNSTABLE
|
||||||
|
--------------------------
|
16
doc/source/firmware/index.rst
Normal file
16
doc/source/firmware/index.rst
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
.. _firmware:
|
||||||
|
|
||||||
|
Reflow Controller Firmware Internals
|
||||||
|
====================================
|
||||||
|
|
||||||
|
This chapter describes the internals of the reflow controller's firmware.
|
||||||
|
This is in most cases not intended to be a code documentation but an overview over the functional
|
||||||
|
mechanisms and the behavior.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
pt1000-processing
|
||||||
|
safety
|
||||||
|
code/index
|
||||||
|
|
108
doc/source/firmware/pt1000-processing.rst
Normal file
108
doc/source/firmware/pt1000-processing.rst
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
.. _pt1000_processing:
|
||||||
|
|
||||||
|
PT1000 Temperature Value Processing
|
||||||
|
===================================
|
||||||
|
|
||||||
|
The PT1000 temperature sensor is the sensing element used for determining the Reflow Oven Temperature.
|
||||||
|
|
||||||
|
The PT1000 value processing is enabled by default and not intended to be turned off.
|
||||||
|
|
||||||
|
PT1000 Value Sampling
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The following block diagram shows the processing chain of the temperature signal.
|
||||||
|
|
||||||
|
.. blockdiag::
|
||||||
|
:desctable:
|
||||||
|
|
||||||
|
blockdiag {
|
||||||
|
orientation = portrait;
|
||||||
|
|
||||||
|
ADC[description="`Analog to Digital Converter <ADC_>`_"];
|
||||||
|
WATCHDOG [label = "WDT", shape=endpoint, description="`Hardware Value Watchdog <Watchdog_>`_"];
|
||||||
|
PREFILTER [label=Prefilter, description="`Prefiltering and Downsampling <Prefilter_>`_"];
|
||||||
|
ADC2RES [label= "Val -> Ohm", description="`Conversion from ADC value to resistance in Ohms <ADC Value to Ohm_>`_"]
|
||||||
|
MAVG [label="MAVG Filter", description="`Exponential Moving Average Filter`_"];
|
||||||
|
RAW_HF [label="HF", shape = endpoint, description="High Frequency raw value reading"];
|
||||||
|
PT1000 [label = "LF", shape = endpoint, description="Low Frequency PT1000 resistance value"]
|
||||||
|
RAW_STREAM [label = "Stream", shape = endpoint, description="Raw value streaming"];
|
||||||
|
|
||||||
|
ADC -> WATCHDOG;
|
||||||
|
ADC -> PREFILTER [label="1 kHz"];
|
||||||
|
PREFILTER -> ADC2RES [label="1/6 kHz"];
|
||||||
|
ADC2RES -> MAVG;
|
||||||
|
MAVG -> PT1000 [label="1/6 kHz"];
|
||||||
|
PREFILTER -> RAW_HF [label="1/6 kHz"];
|
||||||
|
PREFILTER -> RAW_STREAM [label="1/6 kHz"];
|
||||||
|
}
|
||||||
|
|
||||||
|
ADC
|
||||||
|
~~~
|
||||||
|
|
||||||
|
The internal ADC of the STM32F407 controller is used to sample the analog signal from the :ref:`hw_analog_fe`. The ADC is triggered by the hardware Timer *TIM2* each millisecond, which results in a sampling frequency of
|
||||||
|
1 kHz. The ADC module provides an analog value `watchdog <Watchdog_>`_, which is used to detect wirebreaks and other hardware errors that result in a wrong resistance measurement.
|
||||||
|
|
||||||
|
The sample frequency is controlled by
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_PT1000_SAMPLE_CNT_DELAY
|
||||||
|
|
||||||
|
whereas the ADC Peripheral module is defined by
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_PT1000_PERIPH
|
||||||
|
|
||||||
|
Prefilter
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
The analog value prefilter is used to filter outliers. It is triggered after a certain amount *n* of values have been sampled by the `ADC`_.
|
||||||
|
The filter then removes the two most extreme values and computes the average of the remaining *n-2* values.
|
||||||
|
|
||||||
|
The resulting datastream has a sampling rate of 1/6 kHz.
|
||||||
|
|
||||||
|
|
||||||
|
Watchdog
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
The analog watchdog supervises the measured value of the `ADC`_. It is configured by the following defines:
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_PT1000_LOWER_WATCHDOG
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_PT1000_UPPER_WATCHDOG
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_PT1000_WATCHDOG_SAMPLE_COUNT
|
||||||
|
|
||||||
|
The watchdog will set the :ref:`safety_flags_adc_watchdog` error flag.
|
||||||
|
|
||||||
|
ADC Value to Ohm
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This block converts the analog value to an Ohm resistance value.
|
||||||
|
The formula is:
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
R(V) = \frac{V}{4096} \cdot 2500~\Omega
|
||||||
|
|
||||||
|
The equation is implemented in
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_TO_RES
|
||||||
|
|
||||||
|
and applied during the `Exponential Moving Average Filter`_.
|
||||||
|
|
||||||
|
Exponential Moving Average Filter
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The external moving average filter filters the measured resistance value. It's equation is:
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
y[n] = (1-\alpha) y[n-1] + \alpha x[n]
|
||||||
|
|
||||||
|
The filter constant *alpha* defaults to the define
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_PT1000_FILTER_WEIGHT
|
||||||
|
|
||||||
|
and can be changed in code using
|
||||||
|
|
||||||
|
.. doxygenfunction:: adc_pt1000_set_moving_average_filter_param
|
||||||
|
|
||||||
|
After initial startup and after each change of the filter constant, the filter will set the :ref:`safety_flags_adc_unstable` flag for a defined sample count of:
|
||||||
|
|
||||||
|
.. doxygendefine:: ADC_FILTER_STARTUP_CYCLES
|
12
doc/source/firmware/safety.rst
Normal file
12
doc/source/firmware/safety.rst
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
.. _firmware_safety:
|
||||||
|
|
||||||
|
Safety Controller
|
||||||
|
=================
|
||||||
|
|
||||||
|
The safety controller is the software component that monitors the overall condition of the reflow controller,
|
||||||
|
and stops the output driver in case of an error.
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
flags
|
8
doc/source/hardware/controller-bom.rst
Normal file
8
doc/source/hardware/controller-bom.rst
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
.. _hw_bom:
|
||||||
|
|
||||||
|
Interactive BoM of Controller Board
|
||||||
|
===================================
|
||||||
|
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<iframe src="../_static/ibom.html" width="100%" height="1500"></iframe>
|
4
doc/source/hardware/frontend.rst
Normal file
4
doc/source/hardware/frontend.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.. _hw_analog_fe:
|
||||||
|
|
||||||
|
Analog Frontend
|
||||||
|
===============
|
10
doc/source/hardware/index.rst
Normal file
10
doc/source/hardware/index.rst
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.. _hw:
|
||||||
|
|
||||||
|
Hardware
|
||||||
|
========
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
*
|
@ -16,4 +16,5 @@ Quick Links
|
|||||||
:caption: Contents
|
:caption: Contents
|
||||||
|
|
||||||
self
|
self
|
||||||
api/index
|
hardware/index
|
||||||
|
firmware/index
|
||||||
|
@ -18,6 +18,11 @@
|
|||||||
* If not, see <http://www.gnu.org/licenses/>.
|
* If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file adc-meas.c
|
||||||
|
* @brief Implementation of the PT1000 measurement ADC and filtering functions
|
||||||
|
*/
|
||||||
|
|
||||||
#include <reflow-controller/adc-meas.h>
|
#include <reflow-controller/adc-meas.h>
|
||||||
#include <stm32/stm32f4xx.h>
|
#include <stm32/stm32f4xx.h>
|
||||||
#include <cmsis/core_cm4.h>
|
#include <cmsis/core_cm4.h>
|
||||||
@ -30,7 +35,13 @@ static float pt1000_offset;
|
|||||||
static float pt1000_sens_dev;
|
static float pt1000_sens_dev;
|
||||||
static bool calibration_active;
|
static bool calibration_active;
|
||||||
static float filter_alpha;
|
static float filter_alpha;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Filtered PT1000 resistance value.
|
||||||
|
* @note This value is not yet calibrated. Use @ref adc_pt1000_get_current_resistance to get this value with calibration.
|
||||||
|
*/
|
||||||
static volatile float pt1000_res_raw_lf;
|
static volatile float pt1000_res_raw_lf;
|
||||||
|
|
||||||
static volatile int * volatile streaming_flag_ptr = NULL;
|
static volatile int * volatile streaming_flag_ptr = NULL;
|
||||||
static uint32_t filter_startup_cnt;
|
static uint32_t filter_startup_cnt;
|
||||||
static volatile float adc_pt1000_raw_reading_hf;
|
static volatile float adc_pt1000_raw_reading_hf;
|
||||||
@ -41,6 +52,9 @@ volatile float * volatile stream_buffer = NULL;
|
|||||||
volatile uint32_t stream_count;
|
volatile uint32_t stream_count;
|
||||||
volatile uint32_t stream_pos;
|
volatile uint32_t stream_pos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Conversion macro: ADC value to resistance
|
||||||
|
*/
|
||||||
#define ADC_TO_RES(adc) ((float)(adc) / 4096.0f * 2500.0f)
|
#define ADC_TO_RES(adc) ((float)(adc) / 4096.0f * 2500.0f)
|
||||||
|
|
||||||
static inline void adc_pt1000_stop_sample_frequency_timer()
|
static inline void adc_pt1000_stop_sample_frequency_timer()
|
||||||
|
@ -18,6 +18,10 @@
|
|||||||
* If not, see <http://www.gnu.org/licenses/>.
|
* If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file adc-meas.h
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef __ADCMEAS_H__
|
#ifndef __ADCMEAS_H__
|
||||||
#define __ADCMEAS_H__
|
#define __ADCMEAS_H__
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user