Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 507
1

АЦП AD7705 c Atmega

03.09.2018, 12:07. Показов 4544. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! В чем затык...

Подключил AD7705 к Atmega328. АЦП, вроде, делает пару правильных измерений, но потом показывает одно значение неизменно. Нашел выход. Делаю Ресет АЦП в цикле после каждого замера. Вроде стал реагировать на изменение напряжения на входе. Мне кажется, что постоянно сбрасывать АЦП в цикле не очень хорошая идея, но как заставить его работать без ресета - не понимаю.Подскажите пожалуйста, что поправить

Ф-ия записи SPI

C++
1
2
3
4
5
6
7
8
unsigned char SPI_Wr_R_byte(volatile char data){
  
  SPDR = data;// record data to SPDR
  
  while(!(SPSR & (1<<SPIF)));// wait SPIF
  
  return SPDR;
}
Ф-ия настр. АЦП

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Set_AD(int ch){
  
  PORTB &= ~(1<<ADADDR);// set SS to 0
  //if(ch == 1)
    SPI_Wr_R_byte(0x20);
  //else
    //SPI_Wr_R_byte(0x21);
    
  SPI_Wr_R_byte(0x0C);
 
  //if(ch == 1)
    SPI_Wr_R_byte(0x10);
 // else
  //  SPI_Wr_R_byte(0x11);
  
  SPI_Wr_R_byte(0x44);
  
  PORTB |= (1<<ADADDR);// set SS to 1
 
  //while(PORTB & (1<<PB1));// wait for DRDY goes low
 
}
Ф-ия чтения АЦП

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
unsigned int ReadAD(int ch){
 
  unsigned int data;
  
  //while(PORTB & (1<<PB1));// wait for DRDY goes low
 
  PORTB &= ~(1<<ADADDR);// set SS to 0
  
 // if(ch == 1)
    SPI_Wr_R_byte(0x38);
 // else
  //  SPI_Wr_R_byte(0x39);
 
  SPDR = 0;
  while(!(SPSR & (1<<SPIF)));// wait SPIF
 
  data = SPDR;
  data <<= 8;
  SPDR = 0;
  
  while(!(SPSR & (1<<SPIF)));// wait SPIF
  data |= SPDR;
  
  PORTB |= (1<<ADADDR);// set SS to 1
  
  return data;
}
Главная ф-ия программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void)
{
    /* Replace with your application code */
  
  ResetAD();
  Set_AD(1);
 // Set_AD(2);
 
 
 
    while (1) 
    {
     
 
    
//while(PORTB & (1<<PB1));// wait for DRDY goes low
 
 
    value_ad_1 = ReadAD(1);
    U1 = value_ad_1 * (2500000.0 / 65536.0);
    ResetAD();
Можно было бы оставить работать с ресетом (наверно). Но хотелось бы по нормальному. И к тому же я хочу считывать с 2 каналов АЦП, а там ресетом, боюсь уже не получиться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2018, 12:07
Ответы с готовыми решениями:

АЦП на Atmega 328p u
Замучился... помогите плиз! Не работает АЦП на atmega328p u Зависает на ожидании считывания...

Atmega 16 АЦП: измерения по нескольким каналам
Здравствуйте разбираюсь с АЦП, пишу на С, асм не знаю. В учебном курсе встреитил код смены каналов,...

Меряем напряжение с помощью АЦП ATMEGA-8
Уважаемые форумчане, возникла такая задача. Необходимо замерять напряжение на 2-х клеймах...

Запись результатов АЦП в массив (Atmega 128)
Здравствуйте! В моей задаче необходимо считать результаты измерения АЦП гармонического сигнала,...

21
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 507
04.09.2018, 23:45  [ТС] 21
Author24 — интернет-сервис помощи студентам
В общем теперь АЦП зависает на том месте, где она раньше падала

https://www.cyberforum.ru/post12877152.html

Если убрать ф-ию Reset, которую я вызываю перед циклом, то АЦП не зависает, но крутит 1-но значение и не реагирует на изм. U-я на входе.

Я так понял, если DRDY не ждать, то АЦП должен работать, только на достоверность результатов уже не будет отвечать.

Я сейчас убрал все циклы DRDY и АЦП не зависает, но ведет себя так же (падает)

https://www.cyberforum.ru/post12877152.html

Добавлено через 5 минут
Без циклов DRDY и с ф-ей Reset в цикле все работает. В общем надо посмотреть, как там DRDY приходит и еще раз в даташите посмотреть, как нужно обрабатывать приход этого DRDY, но это уже завтра.

Добавлено через 8 минут
Блиииин! Надож вот так:

C++
1
while(!(PINB & (1<<PB1)));
Яж говорю тут что-то не так.

Заработалаа!!!!!
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
05.09.2018, 17:04 22
Цитата Сообщение от ilja123 Посмотреть сообщение
while(!(PINB & (1<<PB1)));
Только это ожидание единицы на линии, а не нуля.
0
05.09.2018, 17:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2018, 17:04
Помогаю со студенческими работами здесь

АЦП-ЦАП в ATmega или вопросы новичка :)
Сразу к делу- нужно собрать девайс, на вход которого подавалось бы 2 аналоговых сигнала (2...

AtMEGA 16 - Запуск АЦП от таймера/счётчика1 по совпадению B
Необходимо запускать АЦП по совпадению В таймера 1, никак не получается сделать. Частота работы: ...

Как считать значение АЦП из регистра. Atmega 8
Очень простая программа, которая измеряет напряжение от 0 до 5 вольт. Проводник подключен с выводу...

Atmega 1281 АЦП показывает наличие напряжения при 0В
Atmega 1281. Встроеные подтягивающие резисторы подключены. Их использование разрешено установкой...

Макетная плата для Atmega 32?atmega 8
Здравствуйте !Уважаемые мастера нужна помощь (а именно нужна схема макетной платы для меги 32 и...

Прием данных с АЦП AD7705 в ПЛИС
Здравствуйте! Помогите,срочно нужно написать программу для передачи данных с AD7705 на ПЛИС....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru