Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: помогите с АЦП AD7708
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
ST_Senya
Люди помогите разобраться с данными АЦП. Интерфейс у них SPI, вроде проинициализировал по дату шиту, она мне даж ответила, а вот данные не фига не читаются, делаю по нарисованной блок схеме всё вроде, но не фига.... Кто ни то может быть уже работал с данными АЦП???
Mik174
Цитата(ST_Senya @ Dec 2 2009, 17:50) *
Люди помогите разобраться с данными АЦП. Интерфейс у них SPI, вроде проинициализировал по дату шиту, она мне даж ответила, а вот данные не фига не читаются, делаю по нарисованной блок схеме всё вроде, но не фига.... Кто ни то может быть уже работал с данными АЦП???


Если хотите, чтобы Вам ответили, уточняйте вопрос:
1) приведите схему (не забудьте преобразовать ее в формат поменьше размером - 3-4 Мб далеко не все станут открывать, чтобы посмотреть на Вашу схему). На схеме укажите тип использованного Вами микроконтроллера.
2) покажите текст программы, которую Вы написали. Не забудьте указать, каким компилятором пользуетесь.
3) поясните, что тем самым хотели получить, и что получилось
MrYuran
Нажмите для просмотра прикрепленного файла
Если что, извиняйте, писалось из последних сил в период творческого кризиса laughing.gif
Заточено под MSP430, но это легко поправимо в hard.h
ST_Senya
Спросить про последовательность инициализации хочу и чтения данных:

Инициализация:
1) записываем значение в регистр I/O control register (в моём случае 0x00)
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра I/O, и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр I/O соответствующего значения)
г) деселект АЦП (чип селект в 1)

2) записываем значение в регистр Filter register (в моём случае 0x45, взял с бухты барахты по даташиту), типо выставляем скорость выборки при непрерывной выборке
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Filter register, и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр Filter register соответствующего значения)
г) деселект АЦП (чип селект в 1)

3) записываем значение в регистр ADC cotrol register (ADCCON) (в моём случае 0x2F, 2 - это типо 3й канал, F - это типо что напряжение будет от -2..+2 с небольшим, и то что оно будет унипалярное)
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра ADC cotrol register (ADCCON), и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр ADC cotrol register (ADCCON) соответствующего значения)
г) деселект АЦП (чип селект в 1)

4) записываем значение в регистр Mode register (в моём случае 0x06, 0 - это типо xчоп дизейбл, небуфферизировать (не понял чё это вообще такое), использовать REF1, выбрать 8 каналов, 6 - это типо осцилятор будет всегда включён, и то что выбран режим System Zero-Scale Calibration
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Mode register, и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр Mode register соответствующего значения)
г) деселект АЦП (чип селект в 1)

5)читаем значение из регистра Mode register, нужно что бы биты MD2,MD1,MD0 в данном регистре равнялись 0,0,1
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Mode register, и то что будет производится чтение данных)
в) выкидываем в SPI байт (для чтения из регистра Mode register соответствующего значения)
г) деселект АЦП (чип селект в 1)

если типо биты MD2,MD1,MD0== 0,0,1 , то всё ок, продолжаем инициализацию дальше, иначе ошибка.

6)записываем значение в регистр Mode register (в моём случае 0x07, 0 - это типо xчоп дизейбл, небуфферизировать (не понял чё это вообще такое), использовать REF1, выбрать 8 каналов, 6 - это типо осцилятор будет всегда включён, и то что выбран режим System FULL-Scale Calibration
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Mode register, и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр Mode register соответствующего значения)
г) деселект АЦП (чип селект в 1)

7)читаем значение из регистра Mode register, нужно что бы биты MD2,MD1,MD0 в данном регистре равнялись 0,0,1
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Mode register, и то что будет производится чтение данных)
в) выкидываем в SPI байт (для чтения из регистра Mode register соответствующего значения)
г) деселект АЦП (чип селект в 1)

если типо биты MD2,MD1,MD0== 0,0,1 , то всё ок, инициализация завершена.

Вот такая вот у меня инициализация, тут чего то нехватать, так как она не всегда сразу срабатывает, вопрос вот только чего, задержки?? мейби? и сразу вопрос что за буфферизация такая бит NEGBUF в регистре Mode register, что она делает и нафига нужна, и что за 8 канальный или 10 канальный режим работы, это типо бит CHCON, в том же регистре Mode register, тут я так понимаю разница то не только в двух каналах, просто перевести нормально никак не могу, обьясните мне плиз что и как тут, если несложно..

Чтение данных:
1)записываем значение в регистр Mode register (в моём случае 0x02, 0 - это типо xчоп дизейбл, небуфферизировать (не понял чё это вообще такое), использовать REF1, выбрать 8 каналов, 2 - это типо осцилятор будет всегда включён, и то что выбран режим Syngle Conversion Mode
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Mode register, и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр Mode register соответствующего значения)
г) деселект АЦП (чип селект в 1)

2) записываем значение в регистр ADC cotrol register (ADCCON) (в моём случае 0x2F, 2 - это типо 3й канал, F - это типо что напряжение будет от -2..+2 с небольшим, и то что оно будет унипалярное)
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра ADC cotrol register (ADCCON), и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для записи в регистр ADC cotrol register (ADCCON) соответствующего значения)
г) деселект АЦП (чип селект в 1)

3)читаем значение из регистра Status register пока бит RDY в данном регистре не опустится в ноль, что будет означать готовность к чтению данных.
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра Status register, и то что будет производится чтение данных)
в) выкидываем в SPI байт (для чтения из регистра Status register соответствующего значения)
г) деселект АЦП (чип селект в 1)

4) Если бит RDY опустился в ноль то можно читать данные из регистра ADC data register
для этого:
a) выбираем АЦП (чип селект в 0)
б) выкидываем в SPI байт (в нём адрес решистра ADC data register, и то что будет производится запись в данный регистр)
в) выкидываем в SPI байт (для чтения из регистра ADC data register соответствующего значения), типо младшего байта или старшего,
г)выкидываем в SPI байт (для чтения из регистра ADC data register соответствующего значения), типо старшего байта или младшего,
Таким образом получаем 16 бит данных, 16ти разрядное АЦП то
г) деселект АЦП (чип селект в 1)

Вот тут я получаю в ответ вообще одни FF скажите в чём моя ошибка, всё ли так я делаю??? очень помощь нужна




Вот сам код мой)
Так значит вот код:

//Адреса регистров ADC
#define COMMUNICATIONS_R 0x00//Communications register
#define STATUS_R 0x00//Status register
#define MODE_R 0x01//Mode register
#define ADC_CONTROL_R 0x02//ADC cotrol register (ADCCON)
#define FILTER_R 0x03//Filter register
#define DATA_R 0x04//ADC data register
#define OFFSET_R 0x05//ADC offset register
#define GAIN_R 0x06//ADC gain register
#define IO_CONTROL_R 0x07//I/O control register
#define TEST1_R 0x0C//TEST1 register
#define TEST2_R 0x0D//TEST2 register
#define ID_R 0x0F//ID register

//Биты соответствующих регистров
#define READ 0x40//бит чтения в Communications register
#define WRITE 0x00//бит записи в Communications register

#define RDY 7//7 бит регистра status

//Биты в Mode register
#define CHOP_ON 0x00//выше скорость, но меньше частота
#define CHOP_OFF 0x80//ниже скорость, но больше частота
#define NEGBUF_ON 0x40//buffered
#define NEGBUF_OFF 0x00//unbuffered
#define REFSEL_ON 0x20//Select REFIN2(+),REFIN2(-)
#define REFSEl_OFF 0x00//Select REFIN1(+),REFIN1(-)
#define CHCON_ON 0x10//10-channel configuretion
#define CHCON_OFF 0x00//8-channel configuretion
#define OSCPD_ON 0x08//oscillator shut off
#define OSCPD_OFF 0x00//oscillator not shut off
#define POWER_DOWN_MODE 0x00
#define IDLE_MODE 0x01
#define SINGLE_CONVERSION_MODE 0x02
#define CONTINUOUS_CONVERSION_MODE 0x03
#define SYSTEM_ZERO_SCALE_CALIBRATION 0x06
#define SYSTEB_FULL_SCALE_CALIBRATION 0x07

sbit CSbitADC=P0^3;//нога отвечающая за активизацию (выбор) АЦП
#define SELECT_ADC() CSbitADC=0;//CS enable
#define DESELECT_ADC() CSbitADC=1;//CS disable

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef enum { FALSE = 0, TRUE } BOOL;

