New Analog measurement from 0.92.2
New Analog measurement from 0.92.2pull/71/head
rodzic
eef2f7009d
commit
0d75caadc4
|
@ -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 ##########################
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue