پاسخ : تاپیک سوالات درباره ADC
متاسفانه در مدهای دیگر هم مشکلات خاصی دیده می شود . پیشنهاد شما برای دقت بیشتر چیست ؟
مقدار AREFA=3.5V
متاسفانه در مدهای دیگر هم مشکلات خاصی دیده می شود . پیشنهاد شما برای دقت بیشتر چیست ؟
مقدار AREFA=3.5V
Config Adca = Single , Convmode = Unsigned , Resolution = 12bit , Dma = Off , Reference = Arefa , Event_mode = None , Prescaler = 8 , _ Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = 0 , Ch1_gain = 1 , Ch1_inp = Single_ended , Mux1 = 0 , Ch2_gain = 1 , Ch2_inp = Single_ended , Mux2 = 0 , _ Ch3_gain = 1 , Ch3_inp = Single_ended , Mux3 = 0 start adca X4_5a6 = Getadc(adca , 0 , 56 ) locate 10,10 lcd x4_5a6
// Written by Ozhan KD (www.knowledgeplus.ir) #include "avr_compiler.h" #include "ff.h" #include "cpu_xm_v1.h" #include "spi_xm_v1.h" #include "timer_xm_v1.h" #include "mmc_xm_v1.h" #include "lcd_v1.h" #include "KEY_7SEG.h" #include "adc_driver.h" FRESULT res; unsigned int nbytes; unsigned int ii; unsigned int iii; FATFS fat; FIL file; //#define _MAX_SS=4096; char path[]="0:/Hamed.txt"; char buffer[1024]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; unsigned int adc_sample;//[255]; unsigned int adc_sample1; unsigned int adc_sample2; unsigned int adc_sample3; volatile bool new_adc=false; volatile unsigned int index=0; //WORDREGISTER(adc_sample_t); extern BYTE CardType; DWORD get_fattime (void) { return ((DWORD)(2012 - 1980) << 25) | ((DWORD)1 << 21) | ((DWORD)1 << 16) | ((DWORD)1 << 11) | ((DWORD)1 << 5) | ((DWORD)2 >> 1); } void ADC_Wait_32MHz(ADC_t * adc) { /* Store old prescaler value. */ uint8_t prescaler_val = adc->PRESCALER; /* Set prescaler value to minimum value. */ adc->PRESCALER = ADC_PRESCALER_DIV8_gc; /* wait 8*COMMON_MODE_CYCLES for common mode to settle*/ delay_us(8*COMMON_MODE_CYCLES); /* Set prescaler to old value*/ adc->PRESCALER = prescaler_val; } void ADC_CalibrationValues_Load(ADC_t * adc) { if(&ADCA == adc){ /* Get ADCACAL0 from production signature . */ adc->CALL = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL0_offset ); adc->CALH = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCACAL1_offset ); }else { /* Get ADCBCAL0 from production signature */ adc->CALL = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCBCAL0_offset ); adc->CALH = SP_ReadCalibrationByte( PROD_SIGNATURES_START + ADCBCAL1_offset ); } } uint8_t SP_ReadCalibrationByte( uint8_t index ) { uint8_t result; /* Load the NVM Command register to read the calibration row. */ NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; result = pgm_read_byte(index); /* Clean up NVM Command register. */ NVM_CMD = NVM_CMD_NO_OPERATION_gc; return result; } uint16_t ADC_ResultCh_GetWord(ADC_CH_t * adc_ch) { /* Clear interrupt flag.*/ adc_ch->INTFLAGS = ADC_CH_CHIF_bm; /* Return result register contents*/ return adc_ch->RES;; } void main() { #define F_CPU 32000000UL OSC.CTRL |= OSC_RC32MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP=CCP_IOREG_gc; CLK.CTRL=CLK_SCLKSEL_RC32M_gc; TCD1_INTCTRLA=TC_OVFINTLVL_LO_gc; TCD1_PER=48000; // overflow time = 1.5 ms TCD1_CTRLA=TC_CLKSEL_DIV1_gc; // Prescaler = 1 PMIC_CTRL=PMIC_LOLVLEN_bm; bool valid_card_f=true; PMIC_CTRL=PMIC_LOLVLEN_bm; unsigned char DIGITS[6]={0,0,0,0,0,0};//hamed unsigned char keycode=2; //unsigned long temp85; //unsigned char ii; ADC_CalibrationValues_Load(&ADCA); //temp85=(SP_ReadCalibrationByte( PROD_SIGNATURES_START + TEMPSENSE1_offset )<<8)+ SP_ReadCalibrationByte( PROD_SIGNATURES_START + TEMPSENSE0_offset ) ; ADC_ConvMode_and_Resolution_Config(&ADCA, ADC_ConvMode_Unsigned, ADC_RESOLUTION_12BIT_gc); ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV512_gc); ADC_Reference_Config(&ADCA, ADC_REFSEL_INT1V_gc); //ADC_TempReference_Enable(&ADCA); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH2, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH3, ADC_CH_INPUTMODE_SINGLEENDED_gc, ADC_CH_GAIN_1X_gc); ADC_Ch_InputMux_Config(&ADCA.CH0, ADC_CH_MUXPOS_PIN0_gc, ADC_CH_MUXNEG_PIN0_gc); ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_CH_MUXPOS_PIN1_gc, ADC_CH_MUXNEG_PIN0_gc); ADC_Ch_InputMux_Config(&ADCA.CH2, ADC_CH_MUXPOS_PIN2_gc, ADC_CH_MUXNEG_PIN0_gc); ADC_Ch_InputMux_Config(&ADCA.CH3, ADC_CH_MUXPOS_PIN3_gc, ADC_CH_MUXNEG_PIN0_gc); //ADC_Ch_Interrupts_Config(&ADCA.CH0, ADC_CH_INTMODE_COMPLETE_gc, ADC_CH_INTLVL_LO_gc); PMIC.CTRL |= PMIC_LOLVLEX_bm; ADC_Enable(&ADCA); ADC_Wait_32MHz(&ADCA); init_7seg(); __enable_interrupt(); show_7seg(DIGITS,0x00,0x00); sei(); init_7seg();//hamed init_key();//hamed ADC_Ch_Conversion_Start(&ADCA.CH0); ADC_Ch_Conversion_Start(&ADCA.CH1); ADC_Ch_Conversion_Start(&ADCA.CH2); ADC_Ch_Conversion_Start(&ADCA.CH3); while(1){ while(keycode!=3){ DIGITS[3]=0; DIGITS[4]=0; DIGITS[5]=0; keycode=get_key(); DIGITS[4]=keycode; } // LCDInit(); hamed DIGITS[0]=1; // LCDGotoXY(0,0); hamed show_7seg(DIGITS,0x00,0x00);//hamed while(get_key()==0x03){ // initialize MMC interface if(disk_initialize(0)) { //hamed LCDStringRam("NoCARD"); DIGITS[0]=2; show_7seg(DIGITS,0x00,0x00); valid_card_f=false; } else { switch(CardType) { case(CT_MMC): //hamed LCDStringRam("mmc-V3"); DIGITS[1]=3; show_7seg(DIGITS,0x00,0x00); break; case (CT_SD1): DIGITS[1]=4; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("SDC-V1"); break; case (CT_SD2): DIGITS[1]=5; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("SDC-V2"); break; case (CT_SDC): DIGITS[1]=6; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("SDC- "); break; case (CT_BLOCK): DIGITS[1]=7; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("BLOCK "); valid_card_f=false; break; case (CT_SDHC): DIGITS[1]=8; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("SDHC "); break; default: DIGITS[1]=9; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("BLOCK "); valid_card_f=false; } } if(valid_card_f) { //hamed LCDGotoXY(0,1); if ((res=f_mount(0,&fat))==FR_OK) {DIGITS[2]=1; show_7seg(DIGITS,0x00,0x00); //hamed LCDStringRam("Mount OK"); if ((res=f_open(&file,path,FA_CREATE_ALWAYS|FA_WRITE|FA_READ))==FR_OK) {DIGITS[2]=2; show_7seg(DIGITS,0x00,0x00); //hamed LCDGotoXY(0,2); //hamed LCDStringRam("File Opened"); for(iii=0;iii<1000;iii++){ new_adc=false; if ((res=f_write(&file,buffer,sizeof(buffer)-1,&nbytes))==FR_OK) { } else{ DIGITS[2]=5; show_7seg(DIGITS,0x00,0x00);}// hamed LCDStringRam("Write Error"); }} DIGITS[2]=5; show_7seg(DIGITS,0x00,0x00); f_close(&file); f_mount(0, NULL); } else {DIGITS[2]=6;show_7seg(DIGITS,0x00,0x00);} //hamed LCDStringRam("Mount Error"); } } } } // TCD1 overflow interrupt routine #pragma vector= TCD1_OVF_vect __interrupt void TCD1_overflow(void) { adc_sample=ADC_ResultCh_GetWord(&ADCA.CH0);//adc_sample adc_sample1=ADC_ResultCh_GetWord(&ADCA.CH1);//adc_sample adc_sample2=ADC_ResultCh_GetWord(&ADCA.CH2);//adc_sample adc_sample3=ADC_ResultCh_GetWord(&ADCA.CH3);//adc_sample buffer[8*index]=adc_sample<<8; buffer[8*index+1]=adc_sample; buffer[8*index+2]=adc_sample1<<8; buffer[8*index+3]=adc_sample1; buffer[8*index+4]=adc_sample2<<8; buffer[8*index+5]=adc_sample2; buffer[8*index+6]=adc_sample3<<8; buffer[8*index+7]=adc_sample3; if(++index==128){index=0;new_adc=true;}; ADC_Ch_Conversion_Start(&ADCA.CH0); ADC_Ch_Conversion_Start(&ADCA.CH1); ADC_Ch_Conversion_Start(&ADCA.CH2); ADC_Ch_Conversion_Start(&ADCA.CH3); }
while(get_key()==0x03){
دیدگاه