//установка нужного бита в регисре
#define SET_BIT(reg_,bit_) ((reg_)|=1<<(bit_))
//очистка нужного бита в регистре
#define CLEAR_BIT(reg_,bit_) ((reg_)&=~1<<(bit_))
//установлен ли в регистре проверяемый бит в 1
#define IS_SET(reg_,bit_) ((reg_)&1<<(bit_))

//Функция обмена байтами между контроллером и АЦП по SPI
//Вход: one_char - передаваемый символ
//Выход: принимаемый символ
BYTE ExchangeBySPI(const BYTE one_char)
{
SPI0DAT=one_char;
while(!SPIF);
SPIF=0;
return (BYTE)SPI0DAT;
}

//Функция чтения регистра АЦП
//Вход: name_reg - имя регистра АЦП
//Выход: значение прочитанного регистра
BYTE ReadRegADC(BYTE name_reg)
{
SELECT_ADC();//Чип селект
ExchangeBySPI(name_reg | READ);//выбор регистра для работы
name_reg=ExchangeBySPI(0xFF);//чтение данных из регистра
DESELECT_ADC();//И деселект чипа
return (name_reg);
}

//Функция записи в регистр АЦП нужного значения
//Вход: name_reg - имя регистра АЦП
// data_reg - записываемое значение
void WriteRegADC(BYTE name_reg,const BYTE data_reg)
{
SELECT_ADC();//Чип селект
ExchangeBySPI(name_reg | WRITE);//выбор регистра для работы
ExchangeBySPI(data_reg);//запись данных в регистр
DESELECT_ADC();//И деселект чипа
}

//Функция инициализации одного канала АЦП
//Вход: value_ADCCON - значение записываемое в регистр ADCCON
// value_MODER - значение записываемое в регистр MODE
//Выход: TRUE - инициализация прошла успешно
// FALSE - ошибка инициализации
BOOL InitOneChannelADC(BYTE value_ADCCON,BYTE value_MODER)
{
BYTE time=255;//тайм аут

WriteRegADC(ADC_CONTROL_R,value_ADCCON);//конфигурируем ADCCON
WriteRegADC(MODE_R,(value_MODER|0x56));//конфигурируем MODE
//pause(64000);
do
if ((ReadRegADC(MODE_R)&0x07)==1)//MD bits 001?
{
time=255;
WriteRegADC(MODE_R,(value_MODER|0x57));
do
if ((ReadRegADC(MODE_R)&0x07)==1)//MD bits 001?
return TRUE;
while (time--);
return FALSE;
}
while (time--);
return FALSE;
}

//Функция инициализации микросхемы АЦП
//Выход: TRUE - инициализация прошла успешно
// FALSE - ошибка инициализации
BOOL InitADC()
{

WriteRegADC(IO_CONTROL_R,0x00);//конфигурируем IOCON
WriteRegADC(FILTER_R,0x45);//конфигурируем FILTER
if (InitOneChannelADC(0x2F,0x56))//инициализируем 3й канал
return TRUE;
return FALSE;
}

//Функция чтения данных с одного канала АЦП
//Вход: number_channel - номер канала АЦП
// *data_ - указатель на данные
//Выход: TRUE - чтение данных прошло успешно
// FALSE - ошибка чтения данных
BOOL ReadDataChannel(BYTE number_channel,WORD *data_)
{
BYTE time=255;//тайм аут

WriteRegADC(MODE_R,0x52);
WriteRegADC(ADC_CONTROL_R,(((number_channel-1)&0x03)<<4)| 0x0F);
do
if (!(IS_SET(ReadRegADC(STATUS_R),RDY)))
{
SELECT_ADC();
ExchangeBySPI(DATA_R | READ);
*data_=ExchangeBySPI(0xFF);
*data_=((*data_)<< | (ExchangeBySPI(0xFF));
DESELECT_ADC();
return TRUE;
}
while (time--);
}

void main()
{
BOOL test_ADC;
test_ADC=InitADC();

while(1)
{
test_ADC=ReadDataChannel(3,&dataADC);

}
}


Вобщем на всё это дело я получаю инициализацию через раз, походу микросхема не всегда срабатыввает, мейби сначала ресет дёрнуть, перед тем как проинициализировать??? ну а счтением данных вообще беда, одни FF. то что SPI сам работет эт проверено осцилографом, да и микросхма то инициализируется, помогите плиз)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.