1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-26 17:55:19 +03:00

[ARM board] ADC are done 4 times inside the driver now. To be tested on H

This commit is contained in:
Bertrand Songis 2016-04-09 10:09:54 +02:00
parent 5e354749b2
commit 1e3da34ec8
5 changed files with 184 additions and 138 deletions

View file

@ -1512,17 +1512,7 @@ uint16_t BandGap ;
JitterMeter<uint16_t> rawJitter[NUMBER_ANALOG]; JitterMeter<uint16_t> rawJitter[NUMBER_ANALOG];
JitterMeter<uint16_t> avgJitter[NUMBER_ANALOG]; JitterMeter<uint16_t> avgJitter[NUMBER_ANALOG];
tmr10ms_t jitterResetTime = 0; tmr10ms_t jitterResetTime = 0;
#if defined(PCBHORUS)
#define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuStatsAnalogs)
#elif defined(PCBTARANIS)
#define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuGeneralDiagAna)
#elif defined(CLI)
#define JITTER_MEASURE_ACTIVE() (1)
#else
#define JITTER_MEASURE_ACTIVE() (0)
#endif #endif
#endif
#if defined(VIRTUALINPUTS) && defined(JITTER_FILTER) #if defined(VIRTUALINPUTS) && defined(JITTER_FILTER)
#define JITTER_FILTER_STRENGTH 4 // tune this value, bigger value - more filtering (range: 1-5) (see explanation below) #define JITTER_FILTER_STRENGTH 4 // tune this value, bigger value - more filtering (range: 1-5) (see explanation below)
@ -1576,8 +1566,6 @@ uint16_t anaIn(uint8_t chan)
#if defined(CPUARM) #if defined(CPUARM)
void getADC() void getADC()
{ {
uint16_t temp[NUMBER_ANALOG] = { 0 };
#if defined(JITTER_MEASURE) #if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE() && jitterResetTime < get_tmr10ms()) { if (JITTER_MEASURE_ACTIVE() && jitterResetTime < get_tmr10ms()) {
// reset jitter measurement every second // reset jitter measurement every second
@ -1590,22 +1578,11 @@ void getADC()
#endif #endif
DEBUG_TIMER_START(debugTimerAdcRead); DEBUG_TIMER_START(debugTimerAdcRead);
for (uint8_t i=0; i<4; i++) {
adcRead(); adcRead();
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
uint16_t val = getAnalogValue(x);
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[x].measure(val);
}
#endif
temp[x] += val;
}
}
DEBUG_TIMER_STOP(debugTimerAdcRead); DEBUG_TIMER_STOP(debugTimerAdcRead);
for (uint32_t x=0; x<NUMBER_ANALOG; x++) { for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
uint16_t v = temp[x] >> (3 - ANALOG_SCALE); uint16_t v = getAnalogValue(x) >> (1 - ANALOG_SCALE);
#if defined(VIRTUALINPUTS) && defined(JITTER_FILTER) #if defined(VIRTUALINPUTS) && defined(JITTER_FILTER)
// Jitter filter: // Jitter filter:

View file

@ -1750,7 +1750,16 @@ extern uint16_t s_anaFilt[NUMBER_ANALOG];
#if defined(JITTER_MEASURE) #if defined(JITTER_MEASURE)
extern JitterMeter<uint16_t> rawJitter[NUMBER_ANALOG]; extern JitterMeter<uint16_t> rawJitter[NUMBER_ANALOG];
extern JitterMeter<uint16_t> avgJitter[NUMBER_ANALOG]; extern JitterMeter<uint16_t> avgJitter[NUMBER_ANALOG];
#endif // defined(JITTER_MEASURE) #if defined(PCBHORUS)
#define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuStatsAnalogs)
#elif defined(PCBTARANIS)
#define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuGeneralDiagAna)
#elif defined(CLI)
#define JITTER_MEASURE_ACTIVE() (1)
#else
#define JITTER_MEASURE_ACTIVE() (0)
#endif
#endif
#define WDT_500MS 500 #define WDT_500MS 500

View file

@ -18,11 +18,23 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS) #define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS)
#define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS) #define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS)
#define SPI_STICK1 0
#define SPI_STICK2 1
#define SPI_STICK3 2
#define SPI_STICK4 3
#define SPI_S1 4
#define SPI_6POS 5
#define SPI_S2 6
#define SPI_LS 7
#define SPI_RS 8
#define SPI_TX_VOLTAGE 9
#define SPI_L2 10
#define SPI_L1 11
#define RESETCMD 0x4000 #define RESETCMD 0x4000
#define MANUAL_MODE 0x1000 // manual mode channel 0 #define MANUAL_MODE 0x1000 // manual mode channel 0
@ -30,7 +42,7 @@
uint16_t adcValues[NUMBER_ANALOG] __DMA; uint16_t adcValues[NUMBER_ANALOG] __DMA;
static u16 SPIx_ReadWriteByte(uint16_t value) uint16_t SPIx_ReadWriteByte(uint16_t value)
{ {
while(SPI_I2S_GetFlagStatus(ADC_SPI,SPI_I2S_FLAG_TXE) == RESET); while(SPI_I2S_GetFlagStatus(ADC_SPI,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(ADC_SPI,value); SPI_I2S_SendData(ADC_SPI,value);
@ -87,20 +99,6 @@ static void ADS7952_Init()
ADC_CS_LOW(); ADC_CS_LOW();
SPIx_ReadWriteByte(MANUAL_MODE); SPIx_ReadWriteByte(MANUAL_MODE);
ADC_CS_HIGH(); ADC_CS_HIGH();
// SPIx_ReadWriteByte(ProgramReg_Auto2 );
// ADC_CS_HIGH();
// asm("nop");
// ADC_CS_LOW();
// SPIx_ReadWriteByte(AutoMode_2);
// ADC_CS_HIGH();
// asm("nop");
// ADC_CS_LOW();
// SPIx_ReadWriteByte(ContinuedSelectMode);
// ADC_CS_HIGH();
// asm("nop");
} }
void adcInit() void adcInit()
@ -126,19 +124,6 @@ void adcInit()
DMA2_Stream1->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; DMA2_Stream1->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
} }
#define SPI_STICK1 0
#define SPI_STICK2 1
#define SPI_STICK3 2
#define SPI_STICK4 3
#define SPI_S1 4
#define SPI_6POS 5
#define SPI_S2 6
#define SPI_LS 7
#define SPI_RS 8
#define SPI_TX_VOLTAGE 9
#define SPI_L2 10
#define SPI_L1 11
const uint16_t adcCommands[MOUSE1+2] = const uint16_t adcCommands[MOUSE1+2] =
{ {
MANUAL_MODE | (SPI_STICK1 << 7), MANUAL_MODE | (SPI_STICK1 << 7),
@ -157,37 +142,25 @@ const uint16_t adcCommands[MOUSE1+2] =
MANUAL_MODE | (0 << 7 ) // small joystick up/down MANUAL_MODE | (0 << 7 ) // small joystick up/down
}; };
void adcRead() void adcReadSPIDummy()
{ {
const uint16_t * command = adcCommands;
// Start on chip ADC read
DMA2_Stream1->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC3->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR );
DMA2->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 |DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1; // Write ones to clear bits
DMA2_Stream1->M0AR = CONVERT_PTR_UINT(&adcValues[MOUSE1]);
DMA2_Stream1->NDTR = 2;
DMA2_Stream1->CR |= DMA_SxCR_EN; // Enable DMA
ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART;
// A dummy command to get things started // A dummy command to get things started
// (because the sampled data is lagging behind for two command cycles) // (because the sampled data is lagging behind for two command cycles)
ADC_CS_LOW(); ADC_CS_LOW();
delay_01us(1); delay_01us(1);
SPIx_ReadWriteByte(*command); // still sampling the old MUX channel SPIx_ReadWriteByte(adcCommands[0]);
ADC_CS_HIGH(); ADC_CS_HIGH();
delay_01us(1); delay_01us(1);
}
uint32_t adcReadNextSPIChannel(uint8_t index)
{
uint32_t result = 0;
DEBUG_TIMER_START(debugTimerAdcLoop);
for (uint32_t adcIndex=0; adcIndex<MOUSE1; adcIndex++) {
// MUX is changed to the channel that was sent in the previous command
// but the data is from the old MUX position
ADC_CS_LOW(); ADC_CS_LOW();
delay_01us(1); delay_01us(1);
SPIx_ReadWriteByte(*command); SPIx_ReadWriteByte(adcCommands[index]);
ADC_CS_HIGH(); ADC_CS_HIGH();
delay_01us(1);
// This delay is to allow charging of ADC input capacitor // This delay is to allow charging of ADC input capacitor
// after the MUX changes from one channel to the other. // after the MUX changes from one channel to the other.
// It was determined experimentally. Biggest problem seems to be // It was determined experimentally. Biggest problem seems to be
@ -200,29 +173,69 @@ void adcRead()
// 300 13 // 300 13
// 500 undetectable // 500 undetectable
delay_01us(500); delay_01us(500);
++command; // move to the next channel
// First time the wanted ADC channel is actually sampled. for (uint8_t i = 0; i < 4; i++) {
// This is delayed to allow MUX to settle (high input impedance)
// Also the MUX channel is set to the next channel here,
// but the actual MUX change will happen in the next round
ADC_CS_LOW(); ADC_CS_LOW();
delay_01us(1); delay_01us(1);
adcValues[adcIndex] = (0x0fff & SPIx_ReadWriteByte(*command)); uint16_t val = (0x0fff & SPIx_ReadWriteByte(adcCommands[index]));
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[index].measure(val);
}
#endif
ADC_CS_HIGH(); ADC_CS_HIGH();
delay_01us(1); delay_01us(1);
result += val;
} }
DEBUG_TIMER_STOP(debugTimerAdcLoop);
DEBUG_TIMER_START(debugTimerAdcWait); return result >> 2;
}
void adcStartNextOnChipRead()
{
DMA2_Stream1->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC3->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR );
DMA2->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 |DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1; // Write ones to clear bits
DMA2_Stream1->M0AR = CONVERT_PTR_UINT(&adcValues[MOUSE1]);
DMA2_Stream1->NDTR = 2;
DMA2_Stream1->CR |= DMA_SxCR_EN; // Enable DMA
ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART;
}
void adcEndNextOnChipRead()
{
for (uint32_t i=0; i<20000; i++) { for (uint32_t i=0; i<20000; i++) {
if (DMA2->LISR & DMA_LISR_TCIF1) { if (DMA2->LISR & DMA_LISR_TCIF1) {
break; break;
} }
} }
DEBUG_TIMER_STOP(debugTimerAdcWait); }
// On chip ADC read should have finished void adcRead()
{
uint16_t temp[NUMBER_ANALOG-MOUSE1] = { 0 };
adcReadSPIDummy();
for (uint32_t index=0; index<MOUSE1; index++) {
if (index < 8 && !(index & 1)) adcStartNextOnChipRead();
adcValues[index] = adcReadNextSPIChannel(index);
if (index < 8 && (index & 1)) {
adcEndNextOnChipRead();
for (uint8_t x=0; x<NUMBER_ANALOG-MOUSE1; x++) {
uint16_t val = adcValues[MOUSE1+x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[MOUSE1+x].measure(val);
}
#endif
temp[x] += val;
}
}
}
for (uint8_t x=0; x<NUMBER_ANALOG-MOUSE1; x++) {
adcValues[MOUSE1+x] = temp[x] >> 2;
}
} }
const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1,-1, -1,-1, -1,1, 0,0,0}; const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1,-1, -1,-1, -1,1, 0,0,0};

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../opentx.h" #include "opentx.h"
uint16_t adcValues[NUMBER_ANALOG]; uint16_t adcValues[NUMBER_ANALOG];
@ -63,12 +63,13 @@ void adcInit()
// Read 8 (9 for REVB) ADC channels // Read 8 (9 for REVB) ADC channels
// Documented bug, must do them 1 by 1 // Documented bug, must do them 1 by 1
void adcRead() void adcSingleRead()
{ {
register Adc *padc; register Adc *padc;
register uint32_t y; register uint32_t y;
register uint32_t x; register uint32_t x;
for (uint8_t i=0; i<4; i++)
padc = ADC; padc = ADC;
y = padc->ADC_ISR; // Clear EOC flags y = padc->ADC_ISR; // Clear EOC flags
for (y = NUMBER_ANALOG+1; --y > 0;) { for (y = NUMBER_ANALOG+1; --y > 0;) {
@ -112,6 +113,29 @@ void adcRead()
#endif #endif
} }
void adcRead()
{
uint16_t temp[NUMBER_ANALOG] = { 0 };
for (int i=0; i<4; i++) {
adcSingleRead();
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
uint16_t val = adcValues[x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[x].measure(val);
}
#endif
temp[x] += val;
}
}
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
adcValues[x] = temp[x] >> 2;
}
}
uint16_t getAnalogValue(uint8_t value) uint16_t getAnalogValue(uint8_t value)
{ {
return adcValues[value]; return adcValues[value];

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#define PIN_ANALOG 0x0003 #define PIN_ANALOG 0x0003
#define PIN_PORTA 0x0000 #define PIN_PORTA 0x0000
@ -111,11 +111,12 @@ void adcInit()
#endif #endif
} }
void adcRead() void adcSingleRead()
{ {
DMA2_Stream0->CR &= ~DMA_SxCR_EN; // Disable DMA DMA2_Stream0->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR);
DMA2->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 |DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0 ; // Write ones to clear bits DMA2->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 |
DMA_LIFCR_CFEIF0; // Write ones to clear bits
DMA2_Stream0->CR |= DMA_SxCR_EN; // Enable DMA DMA2_Stream0->CR |= DMA_SxCR_EN; // Enable DMA
ADC1->CR2 |= (uint32_t) ADC_CR2_SWSTART; ADC1->CR2 |= (uint32_t) ADC_CR2_SWSTART;
@ -125,7 +126,7 @@ void adcRead()
DMA2->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 |DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1 ; // Write ones to clear bits DMA2->LIFCR = DMA_LIFCR_CTCIF1 | DMA_LIFCR_CHTIF1 |DMA_LIFCR_CTEIF1 | DMA_LIFCR_CDMEIF1 | DMA_LIFCR_CFEIF1 ; // Write ones to clear bits
DMA2_Stream1->CR |= DMA_SxCR_EN ; // Enable DMA DMA2_Stream1->CR |= DMA_SxCR_EN ; // Enable DMA
ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART ; ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART ;
#endif // #if defined(REV9E) #endif // defined(REV9E)
#if defined(REV9E) #if defined(REV9E)
for (unsigned int i=0; i<10000; i++) { for (unsigned int i=0; i<10000; i++) {
@ -145,6 +146,28 @@ void adcRead()
#endif #endif
} }
void adcRead()
{
uint16_t temp[NUMBER_ANALOG] = { 0 };
for (int i=0; i<4; i++) {
adcSingleRead();
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
uint16_t val = adcValues[x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[x].measure(val);
}
#endif
temp[x] += val;
}
}
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
adcValues[x] = temp[x] >> 2;
}
}
// TODO // TODO
void adcStop() void adcStop()
{ {