Миландр

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

Часовой пояс: UTC+03:00




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

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 38
Организация: ООО "НПП "АСТРОН ЭЛЕКТРОНИКА"
Откуда: г. Орел
В спецификации на 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
Сообщения: 472
Организация: Milandr
Откуда: ПКК "Миландр"
Вполне возможно, будем проверять. Спасибо.


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

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 126
Я вот так данные от канала 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
Сообщения: 472
Организация: Milandr
Откуда: ПКК "Миландр"
Картинку поправили. По формуле очевидно что это обратный код, поскольку offset в сумме 2^32.
Еще раз всем спасибо!


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

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 38
Организация: ООО "НПП "АСТРОН ЭЛЕКТРОНИКА"
Откуда: г. Орел
Немного подправил структурку для регистров ∑ΔАЦП
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
Сообщения: 126
Цитата:
Расширяет знак с 24 битного до 32 битного.
Красиво!
А дизассемблером не смотрели, насколько пушисто компилятор это реализует?


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

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 38
Организация: ООО "НПП "АСТРОН ЭЛЕКТРОНИКА"
Откуда: г. Орел
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
Сообщения: 740
Откуда: г. Санкт-Петербург
Можно попробовать так:
// Обработчик для прерывания от канала 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+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB