ADC driver for GDx targets

This commit is contained in:
Silvano Seva 2020-12-22 15:29:32 +01:00
parent 0f09504453
commit f38ce61dc9
5 changed files with 157 additions and 8 deletions

View File

@ -224,6 +224,7 @@ mduv380_def = def + stm32f405_def + {'PLATFORM_MDUV380': ''}
gd77_src = src + mk22fn512_src + ['platform/targets/GD77/platform.c',
'platform/drivers/display/UC1701_GD77.c',
'platform/drivers/keyboard/keyboard_GD77.c',
'platform/drivers/ADC/ADC0_GDx.c',
'platform/drivers/baseband/rtx_GDx.c']
gd77_inc = inc + mk22fn512_inc + ['platform/targets/GD77']
@ -234,6 +235,7 @@ gd77_def = def + mk22fn512_def + {'PLATFORM_GD77': ''}
dm1801_src = src + mk22fn512_src + ['platform/targets/DM-1801/platform.c',
'platform/drivers/display/UC1701_GD77.c',
'platform/drivers/keyboard/keyboard_GD77.c',
'platform/drivers/ADC/ADC0_GDx.c',
'platform/drivers/baseband/rtx_GDx.c']
dm1801_inc = inc + mk22fn512_inc + ['platform/targets/DM-1801']

View File

@ -0,0 +1,63 @@
/***************************************************************************
* Copyright (C) 2020 by Silvano Seva IU2KWO and Niccolò Izzo IU2KIN *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#include <hwconfig.h>
#include "ADC0_GDx.h"
void adc0_init()
{
SIM->SCGC6 |= SIM_SCGC6_ADC0(1);
ADC0->CFG1 |= ADC_CFG1_ADIV(3) /* Divide clock by 8 */
| ADC_CFG1_ADLSMP(1) /* Long sample time */
| ADC_CFG1_MODE(3); /* 16 bit result */
ADC0->SC3 |= ADC_SC3_AVGE(1) /* Enable hardware average */
| ADC_SC3_AVGS(3); /* Average over 32 samples */
/* Calibrate ADC */
ADC0->SC3 |= ADC_SC3_CAL(1);
while((ADC0->SC3) & ADC_SC3_CAL_MASK) ;
uint32_t cal = ADC0->CLP0
+ ADC0->CLP1
+ ADC0->CLP2
+ ADC0->CLP3
+ ADC0->CLP4
+ ADC0->CLPS;
ADC0->PG = 0x8000 | (cal >> 1);
}
void adc0_terminate()
{
SIM->SCGC6 &= ~SIM_SCGC6_ADC0(1);
}
float adc0_getMeasurement(uint8_t ch)
{
if(ch > 32) return 0.0f;
/* Conversion is automatically initiated by writing to this register */
ADC0->SC1[0] = ADC_SC1_ADCH(ch);
while(((ADC0->SC1[0]) & ADC_SC1_COCO_MASK) == 0) ;
uint16_t sample = ADC0->R[0];
return ((float) sample) * 3300.0f/65536.0f;
}

View File

@ -0,0 +1,40 @@
/***************************************************************************
* Copyright (C) 2020 by Silvano Seva IU2KWO and Niccolò Izzo IU2KIN *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#ifndef ADC0_H
#define ADC0_H
#include <stdint.h>
/**
* Initialise and start ADC0.
*/
void adc0_init();
/**
* Turn off ADC0.
*/
void adc0_terminate();
/**
* Get current measurement of a given channel.
* @param ch: channel number.
* @return current value of the specified channel in mV.
*/
float adc0_getMeasurement(uint8_t ch);
#endif /* ADC0_H */

View File

@ -19,9 +19,15 @@
***************************************************************************/
#include <platform.h>
#include <ADC0_GDx.h>
#include <gpio.h>
#include <os.h>
#include "hwconfig.h"
/* Mutex for concurrent access to ADC0 */
OS_MUTEX adc_mutex;
OS_ERR e;
void platform_init()
{
/* Configure GPIOs */
@ -48,6 +54,12 @@ void platform_init()
gpio_setMode(LCD_BKLIGHT, OUTPUT);
gpio_setAlternateFunction(LCD_BKLIGHT, 2);
/*
* Initialise ADC
*/
adc0_init();
OSMutexCreate(&adc_mutex, "", &e);
}
void platform_terminate()
@ -55,18 +67,28 @@ void platform_terminate()
gpio_clearPin(LCD_BKLIGHT);
gpio_clearPin(RED_LED);
gpio_clearPin(GREEN_LED);
adc0_terminate();
}
float platform_getVbat()
{
/* TODO */
return 0.0f;
float value = 0.0f;
OSMutexPend(&adc_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &e);
value = adc0_getMeasurement(1);
OSMutexPost(&adc_mutex, OS_OPT_POST_NONE, &e);
return (value * 3.0f)/1000.0f;
}
float platform_getMicLevel()
{
/* TODO */
return 0.0f;
float value = 0.0f;
OSMutexPend(&adc_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &e);
value = adc0_getMeasurement(3);
OSMutexPost(&adc_mutex, OS_OPT_POST_NONE, &e);
return value;
}
float platform_getVolumeLevel()

View File

@ -19,9 +19,15 @@
***************************************************************************/
#include <platform.h>
#include <ADC0_GDx.h>
#include <gpio.h>
#include <os.h>
#include "hwconfig.h"
/* Mutex for concurrent access to ADC0 */
OS_MUTEX adc_mutex;
OS_ERR e;
void platform_init()
{
/* Configure GPIOs */
@ -48,6 +54,12 @@ void platform_init()
gpio_setMode(LCD_BKLIGHT, OUTPUT);
gpio_setAlternateFunction(LCD_BKLIGHT, 2);
/*
* Initialise ADC
*/
adc0_init();
OSMutexCreate(&adc_mutex, "", &e);
}
void platform_terminate()
@ -55,18 +67,28 @@ void platform_terminate()
gpio_clearPin(LCD_BKLIGHT);
gpio_clearPin(RED_LED);
gpio_clearPin(GREEN_LED);
adc0_terminate();
}
float platform_getVbat()
{
/* TODO */
return 0.0f;
float value = 0.0f;
OSMutexPend(&adc_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &e);
value = adc0_getMeasurement(1);
OSMutexPost(&adc_mutex, OS_OPT_POST_NONE, &e);
return (value * 3.0f)/1000.0f;
}
float platform_getMicLevel()
{
/* TODO */
return 0.0f;
float value = 0.0f;
OSMutexPend(&adc_mutex, 0u, OS_OPT_PEND_BLOCKING, 0u, &e);
value = adc0_getMeasurement(3);
OSMutexPost(&adc_mutex, OS_OPT_POST_NONE, &e);
return value;
}
float platform_getVolumeLevel()