New Analog measurement from 0.92.2

New Analog measurement from 0.92.2
pull/71/head
Luc 2015-03-02 13:41:36 +08:00
rodzic eef2f7009d
commit 0d75caadc4
5 zmienionych plików z 61 dodań i 54 usunięć

Wyświetl plik

@ -27,8 +27,8 @@
//Warning: for DaVinci 1.0 need to add a permanent fan with power supply to cool extruder
#define VERSION_MAJOR " 1"
#define VERSION_MINOR_YEAR "15"
#define VERSION_MINOR_MONTH "02"
#define VERSION_MINOR_DAY "26"
#define VERSION_MINOR_MONTH "03"
#define VERSION_MINOR_DAY "02"
#define VERSION_BUILD "1"
// ################ END MANUAL SETTINGS ##########################

Wyświetl plik

@ -47,9 +47,6 @@ extern int16_t read_max31855(uint8_t ss_pin);
#if ANALOG_INPUTS > 0
const uint8 osAnalogInputChannels[] PROGMEM = ANALOG_INPUT_CHANNELS;
uint8 osAnalogInputCounter[ANALOG_INPUTS];
uint osAnalogInputBuildup[ANALOG_INPUTS];
uint8 osAnalogInputPos=0; // Current sampling position
volatile uint osAnalogInputValues[ANALOG_INPUTS];
#endif

Wyświetl plik

