Миландр

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

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




Начать новую тему  Ответить на тему  [ 23 сообщения ]  На страницу « 1 2
Автор Сообщение
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-15 14:30 
Не в сети

Зарегистрирован: 2010-фев-08 00:47
Сообщения: 82
Откуда: el'NiNo
Забыл отписаться о решении проблемы с АЦП..
Ключевой вопрос: а почему нигде в СП в разделах "сигналы тактовой частоты" и "ацп" и не указана максимальная частота тактирования АЦП.
При подаче на АЦП частоты, большей чем 14М на следующем же после "поднятия" бита ADC1_CFG_REG_GO такте "поднимается" бит ADC_STATUS_FLG_REG_EOCIF.

Кстати, в СП ревизии 3.0.2 в разделе "Сигналы тактовой частоты MDR_RST_CLK" на 158 странице биты ADC_C2_SEL неверно расшифрованы.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-15 14:52 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1318
Откуда: АО "ПКК Миландр"
goussack писал(а):
Забыл отписаться о решении проблемы с АЦП..
Ключевой вопрос: а почему нигде в СП в разделах "сигналы тактовой частоты" и "ацп" и не указана максимальная частота тактирования АЦП.
При подаче на АЦП частоты, большей чем 14М на следующем же после "поднятия" бита ADC1_CFG_REG_GO такте "поднимается" бит ADC_STATUS_FLG_REG_EOCIF.

Кстати, в СП ревизии 3.0.2 в разделе "Сигналы тактовой частоты MDR_RST_CLK" на 158 странице биты ADC_C2_SEL неверно расшифрованы.
Максимальная тактовая частота АЦП указана в ТУ в табл. 3.

При поднятие флага EOCIF на следующий такт после GO надо поподробней, так не может быть. Возможно создается впечатление, что он взводится тут же?

Замечания по описании в спецификации учтем.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-17 13:52 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 532
Цитата:
После праздников потыкаю плату осцилографом.
Ну таки добрался до интернета. Осцилографом потыкался. СИгнал на АЦП идет шумный, примерно 10-15 мВ по амплитуде. Но провалов нет. Так что вопрос к точности АЦП, думаю можно снять. Тактировать от разных источников не пробовал (не до экспериментов сейчас). Зато нарыл еще одно несоответствие в описании, теперь уже по поводу памяти. Стр.42 рис.15 Структура памяти. Размер каждого банка памяти составляет 4Кх8 или 1Кх32. Соответственно размер сектора 1Кх8 или 256х32. Иначе заявленный размер памяти в 128К не получается. А с информационной памятью даже помучился пару дней, пока не дошло насчет опечаток и адресов.
Цитата:
Ключевой вопрос: а почему нигде в СП в разделах "сигналы тактовой частоты" и "ацп" и не указана максимальная частота тактирования АЦП.
Раздел предельно допустимые характеристики, п.15 таблицы (стр.493). И на стр.288. В конце абзаца перед рисунком.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2012-май-22 15:00 
Не в сети

Зарегистрирован: 2010-фев-08 00:47
Сообщения: 82
Откуда: el'NiNo
Цитата:
При поднятие флага EOCIF на следующий такт после GO надо поподробней, так не может быть. Возможно создается впечатление, что он взводится тут же?
Ну это точно неверный по ТУ режим работы, но всё же: проц на 8МГц*4=32МГц, эта же частота без делителя подавалась на АЦП как тактовая, что явно больше 14МГц.
Тестовый код скомпилировался так (я загнул, про то, что в следующем такте):
    28:         temp1 = MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF; 
