реклама на сайте
подробности

 
 
> STM32: запуск АЦП от TIM1
koyodza
сообщение Jul 24 2011, 13:36
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



У кого-нибудь получилось запустить преобразование АЦП от TIM1? Хоть по какому-нибудь каналу. По TIM2..TIM4 работает (канал только нужно выбирать, не от всех запуск возможен).
Делаю то же самое от TIM1 - молчит.

И ведь не один проект уже на нём реализовал, а вот с TIM1 постоянно какие-то засады: то OCxN оказывается невозможно отключить, когда он попадает на другую периферию, то вот с запуском АЦП... Все таймера 2..4 сейчас заняты, перебросить запуск АЦП некуда
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 22)
AHTOXA
сообщение Jul 25 2011, 09:12
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



TIM_BDTR_MOE?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
koyodza
сообщение Jul 28 2011, 15:25
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(AHTOXA @ Jul 25 2011, 12:12) *
TIM_BDTR_MOE?

Пробовал, чего-то не фурычит.

Есть пример точно работающего АЦП от TIM1 ?
Go to the top of the page
 
+Quote Post
Huston007
сообщение Aug 18 2011, 13:03
Сообщение #4





Группа: Новичок
Сообщений: 6
Регистрация: 18-08-11
Пользователь №: 66 780



Цитата(koyodza @ Jul 24 2011, 20:36) *
У кого-нибудь получилось запустить преобразование АЦП от TIM1? Хоть по какому-нибудь каналу. По TIM2..TIM4 работает (канал только нужно выбирать, не от всех запуск возможен).
Делаю то же самое от TIM1 - молчит.

И ведь не один проект уже на нём реализовал, а вот с TIM1 постоянно какие-то засады: то OCxN оказывается невозможно отключить, когда он попадает на другую периферию, то вот с запуском АЦП... Все таймера 2..4 сейчас заняты, перебросить запуск АЦП некуда


Послушайте, у меня на ST32F207 вообще не получается стартовать АЦП от таймеров. Покажите пожалуйста, как у вас работало с другими таймерами
Go to the top of the page
 
+Quote Post
Михаил Черепанов
сообщение Feb 7 2012, 03:19
Сообщение #5





Группа: Новичок
Сообщений: 1
Регистрация: 7-02-12
Из: Екатеринбург
Пользователь №: 70 121



Цитата(Huston007 @ Aug 18 2011, 19:03) *
Послушайте, у меня на ST32F207 вообще не получается стартовать АЦП от таймеров. Покажите пожалуйста, как у вас работало с другими таймерами


когда искал, как запустить АЦП по таймеру 1 или 8, попал на эту тему.
Вроде разобрался. При такой инициализации на STM32F205 АЦП запускается.
Может кому пригодится...

К библиотекам душа не лежит. Всё равно приходится по руководству разбираться как что работает.
У меня ещё DMA настроено.


Сообщение отредактировал IgorKossak - Feb 7 2012, 10:42
Причина редактирования: Длинные коды следует приаттачивать файлом

Прикрепленные файлы
Прикрепленный файл  code.txt ( 64.24 килобайт ) Кол-во скачиваний: 624
 
Go to the top of the page
 
+Quote Post
sevastianovd
сообщение Feb 7 2012, 08:51
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 8-04-08
Из: Омск
Пользователь №: 36 562



koyodza, попробуйте пример из стандартной библиотеки stm um0427/FWLib/examples/ADC/TIMTrigger_AutoInjection
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Feb 7 2012, 19:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



У меня работает. (Надеюсь, таймер и канал сравнения настроены)
CODE
void delay_y()
{
volatile u32_t i, ty;
for(i=0; i<10000; i++) ty=GPIOA_ODR;
}

void init_adc()
{

// выключаем АЦП и ждём не менее 2-х периодов синхронизации АЦП
ADC1_CR1=0x00000000;
ADC1_CR2=0x00000000;
delay_y();
// включаем (1 мкс) и ждём время установления (1 мкс)
ADC1_CR2=0x00000001;
delay_y();
// выполняем калибровку
ADC1_CR2=0x00000005;
while(ADC1_CR2&0x00000004); // ждём окончания (5,9 мкс)

// настраиваем

// время захвата значения
ADC1_SMPR1=0x00000000;
ADC1_SMPR2=0x0002d000; // используется только 5-й и 6-й каналы
// SMPx[2:0]=101

// последовательность обычных каналов
ADC1_SQR1=0x00000000;
// L - длина последовательность
// SQx - номер канала
ADC1_SQR2=0x00000000;
ADC1_SQR3=0x00000006; // используется только 5-й и 6-й каналы


ADC1_CR1=0x00000020; //
// AWDEN=0; // отслеживание диапазона обычных каналов - не требуется
// JAWDEN=0; // отслеживание диапазона вклинивающихся каналов - не требуется
// DISCNUM=0; // кол-во каналов в прерывистом режиме
// JDISCEN=0; // прерывистый режим для вклинивающихся каналов - не требуется
// DISCEN=; // ??? прерывистый режим для обычных каналов -
// JAUTO=0; // автопреобразование вклинивающейся группы - не требуется
// AWDSGL=0; // отслеживание диапазона в режиме .. просмотра (scan) - не требуется
// SCAN=0; // режим просмотра - не требуется
// JEOCIE=0; // прерывание по вклинивающимся каналам - не требуется
// AWDIE=0; // прерывание по отслеживанию диапазона - не требуется
// EOCIE=1; // прерывание по обычным каналам - разрешено
// AWDCH=0; // номер канала для отслеживания диапазона


ADC1_CR2=0x00100001; //
// TSVREFE=0; // каналы датчика температуры и внутреннего опорного - не требуется
// SWSTART=0; // программный запуск преобразования на обычных каналах
// JSWSTART=0; // программный запуск преобразования на вклинивающихся каналах
// EXTTRIG=1 ; // запуск преобразования обычного канала по внешнему сигналу - разрешен
// EXTSEL=000; // источник внешнего запускающего сигнала для обычного канала - таймер 1, канал 1
// JEXTTRIG=0; // запуск преобразования вклиниваюегося канала по внешнему сигналу - не требуется
// JEXTSEL=0; // источник внешнего запускающего сигнала для вклинивающихся каналов - не требуется
// ALIGN=0; // выравнивание результата - вправо
// RSTCAL=0; // сброс калибровки
// CAL=0; // запуск калибровки
// CONT=0; // непрерывный режим - не требуется
// ADON=1; // включение АЦП / запуск преобразования
// запуск преобразования происходит если выполняется оба условия:
// 1) до этого АЦП уже был включен ADON=1;
// 2) кроме бита ADON другие биты не меняются
}


Сообщение отредактировал IgorKossak - Feb 7 2012, 20:10
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 8 2012, 03:16
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Юрий_СВ @ Feb 8 2012, 01:38) *
У меня работает. (Надеюсь, таймер и канал сравнения настроены)
Код
// последовательность обычных каналов
ADC1_SQR1=0x00000000;

Я правильно понимаю, что у вас длина последовательности равна нулю? Почему так?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Feb 8 2012, 09:08
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



Цитата(AHTOXA @ Feb 8 2012, 06:16) *
Я правильно понимаю, что у вас длина последовательности равна нулю? Почему так?

Нет вы понимаете неправильно. Она равна 1.
Цитата
Bits 23:20 L[3:0]: Regular channel sequence length
These bits are written by software to define the total number of conversions in the regular
channel conversion sequence.
0000: 1 conversion


Сообщение отредактировал Юрий_СВ - Feb 8 2012, 09:09
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 8 2012, 11:05
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Юрий_СВ @ Feb 8 2012, 15:08) *
Нет вы понимаете неправильно. Она равна 1.

Я не о том. Вопрос вот какой: а не маловато ли вам будет одного преобразования для двух каналов?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Feb 8 2012, 11:33
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



Цитата(AHTOXA @ Feb 8 2012, 14:05) *
Я не о том. Вопрос вот какой: а не маловато ли вам будет одного преобразования для двух каналов?

