پاسخ : تاپیک سوالات درباره 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){


دیدگاه