ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
13 ноября
120335 Топик полностью
Vit (15.05.2008 11:21, просмотров: 140) ответил Overheat на от самокалибровки у нас не зависит. скачет как с ней так и без нее.
Не могу найти те сорцы - поспрошай у koyodza - может у него чего осталось. Вот недавно делал аналог CS5505 (16-бит АЦП от бывшего Crystal). Особенного вроде ничего не делал typedef int bool; #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE (!FALSE) #endif // ADC0CN bits definition #define AD0POL_BIT 4 #define AD0BCE_BIT 3 #define AD0GN_BITS 0 #define AD0GN_1 0 #define AD0GN_2 1 #define AD0GN_4 2 #define AD0GN_8 3 #define AD0GN_16 4 #define AD0GN_32 5 #define AD0GN_64 6 #define AD0GN_128 7 //ADC0MD bits definition #define AD0EN_BIT 7 #define AD0SM_BITS 0 #define AD0SM_IDLE 0 #define AD0SM_FULL_INT_CAL 1 #define AD0SM_SINGLE_CONV 2 #define AD0SM_CONTINUE_CONV 3 #define AD0SM_INT_OFFSET_CAL 4 #define AD0SM_INT_GAIN_CAL 5 #define AD0SM_SYS_OFFSET_CAL 6 #define AD0SM_SYS_GAIN_CAL 7 //ADC0BUF bits definition #define AD0BPHE_BIT 7 #define AD0BPLE_BIT 6 #define AD0BPS_BITS 4 #define AD0BNHE_BIT 3 #define AD0BNLE_BIT 2 #define AD0BNS_BITS 0 #define AD0BXS_BYPASS_INP_BUF 0 #define AD0BXS_SELECT_LOW_INP_BUF_RANGE 1 #define AD0BXS_SELECT_HIGH_INP_BUF_RANGE 2 //ADC0MUX #define AD0PSEL_BITS 4 #define AD0NSEL_BITS 0 #define AD0XSEL_AIN0_0 0 #define AD0XSEL_AIN0_1 1 #define AD0XSEL_AIN0_2 2 #define AD0XSEL_AIN0_3 3 #define AD0XSEL_AIN0_4 4 #define AD0XSEL_AIN0_5 5 #define AD0XSEL_AIN0_6 6 #define AD0XSEL_AIN0_7 7 #define AD0XSEL_AGND 8 #define AD0XSEL_TEMPERATURE_SENSOR 0x0f //ADC0CF #define AD0ISEL_BIT 4 /* 0 - SINC3 filter; 1 - FAST filter */ #define AD0VREF_BIT 2 /* 0 - Internal VREF; 1 - External VREF */ //ADC0STA #define AD0BUSY_BIT 7 #define AD0CBSY_BIT 6 #define AD0INT_BIT 5 #define AD0S3C_BIT 4 #define AD0FFC_BIT 3 #define AD0CALC_BIT 2 #define AD0ERR_BIT 1 #define AD0OVR_BIT 0 //REF0CN #define BIASE_BIT 1 #define REFBE_BIT 0 void ADC_Init() { ADC0CN = (0<<AD0POL_BIT)|(0<<AD0BCE_BIT)|(AD0GN_1<<0);//Unipolar, BurnOut Current Disable, Gain = 1 ADC0MD = (1<<AD0EN_BIT)|(AD0SM_IDLE<<AD0SM_BITS);//0x80; ADC0BUF = (1<<AD0BPHE_BIT)|(0<<AD0BPLE_BIT)|(AD0BXS_SELECT_HIGH_INP_BUF_RANGE<<AD0BPS_BITS);//0xA0; ADC0MUX = (AD0XSEL_AIN0_0<<AD0PSEL_BITS)|(AD0XSEL_AIN0_1<<AD0NSEL_BITS);//0x01; ADC0CF = (0<<AD0ISEL_BIT)|(0<<AD0VREF_BIT); } void Voltage_Reference_Init() { REF0CN = (1<<BIASE_BIT)|(1<<REFBE_BIT);//= 0x03; } void ADC_Start_Run(void){ ADC0CF = (0<<AD0ISEL_BIT)|(0<<AD0VREF_BIT); ADC0MD |= (AD0SM_SINGLE_CONV<<AD0SM_BITS);//(1<<AD0EN_BIT)| } void ADC_Start_Calibration(void){ ADC0CF = (0<<AD0ISEL_BIT)|(0<<AD0VREF_BIT); ADC0MD |= (AD0SM_FULL_INT_CAL<<AD0SM_BITS);//(1<<AD0EN_BIT)| } bool Get_ADC_Cal_Complete(void){ while(!(ADC0STA & (1<<AD0CALC_BIT))); return TRUE; } bool Get_ADC_Ready(void){ return (!!(ADC0STA & (1<<AD0INT_BIT))); } void ADC_Clear_InterruptFlag(void){ ADC0STA &= ~(1<<AD0INT_BIT);//clear interrupt flag } Порядок далее был такой { unsigned char ADC_Data_Hi; unsigned char ADC_Data_Lo; Voltage_Reference_Init(); ADC_Init(); ADC_Start_Calibration(); Get_ADC_Cal_Complete(); // цикл измерения ADC_Start_Run(); //дальше где-то выполняется проверка if(Get_ADC_Ready()){ if(ADC0CF&(1<<AD0ISEL_BIT)){ ADC_Data_Hi = ADC0FH; ADC_Data_Lo = ADC0FM; }else{ ADC_Data_Hi = ADC0H; ADC_Data_Lo = ADC0M; } ADC_Clear_InterruptFlag(); } } Что касается входных токов, то они просто у этого АЦП большие, по сравнению с теми же AD7714, ADS1241, ADS1217, ну и заметно зависят(!!) от входного напряжения (по каждому входу), т.е. разница может быть существенной. Но с буфером не так уж всё и плохо. Лучшие характеристики получались, когда синфазное где-то ближе к половине питания.