В самый раз. Номер канала меняется в прерывании.
1) между преобразованиями надо, как минимум, управлять внешними коммутаторами.
2) в некоторых случаях приходится пропустить несколько прерываний при работающем таймере.
(заботиться о синхронизации номера канала в АЦП и программе - не хотелось бы)
3) мне удобнее обрабатывать каждый канал отдельно.
4) переношу большую программу с другого ядра (AVR) - переписывать пол программы - ради чего ?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 8 2012, 11:41
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Дык, надо ж сразу обо всём этом писать. А то получается ерунда - делитесь вроде как рабочим куском, а он оказывается вон ещё сколько всего требует.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Feb 8 2012, 12:10
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



Цитата(AHTOXA @ Feb 8 2012, 14:41) *
Дык, надо ж сразу обо всём этом писать. А то получается ерунда - делитесь вроде как рабочим куском, а он оказывается вон ещё сколько всего требует.

Надеюсь, вы шутите. Если человек хоть пару раз пролистывал описание МК - то у него всё необходимое есть.

Человек даже не посчитал нужным сказать какие каналы он использует: обычные или вклинивающиеся.
(для них предусмотрены совершенно разные источники запуска)
А вы мне предлагаете трактат на 3 страницы писать ?

Для него ведь важно:
1) Что это хоть у кого-нибуть работоспособно (у меня работает)
2) настройка битов регистра ADC1_CR2
// EXTTRIG=1 ; // запуск преобразования обычного канала по внешнему сигналу - разрешен
// EXTSEL=000; // источник внешнего запускающего сигнала для обычного канала - таймер 1, канал 1

Практически каждый бит подписан по-русски - неужели "убеждения" не позволят их поменять под себя?

Трудностей с отключением инверсных выходов таймера 1 у меня тоже не было. Работает нормально.

Сообщение отредактировал Юрий_СВ - Feb 8 2012, 12:11
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 8 2012, 12:53
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Юрий_СВ @ Feb 8 2012, 18:10) *
Надеюсь, вы шутите.
Нет, я не шучу.
Цитата
Если человек хоть пару раз пролистывал описание МК - то у него всё необходимое есть.

Тогда зачем ему ваш ответ? Вернее не так. Зачем вы ему тогда отвечаете? У него же есть всё необходимое! sm.gif
Цитата
Человек даже не посчитал нужным сказать какие каналы он использует: обычные или вклинивающиеся.

Если вы посмотрите повнимательнее, то увидите, что вопрос был задан более года назад. То есть, скорее всего, "человеку" ваш ответ уже не нужен. То есть, вы пишете свой ответ для других читателей форума, у которых возможно возникнет похожая проблема. И следовательно (это моё твёрдое убеждение), надо делать это внятно и понятно, с достаточной степенью детализации, а не бросать огрызки нерабочего кода, комментарии в котором к тому же не совпадают с его содержанием.
Цитата
А вы мне предлагаете трактат на 3 страницы писать ?

Не обязательно три страницы. Хотя бы эти ваши четыре пункта из поста №11.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Feb 8 2012, 14:37
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



Цитата(AHTOXA @ Feb 8 2012, 15:53) *
вопрос был задан более года назад.

Ой.. думал свежая тема (передо мной пара человек вчера оставили сообщения..)

Настройка АЦП stm32f100RB
- с калибровкой АЦП
- для обычных (regular) каналов (5-й и 6-й)
- запуск от таймер 1, канал1

Последовательный перебор каналов не используется - следующий канал выбирается после очередного преобразования.
Go to the top of the page
 
+Quote Post
koyodza
сообщение Feb 8 2012, 20:41
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(Юрий_СВ @ Feb 7 2012, 21:38) *
У меня работает. (Надеюсь, таймер и канал сравнения настроены)

Ну и где там TIM1 ?
Проблема была не в запуске АЦП в принципе, а в его запуске от TIM1.
Цитата(Юрий_СВ @ Feb 8 2012, 13:33) *
В самый раз. Номер канала меняется в прерывании.
1) между преобразованиями надо, как минимум, управлять внешними коммутаторами.
4) переношу большую программу с другого ядра (AVR) - переписывать пол программы - ради чего ?

