view Small_CPU/Src/adc.c @ 786:19ab6f3ed52a

Cleanup sensor data interface: In a very early implementation of the multiplexer the address of the mux was 0 followed by the sensors. As a resul the ID of the channels was shifted by one. To avoid confusion and because the mux address is meanwhile changed to the last address, it makes sense to return to the indexing where only the three visible sensor slots are used as reference (0,1,2).
author Ideenmodellierer
date Sun, 04 Jun 2023 21:54:24 +0200
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****/