start firmware: Function definitions for ADC
This commit is contained in:
		
							
								
								
									
										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() {
 | 
			
		||||
		Reference in New Issue
	
	Block a user