Я Вам уже на сахаре говорил: не нужно пытаться использовать здесь старые навыки. Это вам не АВР, какими ещё "внешними коммутаторами" Вы тут управляете? 16-канального встроенного мало?
Встроенным мультиплексором АЦП управляет сам, нужно только его настроить, дальше он будет переключать каналы и складывать результаты куда нужно (если ещё и DMA настроено).
Цитата(Юрий_СВ @ Feb 8 2012, 16:37) *
- для обычных (regular) каналов (5-й и 6-й)
- запуск от таймер 1, канал1
Последовательный перебор каналов не используется - следующий канал выбирается после очередного преобразования.

Это только вручную. Но ЗАЧЕМ делать через *опу если можно сделать нормально?
Цитата(Юрий_СВ @ Feb 8 2012, 14:10) *
Надеюсь, вы шутите. Если человек хоть пару раз пролистывал описание МК - то у него всё необходимое есть.

Человек даже не посчитал нужным сказать какие каналы он использует: обычные или вклинивающиеся.
(для них предусмотрены совершенно разные источники запуска)
А вы мне предлагаете трактат на 3 страницы писать ?

Да, не посчитал, и у меня были на то основания: TIM1 должен работать и с regular и с injected каналами (только разные модули сравнения используются).

Цитата(Юрий_СВ @ Feb 8 2012, 14:10) *
Для него ведь важно:
1) Что это хоть у кого-нибуть работоспособно (у меня работает)

Я использую этот МК с 2007г, Вы - только три недели. АЦП у меня используется в каждом проекте, просто не было необходимости запускать его именно от TIM1. Или Вы думаете, [CENSORED]?

Цитата(Юрий_СВ @ Feb 8 2012, 14:10) *
2) настройка битов регистра ADC1_CR2
// EXTTRIG=1 ; // запуск преобразования обычного канала по внешнему сигналу - разрешен
// EXTSEL=000; // источник внешнего запускающего сигнала для обычного канала - таймер 1, канал 1

Практически каждый бит подписан по-русски - неужели "убеждения" не позволят их поменять под себя?

Это меня не интересует.

Цитата(Юрий_СВ @ Feb 8 2012, 14:10) *
Трудностей с отключением инверсных выходов таймера 1 у меня тоже не было. Работает нормально.

Они обязательно появятся, когда Вам понадобится использовать одновременно 4 таймера с выводом 3-4 каналов каждого таймера наружу, 2 SPI, UART, несколько каналов АЦП и всё это в малоногом корпусе. Вот тогда и полезут глюки, связанные с ремапом и невозможностью использования некоторой периферии одновременно

Сообщение отредактировал IgorKossak - Feb 9 2012, 08:19
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Feb 9 2012, 12:13
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



Цитата(koyodza @ Feb 8 2012, 23:41) *
Ну и где там TIM1 ?

// EXTSEL=000; // источник внешнего запускающего сигнала для обычного канала - таймер 1, канал 1

Если бы вы более точно выражали свои мысли - ответ был бы более точным.
Вас могло интересовать:
1) сама возможность запуска (т.е. не являются ли ваши трудности ошибкой кристалла) - я ответил
2) настройки АЦП (иногда влияет полседовательность действий или в очередной доке могло быть изменено значение EXTSEL) - я ответил
3) настройка таймера 1 (сами знаете - очень объёмная, для обычных каналов АЦП - особенностей нет) - решил пока не вываливать - если нужно будет - спросите
4) разрешение синхронизации и настройка выводов (тут вообще всё просто - если надо спросите)

А раз вы не уточнили что из этого вам нужно - дал наиболее актуальное (на своё усмотрение) 2 пункта из 4-х.
На зеркало пинять....

Цитата(koyodza @ Feb 8 2012, 23:41) *
Я Вам уже на сахаре говорил: не нужно пытаться использовать здесь старые навыки. Это вам не АВР, какими ещё "внешними коммутаторами" Вы тут управляете? 16-канального встроенного мало?
Встроенным мультиплексором АЦП управляет сам, нужно только его настроить, дальше он будет переключать каналы и складывать результаты куда нужно (если ещё и DMA настроено).
Это только вручную. Но ЗАЧЕМ делать через *опу если можно сделать нормально?

