diff --git a/Source/system/adc.c b/Source/system/adc.c new file mode 100644 --- /dev/null +++ b/Source/system/adc.c @@ -0,0 +1,97 @@ +/* + * FeatherHAB + * + * This file is part of FeatherHAB. + * + * FeatherHab is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FeatherHab is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with FeatherHAB. If not, see . + * + * Ethan Zonca + * + */ + +#include "stm32f0xx_hal.h" +#include "system/adc.h" + +ADC_HandleTypeDef hadc; +DMA_HandleTypeDef hdma_adc; + +#define ADC_BUF_LEN 1 +uint16_t adc_buffer[ADC_BUF_LEN]; + + +void adc_init(void) +{ + + __ADC1_CLK_ENABLE(); + + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + + ADC_ChannelConfTypeDef sConfig; + hadc.Instance = ADC1; + hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC; + hadc.Init.Resolution = ADC_RESOLUTION12b; + hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; + hadc.Init.EOCSelection = EOC_SEQ_CONV; + hadc.Init.LowPowerAutoWait = DISABLE; + hadc.Init.LowPowerAutoPowerOff = DISABLE; + hadc.Init.ContinuousConvMode = ENABLE; + hadc.Init.DiscontinuousConvMode = DISABLE; + hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc.Init.DMAContinuousRequests = ENABLE; + hadc.Init.Overrun = OVR_DATA_OVERWRITTEN; + HAL_ADC_Init(&hadc); + + sConfig.Channel = ADC_CHANNEL_6; + sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; + sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; + HAL_ADC_ConfigChannel(&hadc, &sConfig); + + + __DMA1_CLK_ENABLE(); + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + + hdma_adc.Instance = DMA1_Channel1; + hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_adc.Init.MemInc = DMA_MINC_ENABLE; + hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + hdma_adc.Init.Mode = DMA_CIRCULAR; + hdma_adc.Init.Priority = DMA_PRIORITY_LOW; + HAL_DMA_Init(&hdma_adc); + + __HAL_LINKDMA(&hadc,DMA_Handle,hdma_adc); + + + HAL_ADC_Start_DMA(&hadc, adc_buffer, ADC_BUF_LEN); + + +} + +uint8_t adc_get_vbatt(void) +{ + return adc_buffer[0] / 62.5; // tenths of volts ish +} + +DMA_HandleTypeDef* adc__hdma_gethandle(void) +{ + return &hdma_adc; +}