Перейти к содержанию
    

Как соединить STM32 через I2C через HAL-прерывания с AD7746?

Там не так часто придётся общаться. AD774x - довольно-таки медленные, при максимальной разрешающей способности время преобразования вплоть до 250 мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 часов назад, bookmender сказал:

Ах да! Использую STM32F303RE, EVAL-AD7746EBZ. И жмень проводов ))

Да вы богатенький Буратино :). EVAL-AD7746EBZ - дорогая плата, но вам пользы от нее нуль, поскольку ее родным контроллером вы пользоваться не хотите. Тогда как напряжение для питания AD7746 можно брать с платы любого контролера (которые нынче дешевы), а микросхему AD7746 докупить отдельно. Лично я в свое время так и сделала - купила свою AD7745 в розницу, а затем напаяла ее на готовую макетку-переходник SSOP-16. Вот что получилось:

AD7745my2.jpg

Эту платку с AD7745 располагала в максимальной близости к измеряемому объекту, а провода между ней и платой контроллера делала подлиннее, т.к. цифровому сигналу длина проводов вредит в меньшей степени, чем аналоговому. Тогда как у вас на EVAL-AD7746EBZ коаксильные разъемы супер-красивы, но дополнительную емкость они все-такие добавляют. А при измерении суб-пикофарадных емкостей лучше уж чтобы посторонних предметов на линиях было навешено как можно меньше.

 

Кстати STM32F303RE у вас пока еще в виде голой микросхемы или уже есть готовая палата с ним? Потому спрашиваю, что готовых (а тем более дешевых) плат на STM32F303RE у китайцев не нашла, а потому и возник естественный вопрос, зачем вам именно STM32F303RE, тогда как на семействе STM32F1 и  STM32F4 есть множество дешевых (и даже очень) плат, которые с вашей задачей несомненно справились бы.

 

17 часов назад, bookmender сказал:

Почему лучше с DMA, чем без?

Мне кажется, я скачал такой набор. Там куча примеров для периферии процессора. Я правильно излагаю? Правда, примеры с HAL(чем плох?). Как раз пытаюсь настроить его под свою программу.

bookmender говорит правду, но не всю :). В вашем случае вариант связи МК с AD7746 посредством DMA желателен вовсе не ради повышения скорости или уменьшения нагрузки на контроллер, ибо AD7746 отдает данные медленно (с периодом 122 мсек), а потому контроллер большую часть времени бездельничает. А нужен он затем, чтобы можно было бы запустить процесс скачивания данных с AD7746 по I2C прямо из обработчика прерывания от сигнала готовности RDY, чтобы потом выйти из него и ждать, когда DMA известит о конце процесса. Поскольку в обработчике прерывания долго находиться нельзя, а обмен по I2C содержит таймауты, то торчать там в ожидании конца процесса никак нельзя. Впрочем, вместо DMA прием данных можно было бы организовать и по прерыванию, однако народ на форуме часто жалуется, что прерывания во время обмена по I2C нежелательны (что-то у них там сбоит).

 

В рамках HAL реализованы все 3 варианта: вариант I2C с ожиданием завершения (задаешь максимальный срок ожидания), вариант с прерываниями и вариант с DMA. А раз все они уже реализованы, то я бы послушалась Eddy_Em'а и выбрала вариант с DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Xenia сказал:

Да вы богатенький Буратино

Не сыпьте соль... эх. AD'шка стоит 10€. Без борда. Кстати, на борде припаяны два дополнительных AD'шных чипа )). 

 

Я пользуюсь Nucleo. Плата оказалась у меня до этого и лежала без дела.

 

Я обзавелся этими бордами, чтобы сразу попробовать два варианта измерения - емкостный и магнитным полем. В дальнейшем планирую с минимальной обвязкой оба чипа припаять на одну плату и посредством этой моей платы делать измерения.

 

8 часов назад, Xenia сказал:

выбрала вариант с DMA

 

Спасибо за объяснения. Т.е. время процессора освобождается для других вычислений. Я правильно понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, bookmender сказал:

AD'шка стоит 10€. Без борда.

Как вариант, можно взять FDC1004. Разрешающая способность по ёмкости у неё хуже, зато шире диапазон измерения (до 30 пФ, с некоторыми ухищрениями - до 100).

Недостаток: сигнала готовности нет. Приходится, выдержав паузу, вычитывать сначала регистр статуса, если там бит готовности установлен, забирать данные ёмкости. И термодатчика встроенного тоже нет.

Ещё PCAP04... зверская вещь, но, чтобы выжать из неё всё, придётся изучать весьма специфический ассемблер.

14 часов назад, Xenia сказал:

Впрочем, вместо DMA прием данных можно было бы организовать и по прерыванию, однако народ на форуме часто жалуется, что прерывания во время обмена по I2C нежелательны (что-то у них там сбоит).

