start firmware: Function definitions for ADC
This commit is contained in:
parent
6da5288d90
commit
e091ccf19c
8
stm-firmware/.gitignore
vendored
8
stm-firmware/.gitignore
vendored
@ -1,2 +1,10 @@
|
||||
*.jdebug
|
||||
*.jdebug.user
|
||||
|
||||
reflow-controller.cflags
|
||||
reflow-controller.config
|
||||
reflow-controller.creator
|
||||
reflow-controller.cxxflags
|
||||
reflow-controller.files
|
||||
reflow-controller.includes
|
||||
*.creator.user
|
||||
|
@ -3,16 +3,16 @@
|
||||
#Compiler: arm-none-eabi
|
||||
#####################################################################################
|
||||
#Add Files and Folders below#########################################################
|
||||
CFILES = main.c syscalls.c UART/uart.c cmsis_boot/system_stm32f4xx.c
|
||||
CFILES = main.c syscalls.c uart/uart.c cmsis_boot/system_stm32f4xx.c systick.c
|
||||
ASFILES = boot/startup_stm32f4xx.S
|
||||
INCLUDEPATH = -Iboot -Imathlib -Icmsis -Icmsis_boot -IUART
|
||||
INCLUDEPATH = -Icmsis -Iinclude
|
||||
|
||||
OBJDIR = obj
|
||||
target = reflow-controller
|
||||
LIBRARYPATH = -L. -Lmathlib
|
||||
LIBRARIES = # -larm_cortexM4lf_math
|
||||
|
||||
DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4
|
||||
DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL
|
||||
mapfile = memory-mapping
|
||||
|
||||
ifneq ($(VERBOSE),true)
|
||||
|
2
stm-firmware/adc-meas.c
Normal file
2
stm-firmware/adc-meas.c
Normal file
@ -0,0 +1,2 @@
|
||||
#include <adc-meas.h>
|
||||
|
97
stm-firmware/include/adc-meas.h
Normal file
97
stm-firmware/include/adc-meas.h
Normal file
@ -0,0 +1,97 @@
|
||||
#ifndef __ADCMEAS_H__
|
||||
#define __ADCMEAS_H__
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define ADC_PT1000_FILTER_WEIGHT 0.005f
|
||||
|
||||
#define ADC_PT1000_LOWER_WATCHDOG 100
|
||||
#define ADC_PT1000_HIGHER_WATCHDOG 4000
|
||||
|
||||
enum adc_p1000_error {ADC_PT1000_NO_ERR= 0, ADC_PT1000_WATCHDOG_ERROR=-1, ADC_PT1000_OVERFLOW=2};
|
||||
|
||||
/**
|
||||
* @brief This function sets up the ADC measurement fo the external PT1000 temperature sensor
|
||||
*
|
||||
* Used peripherals:
|
||||
* - Timer 2 for sampling control
|
||||
* - ADC1
|
||||
*
|
||||
* The filter weight \f$\alpha\f$ is configured for @ref ADC_PT1000_FILTER_WEIGHT
|
||||
*
|
||||
*/
|
||||
void adc_pt1000_setup_meas();
|
||||
|
||||
/**
|
||||
* @brief Set moving average filter parameters
|
||||
*
|
||||
* The sampled resistance value is filtered with an exponential average filter
|
||||
* specified by following difference equation:
|
||||
*
|
||||
* \f$ y[n] = (1-\alpha)y[n-1] + \alpha x[n] \f$
|
||||
*
|
||||
* @param alpha
|
||||
*/
|
||||
void adc_pt1000_set_moving_average_filter_param(float alpha);
|
||||
|
||||
/**
|
||||
* @brief Set the calibration data for the PT1000 measurement
|
||||
*
|
||||
* The resulting resistance reading is
|
||||
* \f$R_{corrected} = \sigma R_{raw} + O\f$
|
||||
*
|
||||
* @param offset Offset \f$O\f$
|
||||
* @param sensitivity_deviation Sensitivity Deviation \f$\sigma\f$ after offset correction
|
||||
*/
|
||||
void adc_pt1000_set_resistance_calibration(float offset, float sensitivity_deviation, bool active);
|
||||
|
||||
/**
|
||||
* @brief Get the state and values of the resistance calibration
|
||||
* @param offset Offset
|
||||
* @param sensitivity_deviation Sensitivity deviation
|
||||
* @param active Active state of the correction
|
||||
*/
|
||||
void adc_pt1000_get_resistance_calibration(float *offset, float *sensitivity_deviation, bool *active);
|
||||
|
||||
/**
|
||||
* @brief Get the current reistance value
|
||||
*
|
||||
* If the reistance calibration is enabled, this function applies the calculations of the raw reistance reading and
|
||||
* returns the corrected value.
|
||||
*
|
||||
* If an ADC error is set, the status is negative. If the ADC is in streaming mode, the reistance reading is disabled and
|
||||
* the status is 1. The status is 2 during the first measurements with a given filter setting. Technically, the resistance value is
|
||||
* correct but the filter is not stable yet.
|
||||
* Use adc_pt1000_check_error to check the error and reinitialize the ADC.
|
||||
*
|
||||
*
|
||||
* @param[out] resistance Resistance output in Ohms
|
||||
* @return Status
|
||||
*/
|
||||
int adc_pt1000_get_current_resistance(float *resistance);
|
||||
|
||||
/**
|
||||
* @brief Stream the raw ADC data to an array in memory.
|
||||
*
|
||||
* Streaming is done using DMA2 Stream0.
|
||||
* This function is used for gathering fullspeed sampling data for external interfaces or calibration
|
||||
* During streaming, the adc_pt1000_get_current_resistance() function will return an error
|
||||
*
|
||||
* @param adc_array Array to stream data to
|
||||
* @param length Amount of data points to be measured
|
||||
* @param flag_to_set This flag is set to 1 once the data has been measured and is transferred. A negative value indicates an error
|
||||
* @return 0 if measurement could be started
|
||||
*/
|
||||
int adc_pt1000_stream_raw_value_to_memory(uint16_t *adc_array, uint32_t length, volatile uint8_t *flag_to_set);
|
||||
|
||||
void adc_pt1000_convert_raw_value_array_to_resistance(float *resistance_dest, uint16_t *raw_source, uint32_t count);
|
||||
|
||||
/**
|
||||
* @brief Check if the ADC measurement experienced any kind of error (DMA, Analog Watchdog, etc...)
|
||||
*
|
||||
* In case of an error, it may be necessary to call adc_pt1000_setup_meas() again in order to recover from the error
|
||||
*/
|
||||
enum adc_p1000_error adc_pt1000_check_error();
|
||||
|
||||
#endif // __ADCMEAS_H__
|
7306
stm-firmware/include/arm_math.h
Normal file
7306
stm-firmware/include/arm_math.h
Normal file
File diff suppressed because it is too large
Load Diff
43
stm-firmware/include/systick.h
Normal file
43
stm-firmware/include/systick.h
Normal file
@ -0,0 +1,43 @@
|
||||
#ifndef __SYSTICK_H__
|
||||
#define __SYSTICK_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @brief Reload value for the systick timer.
|
||||
*
|
||||
* This value has to be configured to set the systick to a one milliscond tick interval
|
||||
* The default value is 168000, which results in a 1ms tick for 168 MHz CPU speed
|
||||
*/
|
||||
#define SYSTICK_RELOAD (168000UL)
|
||||
|
||||
/**
|
||||
* @brief Variable used by the systick_wait_ms function
|
||||
*/
|
||||
extern volatile uint32_t wait_tick_ms;
|
||||
|
||||
/**
|
||||
* @brief Systemclock in milliseconds.
|
||||
*
|
||||
* This value must not be reset during the whole runtime.
|
||||
*
|
||||
*/
|
||||
extern volatile uint64_t global_tick_ms;
|
||||
|
||||
/**
|
||||
* @brief Setup the Systick timer to generate a 1 ms tick
|
||||
*/
|
||||
void systick_setup(void);
|
||||
|
||||
/**
|
||||
* @brief Wait for x milliseconds
|
||||
*
|
||||
* This function is not reentrant and must not be called from an interrupt
|
||||
*
|
||||
* @warning Do not use in interrupt context
|
||||
* @param ms wait time in ms
|
||||
*/
|
||||
void systick_wait_ms(uint32_t ms);
|
||||
|
||||
|
||||
#endif /* __SYSTICK_H__ */
|
@ -5,10 +5,11 @@
|
||||
* Author: mari
|
||||
*/
|
||||
#include <stm32f4xx.h>
|
||||
#include <systick.h>
|
||||
//#include <arm_math.h>
|
||||
#include <system_stm32f4xx.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define OUTPUT(pin) (0b01 << (pin * 2))
|
||||
#define ANALOG(pin) (0x03 << (pin * 2))
|
||||
@ -34,9 +35,14 @@ void DMA2_Stream0_IRQHandler()
|
||||
DMA2->LIFCR = lisr;
|
||||
|
||||
if (lisr & DMA_LISR_TCIF0) {
|
||||
if (new_data)
|
||||
new_data = 2;
|
||||
new_data = 1;
|
||||
sample_count++;
|
||||
|
||||
GPIOB->ODR ^= (1<<3);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void setup_dma(void *dest, size_t size)
|
||||
@ -63,11 +69,16 @@ float vdd_calculated = 3.3f;
|
||||
|
||||
float vbat_lf_corr;
|
||||
|
||||
|
||||
|
||||
static void setup_timers(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
struct adc_conversions working;
|
||||
|
||||
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
|
||||
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
|
||||
@ -75,7 +86,6 @@ int main() {
|
||||
GPIOB->MODER = OUTPUT(2) | OUTPUT(3);
|
||||
GPIOA->MODER |= ANALOG(2);
|
||||
GPIOB->ODR |= (1<<2);
|
||||
SysTick_Config(8*1680000);
|
||||
|
||||
ADC1->SMPR2 = (7U<<(3*2));
|
||||
ADC1->SMPR1 = (7U<<18) | (7U<<21) | (7U<<24);
|
||||
@ -88,21 +98,24 @@ int main() {
|
||||
|
||||
//while(1);
|
||||
|
||||
systick_setup();
|
||||
|
||||
setup_dma(&adc_results, 3);
|
||||
|
||||
ADC1->CR2 |= ADC_CR2_SWSTART;
|
||||
|
||||
while(1) {
|
||||
if (!new_data)
|
||||
if (!new_data) {
|
||||
continue;
|
||||
}
|
||||
|
||||
new_data = 0;
|
||||
|
||||
memcpy(&working, &adc_results, sizeof(adc_results));
|
||||
new_data = 0;
|
||||
//ref_lf = 0.995f * ref_lf + 0.005f * (float)working.ref_raw;
|
||||
//vdd_calculated = ((1.21f * 4096)/ ref_lf);
|
||||
|
||||
ref_lf = 0.995f * ref_lf + 0.005f * (float)working.ref_raw;
|
||||
vdd_calculated = ((1.21f * 4096)/ ref_lf);
|
||||
|
||||
temp_lf_corr = 0.99f * temp_lf_corr + 0.01 * (float)working.temp_raw * vdd_calculated / 2.495f;
|
||||
//temp_lf_corr = 0.99f * temp_lf_corr + 0.01 * (float)working.temp_raw * vdd_calculated / 2.495f;
|
||||
ext_lf_corr = 0.995f * ext_lf_corr + 0.005f * (float)working.pa2_raw / 4096 * 2500.0f; // * vdd_calculated / 2.495f;
|
||||
|
||||
//vbat_lf_corr = 0.99 * vbat_lf_corr + 0.01 * (float)working.vbat_raw / 4096 * vdd_calculated * 2.0f;
|
||||
@ -110,7 +123,4 @@ int main() {
|
||||
|
||||
}
|
||||
|
||||
void SysTick_Handler()
|
||||
{
|
||||
GPIOB->ODR ^= (1<<2) | (1<<3);
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,4 @@
|
||||
/*
|
||||
* syscalls.c
|
||||
*
|
||||
* Created on: Dec 14, 2014
|
||||
* Author: shino-chan
|
||||
*/
|
||||
|
||||
#include "uart.h"
|
||||
#include <uart/uart.h>
|
||||
|
||||
char* _sbrk(int incr) {
|
||||
extern char heap_low; // Defined by the linker
|
||||
|
40
stm-firmware/systick.c
Normal file
40
stm-firmware/systick.c
Normal file
@ -0,0 +1,40 @@
|
||||
#include <systick.h>
|
||||
#include <stm32f4xx.h>
|
||||
#include <core_cm4.h>
|
||||
|
||||
volatile uint32_t wait_tick_ms;
|
||||
volatile uint64_t global_tick_ms;
|
||||
|
||||
void systick_setup(void)
|
||||
{
|
||||
/* Setup Systick for 1ms tick @ 168 MHz Clock Speed */
|
||||
SysTick_Config(SYSTICK_RELOAD);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Wait for x milliseconds
|
||||
*
|
||||
* This function is not reentrant and must not be called from an interrupt
|
||||
*
|
||||
* @warning Do not use in interrupt context
|
||||
* @param ms wait time in ms
|
||||
*/
|
||||
void systick_wait_ms(uint32_t ms)
|
||||
{
|
||||
wait_tick_ms = 0UL;
|
||||
while (wait_tick_ms < ms);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Interrupt Handler for SysTick
|
||||
*
|
||||
* This handler is called every millisecond
|
||||
*
|
||||
* @warning For calling cyclic functions use separate timers/flags and don't spoil this function
|
||||
*/
|
||||
void SysTick_Handler()
|
||||
{
|
||||
/* Increase tick counters */
|
||||
wait_tick_ms++;
|
||||
global_tick_ms++;
|
||||
}
|
@ -8,7 +8,7 @@
|
||||
//PA2 => TX
|
||||
//PA3 => RX
|
||||
//Alternate Function 7
|
||||
#include "uart.h"
|
||||
#include <uart/uart.h>
|
||||
#include <stm32f4xx.h>
|
||||
|
||||
void initUART() {
|
Loading…
Reference in New Issue
Block a user