AD7799

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 29
Зарегистрирован: Вс янв 03, 2016 07:09:29
Откуда: Казахстан

Сообщение Specelectrokaz »

Привет народ!Всех с наступающим! Сначала к делу: Не могу организовать работу с сигма-дельта ацп AD7799, а точнее если то прочитать данные преобразования. Тензодатчик у меня китайский с сайта "азия-маркет"одноточечный на 350 кг, думаю что он всё-таки 2мв/в.
Питание датчика 4.9 вольт
Между GND и S+ - 2.75 в
Между GND и S- - 2.75 в
Между Е+ и S+ - 2.22 в
Между Е+ и S- - 2.22 в
Между S+ и S- - 0 в(предел тестера 20 в)
Между S+ и S- - 0.01 мв(предел тестера 20 мв)увеличивается при нагрузке
Так вот когда даю ему нагрузку то между S+ и S- миливольты изменяются , а значение ацп: 8388607(0x7FFFFF) стоит на месте, но зато когда давлю снизу вверх (т.е. как бы облегчаю нагрузку на датчик)) ) значение ацп просто показывает 0 и всё, короче либо 8388607(0x7FFFFF) либо 0.Вот такая вот проблема.
Регистр конфигурации настроен по умолчанию на канал AIN1, усиление 128, буфер используется(хотя незнаю для чего этот бит))), поэтому я его не трогал
Вот код:

Код: Выделить всё

void reset_ad7799(void)// функция Reset, перезапуск микросхемы
{
PORTC &=~(1<<0);//низкий уровень на CS ad7799
spi_tx(0xFF);
spi_tx(0xFF);
spi_tx(0xFF);
spi_tx(0xFF);
PORTC |=(1<<0);//высокий уровень на CS ad7799
}

void init_ad7799(void) //настраиваем ad7799
{
	reset_ad7799();//перезапустим ad7799
	_delay_us(500);//время задержки после сброса микросхемы (так написано в даташите)
	PORTC &=~(1<<0);//низкий уровень на CS ad7799
	spi_tx(0x08);	// выбираем mode register (адрес: RS2=0,RS1=0,RS0=1)
	spi_tx(0x00);   // отправляем старший байт в 0
	spi_tx(0x09);	// отправляем младший байт (16.7Hz, 50Hz rejection -> 80db),(FS3 = 1, FS0 = 1) 
	PORTC |=(1<<0);//высокий уровень на CS ad7799
}
В основном цикле опрашиваем бит RDY в регистре статуса о готовности данных:

Код: Выделить всё

while (1) 
   {	
	
		  if (!(status_reg() & 0b10000000))
		  {
			data_adc = spi_rx_data_ad7799();//получаем данные от ацп
			PORTC ^=(1<<3);//моргаем светодиодом для наглядности  
		  }
		  clear_max7219(8);//очистим дисплей от старых показаний
		  chislo_max7219(data_adc);//выводим на индикатор значение ацп  
		 	     
   }
Функции передачи и приёма через SPI и его инициализация:

Код: Выделить всё

void spi_tx(unsigned char c)//передаём один байт
{
	SPDR = c;
	while (!(SPSR&(1<<SPIF)))//ждём окончания передачи байта
	{}
}

volatile unsigned char spi_rx(void)
{
	spi_tx(0x00);//отправляем пустой байт	
	return SPDR;//возвращаем принятый байт данных
	
}
void init_spi(void)
{
	SPCR |= (1<<SPE)|(1<<MSTR);//|(1<<SPR0);//включаем SPI,объявляем ведущим,
	SPCR |= (1<<CPOL)|(1<<CPHA);//режим SPI "3"  
}
Работа с AD7799:

Код: Выделить всё

volatile unsigned long int spi_rx_data_ad7799(void)//функция принятия данных от ацп
{
	volatile unsigned long int result = 0;//переменная где будет храниться результат преобразования (24-бита)
	volatile unsigned char low_byte,average_byte,high_byte;//младший,средний,старший байты данных преобразования
	PORTC &=~(1<<0);//низкий уровень на CS ad7799
	spi_tx(0x58);   // следущая операция будет чтение из регистра данных(R/W=1, RS2=0, RS1=1, RS0=1)
	high_byte = spi_rx();//принимаем старший байт
	average_byte = spi_rx();//принимаем средний байт
	low_byte = spi_rx();//принимаем младший байт
	PORTC |=(1<<0);//высокий уровень на CS ad7799
	result = ((unsigned long int) high_byte << 16) | ((unsigned long int) average_byte << 8) | ((unsigned long int) low_byte);//сшиваем три байта данных в один общий
	return result;//возвращаем результат преобразования
}

volatile unsigned char status_reg(void)//функция чтения регистра статуса
{
	volatile unsigned char h = 0;
	PORTC &=~(1<<0);//низкий уровень на CS ad7799
	spi_tx(0b01000000);//выбираем регистр статуса для его чтения
	h=spi_rx();//читаем регистр статуса
	PORTC |=(1<<0);//высокий уровень на CS ad7799
	return h;
}
Недавно создавал тему о "несовместимости режимов SPI AD7799 и MAX7221", на практике проверено что MAX7221 работает в 3-ем режиме SPI
Прошу помощи мучаюсь уже неделю
если человеку позволить говорить что он думает, то он разучится думать...
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Бесконечная чувствительность АЦП получается когда Vref мало. Для проверки интерфейса можно попробовать режим AVDD monitor.

1 1 1 AVDD monitor Automatically selects gain = 1/6 and internal reference = 1.17 V
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 29
Зарегистрирован: Вс янв 03, 2016 07:09:29
Откуда: Казахстан

Сообщение Specelectrokaz »

если человеку позволить говорить что он думает, то он разучится думать...
Ответить

Вернуться в «AVR»