@ -32,6 +32,17 @@
extern "C" char *sbrk(int i);
extern long bresenham_step();
#define NUM_ADC_SAMPLES 2 + (1 << ANALOG_INPUT_SAMPLE)
#if ANALOG_INPUTS > 0
int32_t osAnalogInputBuildup[ANALOG_INPUTS];
int32_t osAnalogSamples[ANALOG_INPUTS][ANALOG_INPUT_MEDIAN];
static int32_t adcSamplesMin[ANALOG_INPUTS];
static int32_t adcSamplesMax[ANALOG_INPUTS];
static int adcCounter = 0,adcSamplePos = 0;
#endif
static uint32_t adcEnable = 0;
char HAL::virtualEeprom[EEPROM_BYTES];
volatile uint8_t HAL::insideTimer1=0;
#ifndef DUE_SOFTWARE_SPI
@ -176,22 +187,21 @@ void HAL::setupTimer() {
// Initialize ADC channels
void HAL::analogStart(void)
{
uint32_t adcEnable = 0;
// ensure we can write to ADC registers
ADC->ADC_WPMR = ADC_WPMR_WPKEY(0);
ADC->ADC_WPMR = 0x41444300u; //ADC_WPMR_WPKEY(0);
pmc_enable_periph_clk(ID_ADC); // enable adc clock
for(int i = 0; i < ANALOG_INPUTS; i++)
{
osAnalogInputCounter[i] = 0;
osAnalogInputValues[i] = 0;
// osAnalogInputChannels
//adcEnable |= (0x1u << adcChannel[i]);
adcSamplesMin[i] = 100000;
adcSamplesMax[i] = 0;
adcEnable |= (0x1u << osAnalogInputChannels[i]);
for(int j = 0; j < ANALOG_INPUT_MEDIAN; j++)
osAnalogSamples[i][j] = 2048; // we want to prevent early error from bad starting values
}
// enable channels
ADC->ADC_CHER = adcEnable;
ADC->ADC_CHDR = !adcEnable;
@ -204,7 +214,7 @@ void HAL::analogStart(void)
// set prescaler rate MCK/((PRESCALE+1) * 2)
// set tracking time (TRACKTIM+1) * clock periods
// set transfer period (TRANSFER * 2 + 3)
ADC->ADC_MR = ADC_MR_TRGEN_DIS | ADC_MR_TRGSEL_ADC_TRIG0 | ADC_MR_LOWRES_BITS_10 |
ADC->ADC_MR = ADC_MR_TRGEN_DIS | ADC_MR_TRGSEL_ADC_TRIG0 | ADC_MR_LOWRES_BITS_12 |
ADC_MR_SLEEP_NORMAL | ADC_MR_FWUP_OFF | ADC_MR_FREERUN_OFF |
ADC_MR_STARTUP_SUT64 | ADC_MR_SETTLING_AST17 | ADC_MR_ANACH_NONE |
ADC_MR_USEQ_NUM_ORDER |
@ -987,36 +997,35 @@ void PWM_TIMER_VECTOR ()
// read analog values -- only read one per interrupt
#if ANALOG_INPUTS > 0
// conversion finished?
//if(ADC->ADC_ISR & ADC_ISR_EOC(adcChannel[osAnalogInputPos]))
if(ADC->ADC_ISR & ADC_ISR_EOC(osAnalogInputChannels[osAnalogInputPos]))
{
//osAnalogInputChannels
//osAnalogInputBuildup[osAnalogInputPos] += ADC->ADC_CDR[adcChannel[osAnalogInputPos]];
osAnalogInputBuildup[osAnalogInputPos] += ADC->ADC_CDR[osAnalogInputChannels[osAnalogInputPos]];
if(++osAnalogInputCounter[osAnalogInputPos] >= (1 << ANALOG_INPUT_SAMPLE))
if((ADC->ADC_ISR & adcEnable) == adcEnable)
{
adcCounter++;
for(int i = 0; i < ANALOG_INPUTS; i++) {
int32_t cur = ADC->ADC_CDR[osAnalogInputChannels[i]];
osAnalogInputBuildup[i] += cur;
adcSamplesMin[i] = RMath::min(adcSamplesMin[i], cur);
adcSamplesMax[i] = RMath::max(adcSamplesMax[i], cur);
if(adcCounter >= NUM_ADC_SAMPLES)
{
#if ANALOG_INPUT_BITS+ANALOG_INPUT_SAMPLE<12
osAnalogInputValues[osAnalogInputPos] =
osAnalogInputBuildup[osAnalogInputPos] <<
(12-ANALOG_INPUT_BITS-ANALOG_INPUT_SAMPLE);
#endif
#if ANALOG_INPUT_BITS+ANALOG_INPUT_SAMPLE>12
osAnalogInputValues[osAnalogInputPos] =
osAnalogInputBuildup[osAnalogInputPos] >>
(ANALOG_INPUT_BITS+ANALOG_INPUT_SAMPLE-12);
#endif
#if ANALOG_INPUT_BITS+ANALOG_INPUT_SAMPLE==12
osAnalogInputValues[osAnalogInputPos] =
osAnalogInputBuildup[osAnalogInputPos];
#endif
osAnalogInputBuildup[osAnalogInputPos] = 0;
osAnalogInputCounter[osAnalogInputPos] = 0;
}
// Start next conversion cycle
if(++osAnalogInputPos>=ANALOG_INPUTS) {
osAnalogInputPos = 0;
ADC->ADC_CR = ADC_CR_START;
}
// Strip biggest and smallest value and round correctly
osAnalogInputBuildup[i] = osAnalogInputBuildup[i] + (1 << (ANALOG_INPUT_SAMPLE - 1)) - (adcSamplesMin[i] + adcSamplesMax[i]);
adcSamplesMin[i] = 100000;
adcSamplesMax[i] = 0;
osAnalogSamples[i][adcSamplePos] = osAnalogInputBuildup[i] >> ANALOG_INPUT_SAMPLE;
int sum = 0;
for(int j = 0; j < ANALOG_INPUT_MEDIAN; j++)
sum += osAnalogSamples[i][j];
osAnalogInputValues[i] = sum / ANALOG_INPUT_MEDIAN;
osAnalogInputBuildup[i] = 0;
} // adcCounter >= NUM_ADC_SAMPLES
} // for i
if(adcCounter >= NUM_ADC_SAMPLES) {
adcCounter = 0;
adcSamplePos++;
if(adcSamplePos >= ANALOG_INPUT_MEDIAN)
adcSamplePos = 0;
}
ADC->ADC_CR = ADC_CR_START; // reread values
}
#endif // ANALOG_INPUTS > 0
UI_FAST; // Short timed user interface action

Wyświetl plik

@ -67,6 +67,7 @@ typedef char prog_char;
#define pgm_read_word_near(addr) pgm_read_word(addr)
#define pgm_read_dword(addr) (*(const unsigned long *)(addr))
#define pgm_read_dword_near(addr) pgm_read_dword(addr)
#define _BV(x) (1 << (x))
#define FSTRINGVALUE(var,value) const char var[] PROGMEM = value;
#define FSTRINGVAR(var) static const char var[] PROGMEM;
@ -120,12 +121,12 @@ typedef char prog_char;
#define SERVO2500US (((F_CPU_TRUE / SERVO_PRESCALE) / 1000000) * 2500)
#define SERVO5000US (((F_CPU_TRUE / SERVO_PRESCALE) / 1000000) * 5000)
#define AD_PRESCALE_FACTOR 41 // 1 MHz ADC clock
#define AD_TRACKING_CYCLES 0 // 0 - 15 + 1 adc clock cycles
#define AD_PRESCALE_FACTOR 84 // 500 kHz ADC clock
#define AD_TRACKING_CYCLES 4 // 0 - 15 + 1 adc clock cycles
#define AD_TRANSFER_CYCLES 1 // 0 - 3 * 2 + 3 adc clock cycles
#define ADC_ISR_EOC(channel) (0x1u << channel)
#define ENABLED_ADC_CHANNELS {TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN}
#define ADC_ISR_EOC(channel) (0x1u << channel)
#define ENABLED_ADC_CHANNELS {TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN}
#define PULLUP(IO,v) {pinMode(IO, (v!=LOW ? INPUT_PULLUP : INPUT)); }
@ -203,6 +204,11 @@ class InterruptProtectedBlock {
#define EEPROM_OFFSET 0
#define SECONDS_TO_TICKS(s) (unsigned long)(s*(float)F_CPU)
#define ANALOG_INPUT_SAMPLE 6
#define ANALOG_INPUT_MEDIAN 10
// Bits of the ADC converter
#define ANALOG_INPUT_BITS 12
#define ANALOG_REDUCE_BITS 0
#define ANALOG_REDUCE_FACTOR 1

Wyświetl plik

@ -108,11 +108,6 @@ usage or for seraching for memory induced errors. Switch it off for production,
#define TOWER_ARRAY 3
#define E_TOWER_ARRAY 4
// Bits of the ADC converter
#define ANALOG_INPUT_BITS 10
// Build median from 2^ANALOG_INPUT_SAMPLE samples
#define ANALOG_INPUT_SAMPLE 5
#define ANALOG_REF_AREF 0
#define ANALOG_REF_AVCC _BV(REFS0)
#define ANALOG_REF_INT_1_1 _BV(REFS1)
@ -422,9 +417,9 @@ public:
};
extern const uint8 osAnalogInputChannels[] PROGMEM;
extern uint8 osAnalogInputCounter[ANALOG_INPUTS];
extern uint osAnalogInputBuildup[ANALOG_INPUTS];
extern uint8 osAnalogInputPos; // Current sampling position
//extern uint8 osAnalogInputCounter[ANALOG_INPUTS];
//extern uint osAnalogInputBuildup[ANALOG_INPUTS];
//extern uint8 osAnalogInputPos; // Current sampling position
extern volatile uint osAnalogInputValues[ANALOG_INPUTS];
extern uint8_t pwm_pos[NUM_EXTRUDER+3]; // 0-NUM_EXTRUDER = Heater 0-NUM_EXTRUDER of extruder, NUM_EXTRUDER = Heated bed, NUM_EXTRUDER+1 Board fan, NUM_EXTRUDER+2 = Fan
#if USE_ADVANCE