Easyelectronics.ru • Просмотр темы - AD7767 + STM32F103 (Получение данных от АЦП по SPI)

Easyelectronics.ru

Электроника для всех
Текущее время: 15 авг 2018, 09:41

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 16 дек 2017, 17:33 
Здравствуйте!

Зарегистрирован: 16 дек 2017, 12:17
Сообщения: 4
Добрый день!
Есть плата с микроконтроллером STM32F103RD и АЦП AD7767. Считываю данные с АЦП по SPI (half-duplex) в DMA. Т.е. выходные сигналы микроконтроллера MCLK(тактирование АЦП), SCLK(тактирование SPI), входные сигналы для микроконтроллера DRDY (готовность данных), SDO(данные).

В микроконтроллере усредняю 125 отсчетов АЦП. Т.е. в прерывании от DRDY считываю данные из DMA, разбираю байты, складываю, когда накопится 125 отсчетов, делю на 125, кладу в буфер FIFO и потом посылаю по USB в тестовую программу.

void EXTI0_IRQHandler (void) //прерывание по сигналу DRDY от АЦП
{
EXTI->PR |= EXTI_PR_PR0; // Clean Flag
DRDYInterrupt++;

uint32_t dmaData = ((((buffDMA[0] & 0x80) != 0) ? 0xFF : 0x00)<< 24) | (buffDMA[0]<< 16) |
(buffDMA[1]<< 8) | buffDMA[2];
DMA_start(); // переинициализация и пуск DMA
dmaDataSum = dmaDataSum + dmaData;
if (DRDYInterrupt == numDMACount)
{
uint32_t dataDPS = dmaDataSum/numDMACount; // усредение по 128 (125) отсчетам
dpsIndex++;
bufferDPS[idxIN++] = ((uint8_t)((dataDPS & 0xFF))); //данные в буфер FIFO
idxIN &= BUF_MASK;
bufferDPS[idxIN++] = ((uint8_t)((dataDPS & 0xFF00)>>8));
idxIN &= BUF_MASK;
bufferDPS[idxIN++] = ((uint8_t)((dataDPS & 0xFF0000)>>16));
idxIN &= BUF_MASK;

bufferDPS[idxIN++] = ((uint8_t)(dpsIndex & 0xFF)); //номер отсчета
idxIN &= BUF_MASK;
bufferDPS[idxIN++] = ((uint8_t)((dpsIndex & 0xFF00) >>8));
idxIN &= BUF_MASK;

dmaDataSum = 0;
DRDYInterrupt = 0;
}
}

В тестовой программе (С# в Visual Studio) в методе приема данных:
for (int i = 0; i < pktCnt; i++)
{
int value = ((((buffer[i * 5 + 3] & 0x80) != 0) ? 0xFF : 0x00) << 24) | (buffer[i * 5 + 3] << 16) | (buffer[i * 5 + 2] << 8) | buffer[i * 5 + 1];
int marker = (buffer[i * 5 + 5] << 8) | buffer[i * 5 + 4];

if (marker != (nextIndex))
{
missingCount++;
}
nextIndex = marker + 1; // 4ре байта
pointIndex[flowPointCnt] = marker;
pointValue[flowPointCnt] = value;
flowPointCnt++;
}
break;

В результате вывожу данные в тестовой программе в компонент и получаю странные результаты. Данные на АЦП подаются с генератора (обычно пила или синус).
Иногда получается нормальный сигнал, иногда его ломает (в приложениях принтскрины).
Подскажите, пожалуйста, в чем может быть проблема?


Вложения:
син (+30-30).PNG
син (+30-30).PNG [ 17.11 Кб | Просмотров: 773 ]
син (+30-20).PNG
син (+30-20).PNG [ 14.28 Кб | Просмотров: 773 ]
пила сдвинутая.PNG
пила сдвинутая.PNG [ 15.29 Кб | Просмотров: 773 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 16 дек 2017, 20:31 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 дек 2010, 19:20
Сообщения: 71
Ваша проблема в том, что считывая от АЦП беззнаковые данные (uint32_t) на стороне ПК вычитываете их как знаковые (int).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 16 дек 2017, 21:44 
Здравствуйте!

Зарегистрирован: 16 дек 2017, 12:17
Сообщения: 4
Самое интересное, что иногда получается правильная синусоида. И "сбои" идут в разные моменты, иногда при нуле, иногда при достижении какого-то уровня


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 16 дек 2017, 22:01 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3714
Откуда: г. Липецк
Это вы растете над собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 16 дек 2017, 23:50 
Заглядывает иногда

Зарегистрирован: 24 июн 2012, 22:45
Сообщения: 162
разные причины:
1) не хватает разрядов - 2 старших потерялись.
3) если это была пила, то не хватает одного знакового разряда.
2 и все остальные - разрыв на краях буфера


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 17 дек 2017, 00:38 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2098
Такой эффект - от переполнения разрядности на каком-либо этапе, и неправильной обработки знака (+ -) числа. АЦП то 24-битный, а int - 32-битное, со знаком в старшем бите.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 18 дек 2017, 00:23 
Здравствуйте!

Зарегистрирован: 16 дек 2017, 12:17
Сообщения: 4
До того момента, как на плате появился АЦП, в буфер FIFO складывалось постоянно возрастающее значение, и этот буфер посылался по USB. На компоненте отображалась пила, что, наверное, даёт полагать, что ошибка закралась на более раннем этапе. (или вы другой буфер имели ввиду?)
На счет расширения знакового бита - это учитывается, и в программе МК, и в тестовой программе.
А как можно проверить пропадание битов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 18 дек 2017, 01:01 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 дек 2010, 19:20
Сообщения: 71
bem писал(а):
До того момента, как на плате появился АЦП, в буфер FIFO складывалось постоянно возрастающее значение, и этот буфер посылался по USB. На компоненте отображалась пила, что, наверное, даёт полагать, что ошибка закралась на более раннем этапе.

Ну так просмотрите тот код, который давал пилу и сравните с тем что получаете считывая АЦП, особое внимание обратив на типы данных.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AD7767 + STM32F103 (Получение данных от АЦП по SPI)
СообщениеДобавлено: 19 дек 2017, 11:55 
Здравствуйте!

Зарегистрирован: 16 дек 2017, 12:17
Сообщения: 4
[quote="predator_r"]разные причины:
1) не хватает разрядов - 2 старших потерялись.

Спасибо, вы правы, терялся старший байт, а остальные соответственно сдвигались. Теперь, вроде бы все байты нашла и пришла вот к такому результату


Вложения:
син(19.12.2017).PNG
син(19.12.2017).PNG [ 21.66 Кб | Просмотров: 316 ]
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB