Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Удаленная работа
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 26.11.2009, 15:52  
ST_Senya
Временная регистрация
 
Регистрация: 17.11.2007
Сообщений: 67
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
ST_Senya на пути к лучшему
По умолчанию Помогите с ЦАП AD7708/AD7718 или их аналогами

Люди помогите разобраться с данными АЦП, можно на примере других, т.к. я первый раз работаю с АЦП вообще. Но желательно конечно этими. Интерфейс у них SPI, вроде проинициализировал по дату шиту, она мне даж ответила, а вот данные не фига не читаются, делаю по нарисованной блок схеме всё вроде, но не фига.... Кто ни то может быть уже работал с данными АЦП???
Реклама:

Последний раз редактировалось ST_Senya; 26.11.2009 в 19:50.
ST_Senya вне форума  
Непрочитано 28.11.2009, 23:32  
Mark07
Частый гость
 
Регистрация: 06.01.2007
Сообщений: 15
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
Mark07 на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Абсолютно аналогичный случай, только с AD7705. Есть ответ, а читаются одни ноли. Сам в тупике.
Mark07 вне форума  
Непрочитано 29.11.2009, 00:36  
Gnider
Почётный гражданин KAZUS.RU
 
Регистрация: 30.06.2005
Сообщений: 3,401
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
Gnider на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Выставляйте правильно режим,частоту и все будет ок.
Фрагмент кода в студию
Gnider вне форума  
Непрочитано 29.11.2009, 12:43  
ST_Senya
Временная регистрация
 
Регистрация: 17.11.2007
Сообщений: 67
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
ST_Senya на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Фрагмент кода завтра скину. А скажите правильную последовательность действий для инициализацию, и чтение данных?, хотя бы пока на словах, даташитку читал, и делал вроде всё по блок-схемам... кстати в названии темы надо исправить ЦАП на АЦП))))
ST_Senya вне форума  
Непрочитано 29.11.2009, 14:28  
Gnider
Почётный гражданин KAZUS.RU
 
Регистрация: 30.06.2005
Сообщений: 3,401
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
Gnider на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Правильная последовательность есть как раз в даташите.
Вспомнить не могу. Но у меня работало на ура
Gnider вне форума  
Непрочитано 30.11.2009, 16:24  
ST_Senya
Временная регистрация
 
Регистрация: 17.11.2007
Сообщений: 67
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
ST_Senya на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Так значит вот код:

//Адреса регистров 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 сам работет эт проверено осцилографом, да и микросхма то инициализируется, помогите плиз)

Последний раз редактировалось ST_Senya; 30.11.2009 в 16:31.
ST_Senya вне форума  
Непрочитано 30.11.2009, 17:13  
ST_Senya
Временная регистрация
 
Регистрация: 17.11.2007
Сообщений: 67
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
ST_Senya на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Кстати получение данных происходит за два присеста, так? какой байт получаем первым, старший или младший?
ST_Senya вне форума  
Непрочитано 30.11.2009, 17:25  
Gnider
Почётный гражданин KAZUS.RU
 
Регистрация: 30.06.2005
Сообщений: 3,401
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
Gnider на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Могу привести пример работающего кода чтения AD7709

#define WAITAD7709_BUSY while((SSPSR&0x10))

unsigned long AD7709_RW(char size, unsigned long value)
{
signed char i;
unsigned long ret_value = 0;
long j;

WAITAD7709_BUSY;


AD7709_CS_ON;
size--;
for (i = (size ‹‹ 3); i ›= 0; i -=
{

SSPDR = (value ›› i) & 0xFF;
WAITAD7709_BUSY;
ret_value += ((SSPDR & 0xFF) ‹‹ i);
}

AD7709_CS_OFF;

return ret_value;
}
Gnider вне форума  
Непрочитано 30.11.2009, 18:51  
ST_Senya
Временная регистрация
 
Регистрация: 17.11.2007
Сообщений: 67
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
ST_Senya на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами

Вот у меня вопрос, что вот это такое WAITAD7709_BUSY;? у меня в 7708, флаг RDY, в регистре статуса, типо если он сбрасывается в ноль то можно читать данные из АЦП.

Спросить про последовательность инициализации хочу и чтения данных:

Инициализация:
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 скажите в чём моя ошибка, всё ли так я делаю??? очень помощь нужна
ST_Senya вне форума  
Сказали "Спасибо" ST_Senya
Vladislav_78 (01.02.2017)
Непрочитано 30.11.2009, 19:03  
Gnider
Почётный гражданин KAZUS.RU
 
Регистрация: 30.06.2005
Сообщений: 3,401
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
Gnider на пути к лучшему
По умолчанию Re: Помогите с ЦАП AD7708/AD7718 или их аналогами



Жизнь слишком коротка чтобы читать такие сообщения в форумах.

WAITAD7709_BUSY это мы ждем когда данные по СПИ передадуться.
Чипселект ставиться перед началом первого байта,а убираеться в конце последнего. между байтам чипселект убирать не надо.

Насчет инициализации
У меня она вот так была
AD7709_RW(2, 0x220D);
Это значит послать 2 байта , а 0x220D это и есть эти 2 байта.
Потом шлю
AD7709_RW(4,0x0118004C);

Здесь выбираю канал и стартую измерения - шлю 4 байта.
Gnider вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Друзья помогите со схемой ЦАП для стыковки PC-TV Pangolin Поиск схем. Делимся схемами 4 09.10.2009 11:32


Часовой пояс GMT +4, время: 18:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot