diff --git a/newcode/main.c b/newcode/main.c index 1def553..a111ff8 100644 --- a/newcode/main.c +++ b/newcode/main.c @@ -1,21 +1,8 @@ #include #include #include -#include -#include -#include #include "yaMBSiavr.h" - -#define AVRG 512 - -#define SUPPLY_VOLTS 3.3 -#define REF_OHMS 993.5 - -#define ADC_0V_COUNT 170 -#define ADC_MAX_VOLT 1.95 - -uint16_t adc_buffer[AVRG]; -volatile float ch_values[9]; +#include "pt100.h" void init_clk(void) { @@ -47,68 +34,6 @@ void init_timer_100us(){ TCC0.INTCTRLA |= TC_OVFINTLVL_HI_gc; } -void adc_init(void){ - ADCA.CTRLB = ADC_FREERUN_bm; - ADCA.REFCTRL = ADC_REFSEL_VCC_gc; - ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc; - - uint8_t CalibrationByteL; - uint8_t CalibrationByteH; - NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; - CalibrationByteL = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0)); - CalibrationByteH = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1)); - NVM_CMD = NVM_CMD_NO_OPERATION_gc; - ADCA.CALL = CalibrationByteL; - ADCA.CALH = CalibrationByteH; - - ADCA.CTRLA = ADC_ENABLE_bm; - - ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; - ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc; -} - -uint16_t adc_read(void){ - ADCA.CH0.CTRL |= ADC_CH_START_bm; - while(!(ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm)); - ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm; - return ADCA.CH0.RES; -} - -float avrg(uint16_t * values, uint16_t length){ - uint64_t res = 0; - //ommit first and last sample - for(uint16_t i=1; i < length-1; i++){ - res += values[i]; - } - return (float)(res)/(length-2); -} - -void dma_init(void){ - DMA.CTRL = DMA_ENABLE_bm; - - DMA.CH0.CTRLB = DMA_CH_TRNINTLVL_LO_gc; - - DMA.CH0.TRFCNT = AVRG * 2; - DMA.CH0.CTRLA = DMA_CH_BURSTLEN_2BYTE_gc | DMA_CH_SINGLE_bm; - DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; - - //repeat endless - DMA.CH0.CTRLA |= DMA_CH_REPEAT_bm; - DMA.CH0.REPCNT = 0; - - DMA.CH0.SRCADDR0 = ((uintptr_t)&ADCA.CH0.RES) & 0xFF; - DMA.CH0.SRCADDR1 = (((uintptr_t)&ADCA.CH0.RES) >> 0x08) & 0xFF; - DMA.CH0.SRCADDR2 = (((uintptr_t)&ADCA.CH0.RES) >> 0x0F) & 0xFF; - - DMA.CH0.DESTADDR0 = ((uintptr_t)adc_buffer) & 0xFF; - DMA.CH0.DESTADDR1 = ((uintptr_t)adc_buffer >> 0x08) & 0xFF; - DMA.CH0.DESTADDR2 = ((uintptr_t)adc_buffer >> 0x0F) & 0xFF; - - DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_DESTRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; - - DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; -} - void modbusGet(void) { if (modbusGetBusState() & (1< +#include +#include +#include +#include "pt100.h" + +uint16_t adc_buffer[AVRG]; +volatile float ch_values[9]; + +void adc_init(void){ + ADCA.CTRLB = ADC_FREERUN_bm; + ADCA.REFCTRL = ADC_REFSEL_VCC_gc; + ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc; + + uint8_t CalibrationByteL; + uint8_t CalibrationByteH; + NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; + CalibrationByteL = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0)); + CalibrationByteH = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1)); + NVM_CMD = NVM_CMD_NO_OPERATION_gc; + ADCA.CALL = CalibrationByteL; + ADCA.CALH = CalibrationByteH; + + ADCA.CTRLA = ADC_ENABLE_bm; + + ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc; + ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc; +} + +void dma_init(void){ + DMA.CTRL = DMA_ENABLE_bm; + + DMA.CH0.CTRLB = DMA_CH_TRNINTLVL_LO_gc; + + DMA.CH0.TRFCNT = AVRG * 2; + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_2BYTE_gc | DMA_CH_SINGLE_bm; + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; + + //repeat endless + DMA.CH0.CTRLA |= DMA_CH_REPEAT_bm; + DMA.CH0.REPCNT = 0; + + DMA.CH0.SRCADDR0 = ((uintptr_t)&ADCA.CH0.RES) & 0xFF; + DMA.CH0.SRCADDR1 = (((uintptr_t)&ADCA.CH0.RES) >> 0x08) & 0xFF; + DMA.CH0.SRCADDR2 = (((uintptr_t)&ADCA.CH0.RES) >> 0x0F) & 0xFF; + + DMA.CH0.DESTADDR0 = ((uintptr_t)adc_buffer) & 0xFF; + DMA.CH0.DESTADDR1 = ((uintptr_t)adc_buffer >> 0x08) & 0xFF; + DMA.CH0.DESTADDR2 = ((uintptr_t)adc_buffer >> 0x0F) & 0xFF; + + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_DESTRELOAD_TRANSACTION_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; + + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; +} + +float avrg(uint16_t * values, uint16_t length){ + uint64_t res = 0; + //ommit first and last sample + for(uint16_t i=1; i < length-1; i++){ + res += values[i]; + } + return (float)(res)/(length-2); +} + +ISR(DMA_CH0_vect){ + static uint8_t pin = 0; + + DMA.INTFLAGS |= DMA_CH0TRNIF_bm; // clear flag + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_OFF_gc; + ADCA.CTRLB = 0; // stop ADC + + uint8_t old_pin = pin; + pin=(pin+1)%9; + ADCA.CH0.MUXCTRL = pin << ADC_CH_MUXPOS_gp; // give MUX time to switch during averaging + float temp = avrg(adc_buffer, AVRG); + + temp = temp - ADC_0V_COUNT; + temp = (temp)/ (4096-ADC_0V_COUNT) * ADC_MAX_VOLT; + temp = (temp * REF_OHMS)/(SUPPLY_VOLTS - temp); + temp = (temp-100)/0.3927; //pt100 formula + ch_values[old_pin] = temp; + + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; + ADCA.CTRLB = ADC_FREERUN_bm; // start ADC again +} diff --git a/newcode/pt100.h b/newcode/pt100.h new file mode 100644 index 0000000..9f0e13a --- /dev/null +++ b/newcode/pt100.h @@ -0,0 +1,15 @@ +#include + +#define AVRG 512 + +#define SUPPLY_VOLTS 3.3 +#define REF_OHMS 993.5 + +#define ADC_0V_COUNT 170 +#define ADC_MAX_VOLT 1.95 + +extern volatile float ch_values[9]; + +void adc_init(void); +void dma_init(void); +float avrg(uint16_t * values, uint16_t length);