Было как-то решено высоким приоритетом прерывания I2C (но не на STM32).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 минут назад, Harbinger сказал:

Было как-то решено высоким приоритетом прерывания I2C (но не на STM32).

Работает без проблем I2C на STM32F4. И по прерываниям и через DMA. Все такие жалобы - всего лишь следствие кривизны рук. имха.

Да и не нужно никакое DMA для I2C если скорость передачи не превышает нескольких кБ/сек - больше возни с его программированием чем пользы. Религиозных фанатиков не нужно слушать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да не сомневаюсь. В том случае МК был небыстрый - "двухтактовый" 51 на 7,37 МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.01.2020 в 03:49, bookmender сказал:

Не сыпьте соль... эх. AD'шка стоит 10€. Без борда. Кстати, на борде припаяны два дополнительных AD'шных чипа )).

Я пользуюсь Nucleo. Плата оказалась у меня до этого и лежала без дела.

Я обзавелся этими бордами, чтобы сразу попробовать два варианта измерения - емкостный и магнитным полем. В дальнейшем планирую с минимальной обвязкой оба чипа припаять на одну плату и посредством этой моей платы делать измерения.

Я не AD'шку имела в виду, а плату EVAL-AD7746EBZ, которая стоит около $100. Причем, буквально так и написала: "EVAL-AD7746EBZ - дорогая плата". А то, что у вас еще и NUCLEO-F303RE есть, свидетельствует о высоком уровне вашего материального достатка :). Но шутки шутками, однако мой совет остается в силе - взять дешевую китайскую плату, но не на F303 (они редкость), а на F103 или F407, где вся обвязка уже есть. Тогда как AD7746 в обвязке сильно не нуждается, а потому его можно в общую плату не интегрировать, в сделать в виде выносного модуля (фото я уже показывала), что позволило бы расположить его ближе к измеряемому объекту. Да и фильтры по питанию, в которых AD7746 может нуждаться, тоже можно расположить на том же выносном модуле. Но если сильно хочется интеграции, то его можно к плате контроллера и клеем приклеить :). К сожалению свой модуль с AD7745 я потеряла - лет 5 назад это было, сейчас бросилась искать, но так и не нашла. А раз так, то я вам не помощница, т.к. дистанционно такие дела не делаются.

 

Тем не менее, вам уже пора приступать к делу. В принципе оно вам по силам сделать самому, т.к. слишком больших познаний не потребует. Поэтому вам на первых этапах лучше о прерываниях не думать (на них можно перевести потом, когда всё уже заработает), а сперва сделать на ожиданиях, поскольку период 122 мсек - большое время.

 

Этап 1. Прежде всего надо озаботиться тем, чтобы научиться выводить числа, видимые глазом, т.к. всякий раз читать число отладчиком, выгребая его из ячейки памяти, слишком тягомотно. А в случае динамических процессов с датчиками и вовсе непригодно. А поскольку вы на эту тему молчите, как рыба, то я вправе полагать, что функция printf() у вас не только компилируется, но и выводит числа в человеческом формате вам в глаз. Если этого у вас до сих пор нет, то займитесь этим в первую очередь, т.к. вслепую такие дела не делаются.

 

Этап 2. Научитесь читать и писать байт в регистры AD7746 функциями HAL_I2C_Master_Receive() и HAL_I2C_Master_Transmit(), предварительно нужным образом проинициировав I2C и пины порта, который используется для связи. В этом вам поможет STM32CubeMX и примеры для него. Время ожидания поставьте 5 ms, если за это время трансфер не пройдет (функции не вернут результат HAL_OK), то разбирайтесь с этим, пока не победите. Этот этап можно считать пройденным, если при чтении одного и того же регистра вы будете стабильно получать то, что прежде в него писали. В итоге вы должны написать свои две функции:

bool AD7746_writeReg( unsigned char reg, unsigned char data) {...};

bool AD7746_readReg( unsigned char reg, unsigned char *pdata) {...};

первая из которых пишет байт data в регистр AD7746 с номером reg, а вторая его читает.

 

Этап 3. Пишите программу пока БЕЗ всяких прерываний:

int main(void)
{

// инициализация I2С
...

// инициализация порта GPIOx
...

// инициализация AD7746
  AD7746_init();

// вечный цикл
  while (1)
  {
    unsigned char stat = 0;
    long data = 0;

// чистам регистр статуса в переменную stat
    AD7746_readReg( AD7746_Status, &stat);

    if( !(stat & STATUS_RDY))  // при готовности данных бит STATUS_RDY должен пропасть
    {
      unsigned char data_hig = 0, data_mid = 0, data_low = 0;

      if( !AD7746_readReg( AD7746_CapDataH, data_hig)) goto error;  // читает старший байт измерения
      if( !AD7746_readReg( AD7746_CapDataM, data_mid)) goto error;  // читаем средний байт измерения
      if( !AD7746_readReg( AD7746_CapDataL, data_low)) goto error;  // читает младший байт измерения
      data = (data_hig << 16) | (data_mid << 8) | data_low;  // объединяем все 3 байта в одно число
      printf( "%3x\r\n", data);  // печатаем число в глаз
    }
  }
}

Инициализацию AD7746 делаете примерно так:

bool AD7746_init( unsigned char source, unsigned char polar)
{
  AD7746_writeReg( 0xBF, 0xBF);  // Reset ?

  delay_us( 500);

  AD7746_writeReg( AD7746_VTSetup, 0);  // disable VT

  AD7746_writeReg( AD7746_EXCSetup, 0x6B);    // EXCON, EXCB, EXCA, +- Vdd/2

  AD7746_writeReg( AD7746_CapDACA, 0x80 | CapDACA);  // DACAENA, CapDACA

  if( polar)  // uni
  { AD7746_writeReg( AD7746_CapDACB, 0x80 | 0);      // DACBENB, 0x00 (возможно, лучше не включать)
    AD7746_writeReg( AD7746_CapSetup, 0x81);  // CAPEN, CHOP
  }
  else        // dif
  { AD7746_writeReg( AD7746_CapDACB, 0x80 | CapDACB);  // CapDACB
    AD7746_writeReg( AD7746_CapSetup, 0xA1);  // CAPEN, CAPDIFF, CHOP
  }

  AD7746_writeReg( AD7746_Config, AD7746_CONT_122);  // 122.1 ms conversion time, 109.6 ms filter, continuous conversion

  return true;
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

// печатаем число в глаз


;-) пауку (эмбеддерами, правда, не бывают) хорошо, они у него фассеточные.
Ну и очкарики продержатся по-дольше, пока стёкла не полопаются; а так - всего два числа, даже отладиться не выйдет :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Capoffset куда пропал? :biggrin:

Спойлер

Инициализацию делал прописыванием 9 регистров за раз. За printf меня тогда бы убили изощрённым образом. Ибо 2 КБ на всё про всё. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Harbinger сказал:

А Capoffset куда пропал?

Не нужен он ему т.к. измеренные значения не в пикофарады переводить придется, а в расстояние до объекта. А раз так, то вторичная калибровка неизбежна, но ее можно провести напрямую из дискрет в миллиметры, минуя пикофарады.

Кроме того, рекомендуемый TI оффсет дурацкий: :)

CapOffset = 0x9F9F9F;

а лучшего я не знаю.

И, наконец, я не говорила, что "Этап 3" последний. Там ведь еще и процедура внутренней калибровки есть. Так зачем в самом начале пути забивать этим голову начинающему? Пусть хоть как-нибудь запустит AD7746 в работу, а полировать начисто можно после. В том числе и прерывания ввести по сигналу готовности.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, Xenia сказал:

Этап 1.

Оооо! Спасибо большое! Пошел пробовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, bookmender сказал:

Этап 1.

Оооо! Спасибо большое! Пошел пробовать.

Советую предварительно определиться, мобильный у вас будет девайс или стационарный. Здесь важно знать, находится ли установка, в которой придется расстояния мерить, рядом с вашим компьютером,  или имеет смысл сделать переносной девайс на батарейном питании со своим локальным диплеем. В стационарном варианте имеет смысл использовать макет "USB CDC device", чтобы потом общаться с девайсом, как с виртуальным COM-портом, через эмулятор терминала. А в мобильном варианте нужно присоединить к плате дисплей (можно символьный, т.к. рисовать картинки вы на нем не будете).

 

Тут еще дело в том, что ваша плата NUCLEO-F303RE имеет дополнительные разъемы в стиле Arduino, для которых нынче выпускается множество шилдов, в том числе и дисплейных. Причем, из-за больших тиражей они довольно дешевы. Например, такой:

https://aliexpress.ru/item/33040030964.html

Бывают еще проще и дешевле (но у меня такой почему-то не работает - светиться не хочет):

https://aliexpress.ru/item/32278943202.html

Конечно, дрессировка дисплея еще более трудное занятие, чем освоение AD7746, однако в отношении дисплеев тропа проторена гораздо шире - легче найти уже готовый код для их поддержки, т.к. многие их юзают.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 12.01.2020 в 13:35, Xenia сказал:

переносной девайс

Предполагается пробовать его на установке. Т.е. лазер будет бегать, а девайс на нем "висеть". Может USB-кабель вывести к компу? Что мне даст дисплей, ведь во время резки дверь агрегата закрывается и через крохотное окошко можно полюбоваться искрами? Или же все-таки есть смысл поставить дисплей, но тогда для каких целей?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мб сделать такой интерфейс, чтобы в станке можно было задействовать обратную связь по расстоянию до заготовки? А то просто смотреть на цифры не особо интересно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...