Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-ноя-21 22:24

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 11:35 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 34
Откуда: г. Орел
В спецификации на 1986ВЕ4У в регистрах FxDAT результат указан в битах 23..0. Биты 31...24 неопределены. Кроме того в https://startmilandr.ru/doku.php/doc:mk:1986be4y:ask4y в самом конце на картиночке указано что от -2,4 до 2,4 код изменяется от 0x0 до 0xFFFFFF. По идее при переходе через дифф ноль в плюс должен установиться старший 23 бит. На практике получил, что значения регистров FxDAT выражены в дополненном 24 битном коде. Дифф ноль это 0x0 получается, а минус (около дифф нуля) это к примеру 0xFFFFCF. Замыкал на 1,65 В (подавал с ЦАП) выводы каналов INPx, INMx.
Ревизия 1723.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 13:08 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 455
Откуда: ПКК "Миландр"
Вполне возможно, будем проверять. Спасибо.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 13:13 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 121
Я вот так данные от канала ADUCIU обрабатывал:

Код:
// Обработчик для прерывания от канала 1 ADCIU
void ADCIU_CH1_IRQHandler_Implement (void)
{
   uint32_t data;
   int32_t S;

   // Напряжение по каналу 1
   data = MDR_ADCIU->F_DAT[ADCIU_CHANNEL_NUMBER1];    // Читаем результат преобразования
   if(data & 0x00800000UL)                            // Проверяем бит 23
      data |=  (0xFF000000UL);                         // Расширяем знак для отрицательных чисел
   
   S = (int32_t) data;  // Код АЦП в виде 32-битного знакового целого числа

  // ..      

}   



И как жаль, что это не сделано аппаратно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 13:27 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 455
Откуда: ПКК "Миландр"
Картинку поправили. По формуле очевидно что это обратный код, поскольку offset в сумме 2^32.
Еще раз всем спасибо!

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 14:30 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 34
Откуда: г. Орел
Немного подправил структурку для регистров ∑ΔАЦП
Код:
typedef struct _ADCIU {
   MDR_REG CTRL1;      //0x00
   MDR_REG ANGAIN;      //0x04
   MDR_REG DIGGAIN;   //0x08
   MDR_REG DMAEN;      //0x0C
   MDR_REG CTRL2;      //0x10
   MDR_REG INTEN;      //0x14
   MDR_REG STAT;      //0x18
   struct {volatile signed SAMPLE:24;} F_DAT[8]; //0x1C-0x38
   } xADCIU;
   
#define ADCIU_BASE ((xADCIU *) 0x40068000)


Такая конструкция:
Код:
(signed int) ADCIU_BASE -> F_DAT[0].SAMPLE

Расширяет знак с 24 битного до 32 битного.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 15:28 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 121
Цитата:
Расширяет знак с 24 битного до 32 битного.

Красиво!
А дизассемблером не смотрели, насколько пушисто компилятор это реализует?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 16:31 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 34
Откуда: г. Орел
andelie писал(а):
Цитата:
Расширяет знак с 24 битного до 32 битного.

Красиво!
А дизассемблером не смотрели, насколько пушисто компилятор это реализует?


Компилятор GCC оптимизация -O1
Код:
ldr     r1, [r3, #28] // Загрузка непосредственно 24 битного значения
lsls    r1, r1, #8
asrs    r1, r1, #8
str     r1, [r2, #16]


Вот и все приведение типа)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ4У+∑ΔАЦП значения FxDAT
СообщениеДобавлено: 2019-май-17 16:35 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 717
Откуда: г. Санкт-Петербург
Можно попробовать так:
Код:
// Обработчик для прерывания от канала 1 ADCIU
void ADCIU_CH1_IRQHandler_Implement (void)
{
   int32_t data;
   // Напряжение по каналу 1
   data = ((int)MDR_ADCIU->F_DAT[ADCIU_CHANNEL_NUMBER1])<<8;
     data >>= 8;
  // ..      

}   


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

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


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB