реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AD7792 + Atmega128A (AVR Studio 5) // программирование на Си, Помогите новичку
ADEPTPS
сообщение Dec 13 2011, 05:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683



И так у меня есть АЦП AD7792 и Atmega128A, собственно говоря пользуюсь я отладочной платой AS-megaCU
В качестве среды программирование использую AVR Studio 5 совместно с JTAGICE3, программирование естественно на Си.

Помогите люди добрые) Чего-то как ни сижу все какую-то лажу читаю с АЦП.
Go to the top of the page
 
+Quote Post
add
сообщение Dec 13 2011, 06:13
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Фключаю телепатию......
Тыкс.. что мы видим... ?
Бит VBIAS1– в конфигурационном регистре АЦП AD7792 вроде прально установлен....
Сканирую дальше...
Искажение сигнала на входе небольшое.. на "лажу " они влиять не могу...
тыкс...
Скорее дело в регистрах Атмеги.... что то шар предсказаний мне говорит что регистр UPM11 шалит...
Нужно править карму... без этого никак.. :-)
Сори за оффтоп неудержалси)))
Далее следует поучение (с важным видом и раздуванием щек): Правильно заданный вопрос- это половина ответа!! Опишите подробно что и как вы делаете, и где конкретно у вас идет "лажа".
ps: еще есть правила форума. Почитайте, лишним не будет.
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Dec 13 2011, 06:24
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683



Не люблю читать правила, но их соблюдаю!
Проблема в том-что с АЦП толком ничего считать не могу!
Подпрограмма обслуживания АЦП:
CODE
#include <avr/io.h>
#include <avr/delay.h>
#include "spi.c"
#include <string.h>
//Начальная инициализация АЦП:
//Сброс АЦП. 16 клоков
void adc_init(void)
{
SPI_MasterInit();
SPI_MasterTransmit(0xFF);
SPI_MasterTransmit(0xFF);

_delay_ms(1); //Пауза
//Настройка внутреностей
//IO REG
SPI_MasterTransmit(0b00101000); //28h
_delay_us(5);
SPI_MasterTransmit(0b00000000); //Опора отключенна
}
//Выбор канала АЦП:
void ADC_configure_chanel(unsigned char Ch)
//Ch - номер канала, от 1 до 2 - входы, 3 - внутрений датчик температуры
{
//Config REG

SPI_MasterTransmit(0b00010000); // 10h
_delay_us(5);
// ch Ch
// __ * ___ 0b0100111010010000
if (Ch==1) SPI_MasterTransmit(0b0000000000010000);//GAIN=32=39.06 V; Vbias=-AN1; ref=internal; buf=on
if (Ch==2) SPI_MasterTransmit(0b0000010100010000); //GAIN=32=78.125mV; Vbias=-AN2; ref=internal; buf=on
if (Ch==3) SPI_MasterTransmit(0b0100111110010110);//GAIN=1/6 ref=1.17V
_delay_us(5);
}
//Самокалибровка:
void ADC_Calibrate(void)
{

//Mode REG
SPI_MasterTransmit(0b00001000); //08h
_delay_us(5);
// 0b1000000000001111
SPI_MasterTransmit(0b1000000000000010); //Калибровка нуля

//Mode REG
SPI_MasterTransmit(0b00001000); //08h
_delay_us(5);
SPI_MasterTransmit(0b1010000000000010); //Калибровка шкалы
_delay_us(5);
}
//Запуск непрерывного преобразования:
void ADC_Start_Continuous_Conversion_Mode(void)
{

//Mode REG
SPI_MasterTransmit(0b00001000); //08h
_delay_us(5);
SPI_MasterTransmit(0b0000000000000010); //Cont. conv.
_delay_us(5);
}
//Чтение результатов преобразования из АЦП:
unsigned int adc_read(void)
{
//Читаем
//DATA REG
unsigned int adc1;
unsigned int adc2;
unsigned int adc;

SPI_MasterTransmit(0xFF);
SPI_MasterTransmit(0x58); //58h
_delay_us(5);


adc = SPDR;
SPI_MasterTransmit(0x00);
adc2 = SPDR;
adc <<= 8;
adc |= adc2;
return adc;
}


Вот на суд общественности еще и главную программу:
CODE
main(void)
{
char *text[6];
unsigned int n=0;
double adc;
lcd_init();
adc_init();
ADC_configure_chanel(1);
ADC_Calibrate();
ADC_Start_Continuous_Conversion_Mode();
while (1)
{
adc = 0;
for (n=1;n<=300;n++)
{
adc = adc + adc_read()*2.5/0xFFFF;
}
adc = adc/300;
dtostrf(adc,6,2,text);
lcd_send(COMMAND, LCD_CLEAR);
DDRD = (1 << 4);
lcd_write(text);
DDRD = 0x00;
}

}


Сообщение отредактировал IgorKossak - Dec 13 2011, 07:12
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
add
сообщение Dec 13 2011, 09:18
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Вот наковырял свою инициализацию преобразования (писал правда давно, и на асме):

Код
config_register_1        =0x0000

adc77_write_byte 0x10
adc77_write_word config_register_1
adc77_write_byte 0x08
adc77_write_byte high(0x200a)
adc77_write_byte low(0x200a)
adc77_wait_rdy
adc77_write_byte 0x58
adc77_read_byte
adc77_read_byte


А для ресета , если не ошибаюсь нужно 32 раза дернуть клоком.
Вообще у AD доки неплохие. Все подробно расписано. Нужно просто почитать внимательно.
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Dec 13 2011, 09:46
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683



спасибо, кто еще что-нибудь предложит....

Хотелось бы услышать замечания конкретно по моей реализации!
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Dec 23 2011, 10:24
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683



Вот мои последние наработки:
Посмотрите пожалуйста мой код, если не трудно, на мой взгляд проблема в настройке SPI:
это подпрограмма для инициализации и считывания данных с АЦП AD7792.
Помогите пожалуйста!

CODE
#include <avr/io.h>
#include <avr/delay.h>
#include <string.h>
#include <avr/sfr_defs.h>
void spi_in(void)
{
#define DDR_SPI DDRB
#define DD_SS 0
#define DD_MOSI 2
#define DD_MISO 3
#define DD_SCK 1
#define SPE 6
#define MSTR 4
#define SPR0 0
#define SPIF 7
PORTB |= (1<<DD_SCK)|(1<<DD_MOSI)|(1<<DD_MISO);
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_MISO);
DDR_SPI &= ~(1<<DD_MISO);
//SPSR |= (1<<SPI2X);
SPCR |= (1<<SPE)|(1<<MSTR);
}

uint8_t spi_rw(uint8_t Data)
{
SPDR = Data;//начинаем передачу
while((SPSR & (1<<SPIF)) == 0);//ждем пока передача завершится
Data = SPDR;
return Data;
}

//Инициализация АЦП
void ad7793_init(void)
{
int8_t i;
spi_in();
for (i = 0; i < 4;i++) spi_rw(0xFF);
/* настройка АЦП */
spi_rw(0b00010000);
spi_rw(0b00010000);
spi_rw(0b00000000);
spi_rw(0b00101000);
spi_rw(0b00000000);
/* Калибровка */
spi_rw(0b00001000);
spi_rw(0b11000000);
spi_rw(0b10000001);
_delay_ms(10);
loop_until_bit_is_clear(PORTB,DD_MISO);
spi_rw(0b00001000);
spi_rw(0b10100000);
spi_rw(0b10000001);
_delay_ms(10);
loop_until_bit_is_clear(PORTB,DD_MISO);
}

//Установка режима работы
void ad7793_mode_set(unsigned char mode)
{
spi_rw(0b00001000);
if (mode == 0)
{
spi_rw(0b00000000);
}
else spi_rw(0b00100000);
spi_rw(0b10000001);
}

uint16_t ad7793_data_get(void)
{
uint16_t t = 0;
loop_until_bit_is_clear(PORTB,DD_MISO);
spi_rw(0x58);
*((uint8_t *)(&t) + 1) = spi_rw(0xFF);
*((uint8_t *)(&t)) = spi_rw(0xFF);
return t;
}
Go to the top of the page
 
+Quote Post
Tolyaha
сообщение Dec 23 2011, 11:33
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 116
Регистрация: 2-03-07
Из: Украина
Пользователь №: 25 826



Цитата(ADEPTPS @ Dec 13 2011, 11:46) *
спасибо, кто еще что-нибудь предложит....

CODE
SendByteAD(0xff);// сброс АЦП (4 посылки 0xff)
SendByteAD(0xff);
SendByteAD(0xff);
SendByteAD(0xff);
...
// ожидаем 500 mks инициализацию АЦП
...
SendByteAD(0x10);//настройка АЦП для записи в CONFIG регистр
SendByteAD(0x00);//запись в CONFIG регистр HB (усиление 1)
SendByteAD(0x10);//запись в CONFIG регистр LB (1 канал с буфером)
SendByteAD(0x08);//настройка АЦП для записи в MODE регистр
SendByteAD(0x20);//апись в MODE регистр HB (Single Conversion)
SendByteAD(0x01);//запись в MODE регистр LB (Int 70 kHz Clock, 4 ms conversion)
...
// ожидаем 5000 mks преобразование АЦП
...
SendByteAD(0x58);//настройка АЦП для чтения данных
ReadByteAD();//чтение данных АЦП 1 байт
ReadByteAD();// чтение данных АЦП 2 байт
ReadByteAD();// чтение данных АЦП 3 байт


Может поможет вырезка из моей проги.
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Dec 23 2011, 11:53
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683



Спасибо, буду разбираться!
Go to the top of the page
 
+Quote Post
ADEPTPS
сообщение Dec 26 2011, 08:25
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 5-05-09
Пользователь №: 48 683



Продолжение темы: http://electronix.ru/forum/index.php?showtopic=97520
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016