| Автор |
Съобщение |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
 Capture модул при PIC
За първи път ми се налага да го ползвам (до сега съм ползвал само PWM) та възникна следния въпрос:
- събитието на Capture-a не нулира таймера - или трябва да го нулира ако искаме да измерваме период?
Ако някой се е сблъсквал с подобна ситуация - моля да сподели впечатление.
|
| Сря Яну 23, 2008 2:29 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Не го нулира, зануляваш таймера, пускаш модула - при прекъсване получаваш стойността.
|
| Сря Яну 23, 2008 4:50 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Да ама като го нулираш ти "краде" импулси от измерената стойност.Пример:
Инициализиране Capture:
Инициализиране TMR3: Първата отчетена стойност е грешна - с това се примирих. Сегмента по прекъсване е :
На съответния пин съм пуснал сигнал със импулс/пауза по 100 цикъла.Когато сегмента по прекъсване е като тук дадения - първия път си отчита
някакво число - 92,на следващото прекъсване стойността в буфера е 292 ! ,на по-следващото - 492, т.е увеличава се с по 200 както му е реда,
но почне ли да се пипа в прекъсването се забозяват нещата,в смисъл отчита 173 или 182 или стойността се колебае между 179-181.Каква е
хвaтката в този случай?Контролера е dsPIC30F4013.
|
| Сря Яну 23, 2008 7:16 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Запомняш предната стойност и изваждаш от новата без да пипаш таймера. Препълването на таймера не пречи.
|
| Чет Яну 24, 2008 10:41 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Пречи - в един момент стойността става отрицателна а при плавно изменение трудно ще разбереш какво измерваш .
Последна промяна Ки4о на Чет Яну 24, 2008 10:30 pm, променена общо 1 път
|
| Чет Яну 24, 2008 9:58 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Ако е отрицателен резултата , вземаш допълнението.
|
| Чет Яну 24, 2008 10:23 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
@ji4ka,съгласен съм с тов което казваш,ама като се променя честотата,респективно периода как точно ше измериш периода? Трябва да правиш буфер,да сумираш да речем 10 резултата,после да усредняваш,.... а преди това имаш изваждане със следене на знак,че и Capture модула трябва да го следищ за препълване - става много дълга.Търся по-елегантно решение.Хищника спомена за нулиране на таймера и пускане на модула - ама ако може да пообясни как го прави без да се губят отчети.Струва ми се че греша някъде,ама мамка му не мога да усетя къде 
|
| Чет Яну 24, 2008 10:35 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Нещо не е ясно заданието. Ами нали с каптурето мериш точно периода. А и другото си е елементарна аритметика. Честота се мери по друг начин - с брояч. Мерене на променлива честота няма реален смисил. Модула си има прекъсвания , не ги следиш - те те викат.
|
| Чет Яну 24, 2008 11:05 pm |
|
 |
|
nik
Ранг: Форумен бог
Регистриран на: Сря Мар 22, 2006 3:25 am Мнения: 6418
|
периода ти е аналогова величина, която опитваш да дискретизираш, нормално е да мърда, но с 1, не повече ( ако всичко е изпълнено правилно )
брояча може да не го пипаш, само копираш, и ако има разлика на разредността на таймера и процесора внимаваш много
копираш го в unsigned, после от новото вадиш старото и готово, и поради натрупване на грешката от време на време ще показва с 1 повече, това е полезно за последващо интегриране, може да се постигне точност с още 1-2 разряда повече от брояча
може и да го нулираш, но тогава трябва внимателно да следиш за колко време се изпълнява прекъсването и всеки път да е гарантирано едно и също, първо копираш после нулираш и продължаваш нататък
проблема с препълването остава много неприятен тъй като по нищо не личи кога е превъртял брояча, за това трябва от време на време да се проверява дали и колко пъти и при много ниски честоти може и тайм аут да се направи
|
| Пет Яну 25, 2008 12:05 am |
|
 |
|
Syrius-B
Ранг: Форумен бог
Регистриран на: Пон Яну 30, 2006 2:48 am Мнения: 1248 Местоположение: София
|
Никакъв проблем не е преминаването през оверфлоу.
Ако е само веднаж, естествено.
При изваждането пренебрегваш преноса (заема) и числото си е вярно.
За да няма повече от един пренос, избираш така честотата на таймера (с прескалерите), че FFFF такта да са повече от най-дългия ти период
|
| Пет Яну 25, 2008 1:36 am |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
А бе той таймера не дава ли прекъсване при препълване? Какъв таймер е той тогава?
Броиш прекъсванията и ги добавяш към разликата.
|
| Пет Яну 25, 2008 2:42 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Идеята е да се пусне таймер 3 и всеки кепчър си е независим-има си собствен буфер и прекъсване.Така като ти генерира прекъсване четеш буфера,вздиш от него предната му стойност и получавашброя отчети от кепчъра.Работата е там че за 4 канала трябва да имаш за всеки канал по 3 буфера,за да може да откриеш изменение на резултата иначе като засечеш даден резултат и той е различен с повече от едно от предходния защото не си сигурен какво е станало а и непрекъснато трябва да се проверява статуса за препълване на буфера на кепчъра.Мислех че работи - пускащ таймера и кепчъра,кепчъра като си детектне събитието си го пише в буфера и отново се стартира и няма такива допълнителни мъки,ама явно много съм се лъгал 
|
| Пет Яну 25, 2008 9:49 am |
|
 |
|
nik
Ранг: Форумен бог
Регистриран на: Сря Мар 22, 2006 3:25 am Мнения: 6418
|
Each capture channel has an associated FIFO buffer which is four 16-bit words deep. There are two status flags which provide status on the FIFO buffer:
• ICBNE – Input Capture Buffer Not Empty
• ICOV – Input Capture Overflow
........................
In the event that the FIFO is full with four capture events and a fifth capture event occurs prior to a read of the FIFO, an overflow condition occurs and the ICOV bit is set to a logic ‘1’. The fifth capture event is lost and is not stored in the FIFO. No additional events are captured until all four events have been read from the buffer.
If a FIFO read is performed after the last read and no new capture event has been received, the read will yield indeterminate results.
така че това което си си мислел е така, но с тази подробност, че таймер и кепчър са два отделни модула, работещи всеки за себе си, и кога единия е превъртял, а другия сработил от преход са отделни събития и ти трябва да следиш кое кога е станало, и колко пъти е станало
|
| Пет Яну 25, 2008 12:26 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
- напълно съм наясно с това ,но се чудех има ли вариант да следиш само прекъсването на кепчъра без всички останали подробности - препълвания,изваждания,....
|
| Пет Яну 25, 2008 8:50 pm |
|
 |
|
Syrius-B
Ранг: Форумен бог
Регистриран на: Пон Яну 30, 2006 2:48 am Мнения: 1248 Местоположение: София
|
Ако прочетеш какво съм ти написал по-горе - ДА
|
| Съб Яну 26, 2008 12:46 am |
|
|