0x080008B8 4620      MOV      r0,r4
0x080008BA 6A00      LDR      r0,[r0,#0x20]
0x080008BC F0000204  AND      r2,r0,#0x04
    29:         MDR_ADC->ADC1_CFG |= ADC1_CFG_REG_GO; 
0x080008C0 4620      MOV      r0,r4
0x080008C2 6800      LDR      r0,[r0,#0x00]
0x080008C4 F0400002  ORR      r0,r0,#0x02
0x080008C8 6020      STR      r0,[r4,#0x00]
    30:         temp2 = MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF; 
0x080008CA 4620      MOV      r0,r4
0x080008CC 6A00      LDR      r0,[r0,#0x20]
0x080008CE F0000304  AND      r3,r0,#0x04
так вот temp1 = 0, а temp2 =4.

Но это просто объяснимо, как я думаю: в регистре MDR_EEPROM->CMD поле Delay по умолчанию установлено 111, что даёт задержку 7 тактов перед чтением флеша, поэтому
0x080008C0 4620      MOV      r0,r4
0x080008C2 6800      LDR      r0,[r0,#0x00]
0x080008C4 F0400002  ORR      r0,r0,#0x02
0x080008C8 6020      STR      r0,[r4,#0x00]
занимает 32 ((само чтение + задержка)*4) такта, которые уходят до 4 тактов на зарядку УВХ и до 28 тактов - на преобразование, и, как следствие, выставление флага ADC_STATUS_FLG_REG_EOCIF
В итоге кругом мы неправы.

Наш косяк был в том, что клок на ядро с 8М до 32М подняли, а АЦП был привязан к cpu_clk, но в коде инициализации АЦП делитель не изменили, поэтому и вышли за предельно разрешенную частоту.
Цитата:
И на стр.288. В конце абзаца перед рисунком.
Да-да, опять же виноват, глаза пропустили, я как раз имел ввиду что-то подобное в тексте, а не в таблицах.


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2018-ноя-27 11:04 
Не в сети

Зарегистрирован: 2015-май-25 13:52
Сообщения: 29
Добрый день. Не поменялась ли ситуация со встроенным термодатчиком в вопросе разброса его хар-к? В 91 м от партии к партии без калибровки большой разброс был (точнее между 91 м 92 м насколько помню). Сейчас хотим использовать 1986ВЕ94Я. Можно рассчитывать, что точность будет хотя бы 5 гр ?


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2018-ноя-27 13:01 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 473
Организация: Milandr
Откуда: ПКК "Миландр"
К точности термодатчика требований не предъявляется, ему всегда необходима отдельная калибровка.

Тут вот скрипт предлагают:
viewtopic.php?f=34&t=1989&start=15


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2021-июн-08 15:25 
Не в сети

Зарегистрирован: 2021-июн-08 11:17
Сообщения: 6
Организация: частное лицо
Первый опыт работы к контроллерами. После мигания светодиодами и выведения текста на экран, пробую АЦП. Самое простое, что можно сделать - вывод информации с термодатчика. Не пойму, есть ли ошибки в коде. Потому что показывает всегда одно и тоже значение - 83. На значение в градусах цельсия не похоже. На нагрев не реагирует. До пересчета в градусы отображает значение 2048.0. Вывожу в терминал с помощью SEGGER RTT. Есть ли какая-то явная ошибка в коде или в чем-то другом может быть проблема? Отладка LDM-K1986BE92QI. МК соответственно
#include <stdio.h>
#include <math.h>
#include "SEGGER_RTT.h"
#include "MDR32F9Qx_config.h"
#include "MDR32F9Qx_port.h"
#include "MDR32Fx.h"


#define ADC_RESOLUTION      12
#define ADC_CHANNEL_T_int  31

#define ADC_CLK 1
#define CPU_CLK 0

#define FACTORY_ADC_TEMP25     1700         // ADC value = 1700 @ 25C = 1.36996V - from milandr demo project
#define FACTORY_TEMP25         25
#define FACTORY_ADC_AVG_SLOPE  6            // ADC delta value @ 1C, from milandr demo project
#define FACTORY_AVG_SLOPE      0.004835     // 4.0-4.6, 4.3 mV/C typical @ factory delta_calib


void adc_init (int clk_source) {
	MDR_ADC->ADC1_CFG  = (0<<ADC1_CFG_REG_SAMPLE_Pos)|clk_source<<ADC1_CFG_REG_CLKS_Pos)|ADC1_CFG_REG_ADON;
	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_TS_EN_Pos);
}

int adc_read (char channel){
	MDR_ADC->ADC1_CFG &= (~ADC1_CFG_REG_CHS_Msk);  // 4-8 - сбросить конфигурацию каналов
	MDR_ADC->ADC1_CFG |= (channel<<ADC1_CFG_REG_CHS_Pos);
	MDR_ADC->ADC1_CFG |= ADC1_CFG_REG_GO;
	while (!(MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF));
	return MDR_ADC->ADC1_RESULT & ADC_RESULT_Msk;
}

void adc_test (void) {
       MDR_RST_CLK->PER_CLOCK = 0xFFFFFFFFF;

       MDR_PORTD->FUNC = 0x00000000;
       MDR_PORTD->ANALOG = 0x0000FFFF;
       MDR_PORTD->PWR = 0xFFFFFFFF;
       MDR_PORTD->OE = 0x00000000;

	adc_init(CPU_CLK);

	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_SEL_TS_Pos);
	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_TS_BUF_EN_Pos);

	int Temp_Int;
	Temp_Int = (int) adc_read(ADC_CHANNEL_T_int);
	int temperature_C = (Temp_Int - FACTORY_ADC_TEMP25)/FACTORY_ADC_AVG_SLOPE + FACTORY_TEMP25;

	char buffer_temper_val[50];
       sprintf(buffer_temper_val, "%d", temperature_C);
	SEGGER_RTT_printf(0, "Current temperature = %s\n\n", buffer_temper_val);

}


Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП
СообщениеДобавлено: 2021-июн-08 16:28 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 306
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Steppenwolf писал(а): *
Первый опыт работы к контроллерами. После мигания светодиодами и выведения текста на экран, пробую АЦП. Самое простое, что можно сделать - вывод информации с термодатчика. Не пойму, есть ли ошибки в коде. Потому что показывает всегда одно и тоже значение - 83. На значение в градусах цельсия не похоже. На нагрев не реагирует. До пересчета в градусы отображает значение 2048.0. Вывожу в терминал с помощью SEGGER RTT. Есть ли какая-то явная ошибка в коде или в чем-то другом может быть проблема? Отладка LDM-K1986BE92QI. МК соответственно
#include <stdio.h>
#include <math.h>
#include "SEGGER_RTT.h"
#include "MDR32F9Qx_config.h"
#include "MDR32F9Qx_port.h"
#include "MDR32Fx.h"


#define ADC_RESOLUTION      12
#define ADC_CHANNEL_T_int  31

#define ADC_CLK 1
#define CPU_CLK 0

#define FACTORY_ADC_TEMP25     1700         // ADC value = 1700 @ 25C = 1.36996V - from milandr demo project
#define FACTORY_TEMP25         25
#define FACTORY_ADC_AVG_SLOPE  6            // ADC delta value @ 1C, from milandr demo project
#define FACTORY_AVG_SLOPE      0.004835     // 4.0-4.6, 4.3 mV/C typical @ factory delta_calib


void adc_init (int clk_source) {
	MDR_ADC->ADC1_CFG  = (0<<ADC1_CFG_REG_SAMPLE_Pos)|clk_source<<ADC1_CFG_REG_CLKS_Pos)|ADC1_CFG_REG_ADON;
	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_TS_EN_Pos);
}

