Привет народ!Всех с наступающим! Сначала к делу: Не могу организовать работу с сигма-дельта ацп 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, буфер используется(хотя незнаю для чего этот бит))), поэтому я его не трогал
Вот код:
В основном цикле опрашиваем бит RDY в регистре статуса о готовности данных:
Функции передачи и приёма через SPI и его инициализация:
Работа с AD7799:
Недавно создавал тему о "несовместимости режимов SPI AD7799 и MAX7221", на практике проверено что MAX7221 работает в 3-ем режиме SPI
Прошу помощи мучаюсь уже неделю
Питание датчика 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
}Код: Выделить всё
while (1)
{
if (!(status_reg() & 0b10000000))
{
data_adc = spi_rx_data_ad7799();//получаем данные от ацп
PORTC ^=(1<<3);//моргаем светодиодом для наглядности
}
clear_max7219(8);//очистим дисплей от старых показаний
chislo_max7219(data_adc);//выводим на индикатор значение ацп
}
Код: Выделить всё
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"
}
Код: Выделить всё
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;
}
Прошу помощи мучаюсь уже неделю
если человеку позволить говорить что он думает, то он разучится думать...