Я знаю, что вселенская мудрость доступна только вам biggrin.gif

А на АВР нет встроенного коммутатора ? Есть. Значит, наверное, есть причины использовать внешний ?
(мне 16 не надо, мне надо 4 входа, но внешний)
ПДП здесь .. не очень полезен. Требуется расчитывать и выставлять управляющее воздействие между выборками.

А на счёт "не нужно пытаться использовать здесь старые навыки".
Знать бы ещё что вы имеете в виду. Надеюсь, что-то более содержательное, чем многократное повторения этой фразы.
На сахере я задавал вопрос о том где описано время исполнения инструкций.
Вместо ответа вы многократно повторяли фразу "не нужно пытаться использовать здесь старые навыки".
Другой человек дал исчерпывающий ответ на вопрос. Ему огромное спасибо.

Ведь принципиальных различий между AVR и Cortex M3 не так и много.
Прежде всего:
- разрядность
- особенности работы конвеера, выборки команд и буферезации
- общее поле памяти и возможность запуска из ОЗУ (и отсутствие EEPROM в STM32F10x)

Даже набор регистров у них похож, не в пример различиям между STM32 и STM8.

Сообщение отредактировал Юрий_СВ - Feb 9 2012, 12:18
Go to the top of the page
 
+Quote Post
koyodza
сообщение Feb 9 2012, 15:28
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(Юрий_СВ @ Feb 9 2012, 14:13) *
// EXTSEL=000; // источник внешнего запускающего сигнала для обычного канала - таймер 1, канал 1

Дело не в выборе источника запуска. Я использовал Timer 2 CC2 event, Timer 3 TRGO event, Timer 4 CC4 event и даже EXTI line 11, проблем не было. Проблемы были не в настройке АЦП, а в таймере, который не отдавал Timer 1 CCх event. И именно об этом и ставился тогда вопрос.

Цитата(Юрий_СВ @ Feb 9 2012, 14:13) *
А раз вы не уточнили что из этого вам нужно - дал наиболее актуальное (на своё усмотрение) 2 пункта из 4-х.

Спасибо, больше можете не беспокоиться. Ваши советы меня не интересуют.

Цитата(Юрий_СВ @ Feb 9 2012, 14:13) *
мне 16 не надо, мне надо 4 входа, но внешний

Бывает и так, но это, скажем, "не совсем обычная задача", и тут уж Вам бы следовало описать её подробнее.

Цитата(Юрий_СВ @ Feb 9 2012, 14:13) *
Ведь принципиальных различий между AVR и Cortex M3 не так и много.
Даже набор регистров у них похож, не в пример различиям между STM32 и STM8.

Если бы я раньше не слышал от одного грамотея фразу "MSP и DSP похожи", признал бы это лучшим анекдотом про микроконтроллеры.
Хотя, конечно, чем-то они таки похожи: корпус и там и там квадратненький чёрненький. Регистры у AVR и ARM тоже с одинаковой буквы обозначены biggrin.gif

А ссылки на документацию по ядру я Вам на сахаре не дал сознательно, потому как считаю путь подсчёта тактов изначально ущербным применительно к ARM, и ещё потому, что не считаю эту информацию необходимой начинающему.
Обычно я пытаюсь дать не то, что просят, а то, что нужно просящему
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 13 2012, 22:00
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Пытаюсь запустить АЦП от события TIM6_TRGO
Не понимаю : почему на схеме таймера событие TIM6_TRGO возникает в каком-то Trigger Controller , а не в нижней части
схемы, где счётный регистр сравнивается с auto-reload регистром ?

Выбрал в регистре CR2 в битах MMS возникновение события TRGO при Update .
Код
TIM6->CR2|=TIM_CR2_MMS_1;
АЦП запускается, но только один раз. Хотя прерывания от таймера происходят, т.е. он работает.
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 14 2012, 08:24
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(MiklPolikov @ Apr 14 2012, 02:00) *
Не понимаю : почему на схеме таймера событие TIM6_TRGO возникает в каком-то Trigger Controller , а не в нижней части схемы, где счётный регистр сравнивается с auto-reload регистром ?