int adc_read (char channel){
	MDR_ADC->ADC1_CFG &= (~ADC1_CFG_REG_CHS_Msk);  // 4-8 - сбросить конфигурацию каналов
	MDR_ADC->ADC1_CFG |= (channel<<ADC1_CFG_REG_CHS_Pos);
	MDR_ADC->ADC1_CFG |= ADC1_CFG_REG_GO;
	while (!(MDR_ADC->ADC1_STATUS & ADC_STATUS_FLG_REG_EOCIF));
	return MDR_ADC->ADC1_RESULT & ADC_RESULT_Msk;
}

void adc_test (void) {
       MDR_RST_CLK->PER_CLOCK = 0xFFFFFFFFF;

       MDR_PORTD->FUNC = 0x00000000;
       MDR_PORTD->ANALOG = 0x0000FFFF;
       MDR_PORTD->PWR = 0xFFFFFFFF;
       MDR_PORTD->OE = 0x00000000;

	adc_init(CPU_CLK);

	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_SEL_TS_Pos);
	MDR_ADC->ADC1_CFG |= (1<<ADC1_CFG_TS_BUF_EN_Pos);

	int Temp_Int;
	Temp_Int = (int) adc_read(ADC_CHANNEL_T_int);
	int temperature_C = (Temp_Int - FACTORY_ADC_TEMP25)/FACTORY_ADC_AVG_SLOPE + FACTORY_TEMP25;

	char buffer_temper_val[50];
       sprintf(buffer_temper_val, "%d", temperature_C);
	SEGGER_RTT_printf(0, "Current temperature = %s\n\n", buffer_temper_val);

}
Здравствуйте!

