view Small_CPU/Src/adc.c @ 634:7c73f066cd16

Enable sensor check for Analog PPO2 mode: Checks which may trigger a fallback warning were not activated in previous versions. Beside enabling the checks the test logic has been changed. Before the change an avarage was build automatically using the remaining both sensors if one sensor failed. The scenario that also one of the remaining sensors may be out of bounds was not covered. The new implementation allows an out of bounds detection for all sensors in parallel. In that special case the last valid value will be used until the diver takes action (Fallback warning)
author Ideenmodellierer
date Wed, 24 Feb 2021 19:18:26 +0100
parents 5f11787b4f42
children
line wrap: on
line source

/**
  ******************************************************************************
  * @file    adc.c 
  * @author  heinrichs weikamp gmbh
  * @version V0.0.1
  * @date    11-Dec-2014
  * @brief   ADC for ambient light sensor
  *           
  @verbatim                 
  ============================================================================== 
                        ##### How to use #####
  ============================================================================== 
  @endverbatim
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT(c) 2014 heinrichs weikamp</center></h2>
  *
  ******************************************************************************
  */ 

/* Includes ------------------------------------------------------------------*/

#include "stm32f4xx_hal.h"
#include "adc.h"

/* Exported variables --------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
	ADC_HandleTypeDef    AdcHandle;
__IO uint16_t uhADCxConvertedValue = 0;

/* Private types -------------------------------------------------------------*/
#define ADCx                            ADC1
#define ADCx_CLK_ENABLE()               __ADC1_CLK_ENABLE();
#define ADCx_CHANNEL_GPIO_CLK_ENABLE()  __GPIOF_CLK_ENABLE()
     
#define ADCx_FORCE_RESET()              __ADC_FORCE_RESET()
#define ADCx_RELEASE_RESET()            __ADC_RELEASE_RESET()

/* Definition for ADCx Channel Pin */
#define ADCx_GPIO_PIN                		GPIO_PIN_0
#define ADCx_GPIO_PORT         					GPIOB 
#define ADCx_GPIO_CLK_ENABLE()          __GPIOB_CLK_ENABLE()
#define ADCx_GPIO_CLK_DISABLE()         __GPIOB_CLK_DISABLE()

/* Definition for ADCx's Channel */
#define ADCx_CHANNEL                    ADC_CHANNEL_8

/* Definition for ADCx's NVIC */
//#define ADCx_IRQn                      ADC_IRQn

/* Private function prototypes -----------------------------------------------*/
void ADC_Start_single_IT_Conversion(void);

/* Exported functions --------------------------------------------------------*/

uint16_t get_ambient_light_level(void)
{
	#ifdef OSTC_ON_DISCOVERY_HARDWARE
		return 800;
	#endif
	
	return uhADCxConvertedValue;
}


static void ADCx_MspInit(ADC_HandleTypeDef *hadc)
{
	#ifdef OSTC_ON_DISCOVERY_HARDWARE
		return;
	#endif
	
  GPIO_InitTypeDef  GPIO_InitStruct;

  ADCx_GPIO_CLK_ENABLE();
  
  GPIO_InitStruct.Pin = ADCx_GPIO_PIN ;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(ADCx_GPIO_PORT, &GPIO_InitStruct);

  ADCx_CLK_ENABLE(); 

//  HAL_NVIC_SetPriority(ADCx_IRQn, 2, 0);
//  HAL_NVIC_EnableIRQ(ADCx_IRQn);
}


void ADCx_DeInit(void)
{
//	HAL_ADC_Stop_IT(&AdcHandle);
  HAL_ADC_DeInit(&AdcHandle);
}


void ADCx_Init(void)
{
	#ifdef OSTC_ON_DISCOVERY_HARDWARE
		return;
	#endif
	
	ADC_ChannelConfTypeDef sConfig;
	
  AdcHandle.Instance          = ADCx;
  
  AdcHandle.Init.ClockPrescaler				 = ADC_CLOCKPRESCALER_PCLK_DIV4;
	AdcHandle.Init.Resolution            = ADC_RESOLUTION12b;
	AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
	AdcHandle.Init.ContinuousConvMode    = DISABLE;
	AdcHandle.Init.DiscontinuousConvMode = DISABLE;
	AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
	AdcHandle.Init.EOCSelection          = EOC_SINGLE_CONV;
	AdcHandle.Init.NbrOfConversion       = 1;
	AdcHandle.Init.DMAContinuousRequests = DISABLE;    
      
	ADCx_MspInit(&AdcHandle);
	HAL_ADC_Init(&AdcHandle);

	sConfig.Channel = ADCx_CHANNEL;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Rank = 1;
  sConfig.Offset = 0;

	HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
	
//	ADC_Start_single_IT_Conversion();
}


uint32_t adc_debug_status = 0;

void adc_ambient_light_sensor_get_data(void)
{
	#ifdef OSTC_ON_DISCOVERY_HARDWARE
		return;
	#endif
	
	HAL_ADC_Start(&AdcHandle);
  HAL_ADC_PollForConversion(&AdcHandle, 10);
	adc_debug_status = HAL_ADC_GetState(&AdcHandle);
  if(adc_debug_status == HAL_ADC_STATE_EOC_REG + HAL_ADC_STATE_READY) // new HAL_ADC_STATE_READY 160613
//  if(HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG)
  uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
	HAL_ADC_Stop(&AdcHandle);
}


/* Private functions ---------------------------------------------------------*/
/*
void ADC_Start_single_IT_Conversion(void)
{
	HAL_ADC_Start_IT(&AdcHandle);
}


void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
	extern void copyAmbientLightData(void);

  uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);
	copyAmbientLightData();
	ADC_Start_single_IT_Conversion();
}
*/

/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/