Не могу найти те сорцы - поспрошай у 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, ну и заметно зависят(!!) от входного напряжения (по каждому входу), т.е. разница может быть существенной. Но с буфером не так уж всё и плохо. Лучшие характеристики получались, когда синфазное где-то ближе к половине питания.