Миландр

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

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




Начать новую тему  Ответить на тему  [ 9 сообщений ] 
Автор Сообщение
 Заголовок сообщения: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 13:57 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Всем добрый день. Прошу помочь в решении моей проблемы. Мне надо производить АЦП из нескольких каналов. Для этого я в И-нете взял за образец одну из методик осуществления АЦП, но от одного канала. Этот код работает без вопросов. Для того, чтобы производить АЦП от других каналов я решил перед проведение процесса преобразования вставить строчку, в которой бы изменялся номер канала сохраняемый в регистре MDR_ADC->ADC1_CFG. Но после того как я вставил эту строку программа перестала выявлять обнуление флага преобразования. Программа циклится в процессе измерения одного канала. В режиме отладки после отработки строки изменения номера канала, меняется только указанный регистр. Остальное без изменений. Текст программки прилагаю.
Открыть
// Подключение заголовочных файлов необходимых библиотек
#include <MDR32F9Qx_port.h>
#include <MDR32F9Qx_rst_clk.h>
#include <MDR32F9Qx_adc.h>

// Определение функции задержки
#define DELAY(T) for (i = T; i > 0; i--)
// Определение калибровочной константы
#define KALIBR 1247
// Объявление переменных
int i;
float U_1;
float U_2;
uint32_t RESULT;
char stroka[17]; // Размер массива для строки


// Процедура общей настройки АЦП
void ADCInit()
{
// Включение тактирования АЦП
RST_CLK_PCLKcmd(RST_CLK_PCLK_ADC, ENABLE);
// Объявление структур для общей настройки АЦП
ADC_InitTypeDef ADC;
// Загрузка значений по умолчанию в структуру ADC
ADC_StructInit(&ADC);
// Инициализация АЦП объявленной структурой
ADC_Init(&ADC);
}

// Процедура настройки АЦП1
void ADC1Init()
{
// Объявление структур для общей настройки АЦП1
ADCx_InitTypeDef ADC1;
// Загрузка значений по умолчанию в структуру ADC1
ADCx_StructInit(&ADC1);
ADC1.ADC_ChannelNumber = ADC_CH_ADC7;
ADC1_Init(&ADC1);
ADC1_Cmd(ENABLE);
}

int main ()
{
ADCInit(); // Вызов функции общей настройки АЦП
ADC1Init(); // Вызов функции индивидуальной настройки АЦП1

while (1)
{
ADC1_Start(); // Начало преобразования
// Ожидание флага завершения преобразования
while (ADC1_GetFlagStatus(ADC1_FLAG_END_OF_CONVERSION)
== 0);
// Чтение результата преобразования
RESULT = ADC1_GetResult() & 0x00000FFF;
// Калибровка результата преобразований
U_1 = (float)RESULT / KALIBR;
MDR_ADC->ADC1_CFG =(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4);
ADC1_Start();
while (ADC1_GetFlagStatus(ADC1_FLAG_END_OF_CONVERSION)
== 0);
RESULT = ADC1_GetResult() & 0x00000FFF;
U_2 = (float)RESULT / KALIBR;
}
}
Закрыть
Что я делаю не так? И как надо бы делать правильно?


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 14:32 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1454
Откуда: Тула
Цитата:
меняется только указанный регистр
Смелое утверждение. Предполагаю, что причина такая же, как и с портами - вы перезаписываете управляющий регистр не корректным значением. Конкретно: вы выключаете АЦП (бит 0 в нуле). Так же некорректно могут быть заданы источник тактирования и к-т деления тактовой частоты для АЦП.

Отдельного упоминания заслуживают комменты и код вида
// Определение функции задержки 
#define DELAY(T) for (i = T; i > 0; i--)
Например, если Вы задумаете сделать усреднение результатов АЦП по нескольким значениям кодом вроде
 int result = 0;
for(int j=0; j<N; ++j) {
ADC1_Start();
DELAY( MY_ADC_DELAY )
result +=  ADC1_GetResult();
}
result = result/N;
Вы будете сильно удивлены...

_________________
сочувствующий…


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 14:53 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
prostoRoman писал(а):
Отдельного упоминания заслуживают комменты и код вида
// Определение функции задержки 
#define DELAY(T) for (i = T; i > 0; i--)
По поводу задержки. Да я понимаю, что эта задержка так себе. Временная. Только ради простоты её использовал.


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 14:53 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 486
Цитата:
меняется только указанный регистр.
и это правда. Вот только это один из ключевых регистров АЦП.
В остальном апельсин - вид сбоку (см. порты ввода-вывода)

ps: Ну и стилистика вопроса - впечатление что работал гугл-транслятор
Цитата:
Мне надо производить АЦП из нескольких каналов.
.
Вы же производите не АЦП в виде чипов, а измерение с не скольких каналов АЦП.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 14:58 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1454
Откуда: Тула
редактор писал(а):
ps: Ну и стилистика вопроса - впечатление что работал гугл-транслятор
Цитата:
Мне надо производить АЦП из нескольких каналов.
.
Вы же производите не АЦП в виде чипов, а измерение с не скольких каналов АЦП.
"Мне надо производить аналого-цифровое преобразование из нескольких каналов."
Всё в порядке.

_________________
сочувствующий…


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 15:00 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
prostoRoman писал(а):
Цитата:
меняется только указанный регистр
Смелое утверждение. Предполагаю, что причина такая же, как и с портами - вы перезаписываете управляющий регистр не корректным значением. Конкретно: вы выключаете АЦП (бит 0 в нуле). Так же некорректно могут быть заданы источник тактирования и к-т деления тактовой частоты для АЦП.
Да, действительно так происходит. Но я думал, что следующая за этим функция ADC1_Start() включит АЦП, а она не включает. СПАСИБО.


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-21 15:27 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
редактор писал(а):
Вы же производите не АЦП в виде чипов, а измерение с не скольких каналов АЦП.
Уж если вдаваться в терминологию, то Вы здесь не правы. Контроллер строго говоря не производит измерения аналоговых значений напряжения подаваемых на требуемые выводы. Он осуществляет преобразование аналогового значения в цифровое, а уже человек с помощью программ ...ну не Вам объяснять. Вы же это прекрасно знаете. Тем более Редактор. Давайте не будем полемизировать над подобными вопросами.


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-окт-23 09:25 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 486
Рад, что вы провели качественную работу над ошибками в отношении стилистики сообщения. Надеюсь на такой же качественный результат в области программирования.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Заголовок сообщения: Re: АЦП нескольких каналов
СообщениеДобавлено: 2019-ноя-12 09:45 
Не в сети

Зарегистрирован: 2017-июн-05 14:53
Сообщения: 8
Организация: ОАП АПЗ
Я для этой цели использую DMA.
АЦП оцифровывает серию замеров и сохраняет через DMA в ОЗУ


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

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


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

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


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

Перейти: 

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