Потому что выход TRGO может выводить и другие сигналы, а не только сигнал переполнения (Update). Контроллер коммутирует соответствующий сигнал. Посмотрите на более полнофункциональные таймеры TIM1, TIM8 - там это очевидно. TIM6 - это урезанная версия таймера.

Цитата(MiklPolikov @ Apr 14 2012, 02:00) *
Выбрал в регистре CR2 в битах MMS возникновение события TRGO при Update .
Код
TIM6->CR2|=TIM_CR2_MMS_1;
АЦП запускается, но только один раз. Хотя прерывания от таймера происходят, т.е. он работает.

Тут нужно смотреть подробнее на конфигурацию таймера и АЦП.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 14 2012, 10:53
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(scifi @ Apr 14 2012, 11:24) *
Тут нужно смотреть подробнее на конфигурацию таймера и АЦП.


Посмотрите ?
Я правильно понимаю, что под отладкой в KEIL ни как нельзя посмотреть возникло ли событие TRGO , и создать его руками тоже нельзя ?


CODE
//////////////настраиваем таймер 6//////////////////////////
void TIMER6_INIT(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // включаем тактирование TIM7

TIM6->CR1|=TIM_CR1_URS|TIM_CR1_CEN;
TIM6->DIER|=TIM_DIER_UIE; // разрешение прерывания
TIM6->PSC=0xFF; // делитель
TIM6->ARR=0xFF; // макс. значение
TIM6->CR2|=TIM_CR2_MMS_1;//выбрали событие Update в качестве триггера TRGO

NVIC_SetPriority(TIM6_IRQn, 1);
NVIC_EnableIRQ(TIM6_IRQn);

//////////////////настраиваем АЦП/////////////////////////
void ADC_INIT(void)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //включаем тактирование АЦП

ADC1->CR2|=ADC_CR2_ADON; //включили АЦП
while(!(ADC1->SR & ADC_SR_ADONS)){} // ждём пока включится

ADC1->CR1|=ADC_CR1_PDI; //power down между преобразованиями

ADC1->CR1|=ADC_CR1_RES_1; // 8 бит

ADC1->CR2|=ADC_CR2_EXTEN_0; // преобразование по переднему фронту внешнего сигнала
ADC1->CR2|=ADC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_3; //преобразование по TIM6_TRGO event

ADC1->SQR5|=(1<<0); //1 преобразование в цепочке 1 канал

ADC1->CR2|=ADC_CR2_EOCS; //прерывание при завершении преобразование всей группы ???

ADC1->CR1|=ADC_CR1_EOCIE; // включаем прерывание end of conversion
}
}


Сообщение отредактировал IgorKossak - Apr 14 2012, 15:31
Причина редактирования: [codebox]


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Apr 14 2012, 21:20
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Разобрался. Оказалось что АЦП не хочет запускатся второй раз , если выставлен флаг OVR в регистре SR.
Код который я привёл выше - работает, если добавить сброс OVR в прерывании от АЦП

Но я не понимаю :
1)Почему флаг OVR выставляется даже если я читаю регистр DR в прерывании.
2)Если в группу преобразований можно добавить несколько каналов, а регистр с данными DR всё равно только 1, то какой смысл в группе ?
И как потом в прерывании понять, от какого канала из группы данные в DR ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
koyodza
сообщение Apr 15 2012, 13:29
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(MiklPolikov @ Apr 14 2012, 23:20) *
Но я не понимаю :
1)Почему флаг OVR выставляется даже если я читаю регистр DR в прерывании.
2)Если в группу преобразований можно добавить несколько каналов, а регистр с данными DR всё равно только 1, то какой смысл в группе ?
И как потом в прерывании понять, от какого канала из группы данные в DR ?

А зачем это делать в прерывании? В этом МК это лучше делать с помощью DMA, мультиплексор будет переключаться автоматически и данные будут сами перебрасываться в буфер. Это как раз то, что я имел в виду, когда говорил, что нужно отказываться от старого подхода в работе
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 10:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01623 секунд с 7
ELECTRONIX ©2004-2016