Мы рады, что Вы работаете с изделием компании Миландр, установленным на плате производства наших партнеров. Прежде, чем говорить о выводе пересчитанной информации во внешнюю среду, необходимо детальнее разобраться в том, как работает АЦП в составе микроконтроллера на регистровом уровне (будет полезно в будущем) и том, в каком виде он отдаёт информацию через регистр ADC_RESULT, ведь фактически микроконтроллер лишь забирает аналоговый сигнал извне, после чего внутри его оцифровывает. Спецификация на семейство микроконтроллеров 1986ВЕ9х достаточно подробно описывает функционирование этого периферийного блока, а поставляемые в составе установочного пака для IDE Keil - всплывающее меню "Standard Peripherals Library + software pack для Keil MDK 5".svd файлы позволят анализировать и изменять состояние регистров микроконтроллера в реальном времени в режиме отладки - это удобно, когда Вы только начинаете изучать микроконтроллер и необходимо оперативно изменять состояние отдельных бит интересующих регистров, чтобы моментально видеть изменение в работе микросхемы. Также стоит отметить наличие ошибок в коде, из-за которых успешная компиляция находится под вопросом, в частности, это строчки "MDR_RST_CLK->PER_CLOCK = 0xFFFFFFFFF;" (помимо этого важно отметить, что не рекомендуется включать тактирование всех периферийных блоков, включайте только те, которые фактически используются в программе) и "MDR_ADC->ADC1_CFG = (0<<ADC1_CFG_REG_SAMPLE_Pos)|clk_source<<ADC1_CFG_REG_CLKS_Pos) |ADC1_CFG_REG_ADON;".

Базово в рамках библиотеки SPL ознакомиться с правильной настройкой блока АЦП можно из книги Благодарова А.В. и Владимирова Л.Л. "Программирование микроконтроллеров: методическое пособие на основе отечественных микросхем семейства 1986ВЕ9х разработки и производства компании "Миландр" . Соответственно, в режиме отладки с подключенным файлом .svd можно наблюдать, какие именно параметры устанавливаются в регистры блока АЦП, после чего сверить их со спецификацией и при желании изменить. Этот путь приведет к пониманию механики работы, после чего у Вас не останется вопросов по общему функционированию.

Поскольку Вы только начинаете работать с микроконтроллерами компании Миландр, обратите, пожалуйста, внимание на информационный портал отдела технической поддержки компании Миландр, в рамках раздела "База знаний" мы публикуем полезные статьи, которые помогают пользователям в освоении выпускаемой продукции, в частности, Вам может быть интересна статья по наиболее частым ошибкам программирования. Спасибо.

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 23 сообщения ]  На страницу « 1 2

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


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

Сейчас этот форум просматривают: Bing [Bot], Google [Bot] и 4 гостя


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

Перейти: 

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