You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.4 KiB
C
76 lines
2.4 KiB
C
#include "padc.h"
|
|
|
|
static uint16_t raw_adc_values[P_ADC_BUFFER_SIZE];
|
|
|
|
static struct adc_module adc_mod;
|
|
static struct dma_resource adc_resource;
|
|
|
|
COMPILER_ALIGNED(16)
|
|
DmacDescriptor adc_descriptor SECTION_DMAC_DESCRIPTOR;
|
|
|
|
void padc_init(void)
|
|
{
|
|
// configure adc
|
|
struct adc_config adc_conf;
|
|
adc_get_config_defaults(&adc_conf);
|
|
adc_conf.gain_factor = P_ADC_GAIN_FACTOR;
|
|
adc_conf.resolution = P_ADC_RESOLUTION;
|
|
adc_conf.clock_prescaler = P_ADC_CLOCK_PRESCALAR;
|
|
adc_conf.reference = P_ADC_VREF;
|
|
adc_conf.positive_input = P_ADC_POSITIVE_INPUT_PIN;
|
|
adc_conf.negative_input = P_ADC_NEGATIVE_INPUT_PIN;
|
|
adc_conf.freerunning = true;
|
|
adc_conf.left_adjust = false;
|
|
|
|
adc_init(&adc_mod, ADC, &adc_conf);
|
|
adc_enable(&adc_mod);
|
|
|
|
// configure dma resource
|
|
struct dma_resource_config dma_resource_conf;
|
|
dma_get_config_defaults(&dma_resource_conf);
|
|
dma_resource_conf.peripheral_trigger = ADC_DMAC_ID_RESRDY;
|
|
dma_resource_conf.trigger_action = DMA_TRIGGER_ACTION_BLOCK;
|
|
// allocate dma resource
|
|
dma_allocate(&adc_resource, &dma_resource_conf);
|
|
// setup transfer descriptor
|
|
struct dma_descriptor_config dma_desc_conf;
|
|
dma_descriptor_get_config_defaults(&dma_desc_conf);
|
|
dma_desc_conf.beat_size = DMA_BEAT_SIZE_HWORD; // 16 bit
|
|
dma_desc_conf.dst_increment_enable = true;
|
|
dma_desc_conf.src_increment_enable = false;
|
|
dma_desc_conf.block_transfer_count = sizeof(raw_adc_values) / 2;
|
|
dma_desc_conf.source_address = (uint32_t)(&adc_mod.hw->RESULT.reg);
|
|
dma_desc_conf.destination_address = (uint32_t)(raw_adc_values + (sizeof(raw_adc_values) / 2));
|
|
dma_desc_conf.next_descriptor_address = (uint32_t)&adc_descriptor;
|
|
dma_descriptor_create(&adc_descriptor, &dma_desc_conf);
|
|
dma_add_descriptor(&adc_resource, &adc_descriptor);
|
|
}
|
|
|
|
void padc_start(void)
|
|
{
|
|
adc_start_conversion(&adc_mod);
|
|
dma_start_transfer_job(&adc_resource);
|
|
}
|
|
|
|
float padc_get_voltage(void)
|
|
{
|
|
uint16_t raw = padc_get_raw();
|
|
// raw reading / 2^n * Vref
|
|
// n = bit resolution
|
|
// vref = 1/1.48 * Vcc
|
|
// Vcc is supposed to be 3.3, which would give a Vref of 2.2297
|
|
// My vcc is dipping a bit low at 3.26-3.28 so my vref is slightly lower.
|
|
return (float)((float)raw / 4096.0f * 2.2027f);
|
|
}
|
|
|
|
uint16_t padc_get_raw(void)
|
|
{
|
|
uint32_t sum = 0;
|
|
for(int ind = 0; ind < P_ADC_OVERSAMPLE_RATE; ind++)
|
|
{
|
|
//printf("Raw: [%d]: %u\r\n", ind, raw_adc_values[ind]);
|
|
sum += (uint32_t)raw_adc_values[ind];
|
|
}
|
|
sum /= P_ADC_OVERSAMPLE_RATE;
|
|
return (uint16_t)sum;
|
|
} |