Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.12.2007, 01:05
|
|
Прохожий
Регистрация: 09.12.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
подскажите новичку (гистирезис бит)
Я на ATtiny 13 сделал АЦП и данные с АЦП передаю через интерфейс spi. сделал накопления (16) для избежания дребизга на выходе, но не помогает. Думаю что дело в гистирезисе только как реализовать программно на С только догадки. Подскажите пожалуйста. Заранее премного благодарен всем просветителям новичка.
|
|
|
|
11.12.2007, 09:02
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Вот нарисован гистерезис. Если входная величина превышает какой-либо порог, то на выходе устанавливается другое устойчивое состояние. Переход в исходное состояние происходит при меньшем значении входной величины.
Что же Вы хотите? Что значит дребезг?
Удачи.
-- Прилагается рисунок: --
![](https://kazus.ru/nuke/users_images/11122007/1651478.JPG)
|
|
|
|
11.12.2007, 11:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.08.2007
Адрес: Болгария Перник
Сообщений: 1,771
Сказал спасибо: 74
Сказали Спасибо 357 раз(а) в 245 сообщении(ях)
|
Схемку бы, от входа до вывода АЦП. Вам скорее всего шумы мешают.
__________________
Мыслю, следовательно существую
|
|
|
|
11.12.2007, 11:02
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
согласен с nokazus:
нчто вроде (пишу прямо в окне, потому может не быть ситаксиса)
Код:
|
void UpdateState(void){
if (Val ‹ ((StateVal[i]+ StateVal[i+1])/2-k)
&&
(Val › ((StateVal[i]+ StateVal[i-1])/2+k)
){
State = i;
}
}; |
Суть такая :
Диапазоны значений выглядят так:
0000HHHH1111HHHH2222....
позиция символа - код АЦП, Цифры - интервалы стабильных значений, буквы Н - зоны гистерезиса.
В условии проверяем, лежит ли код АЦП в зоне стабильного состояния, и только в этом случае изменяем состояние. В противном случае (условие не выполняется, т.к. значение лежит в зоне гистерезиса), НЕ ИЗМЕНЯЕМ состояние (т.е. оставляем предыдущее значение).
|
|
|
|
11.12.2007, 17:01
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Чего за дребезг, и где? Ни чего не понятно.
Может тебе какое-нибудь усреднение сделать?
|
|
|
|
11.12.2007, 20:38
|
|
Прохожий
Регистрация: 09.12.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
дребезг это когда при постоянном сигнале на входе ацп на выходе прыгают биты (хотя не должны)
rremix большое спасибо за код
и еще если можно поподробнее описать условие
"(Val ‹ ((StateVal[i]+ StateVal[i+1])/2-k)"
как я понимаю Val это значение ацп
а дальше не совсем понятно
|
|
|
|
11.12.2007, 22:40
|
|
Прохожий
Регистрация: 09.12.2007
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
спасибо всем за внимание
нашел решение проблемы
наверно тоже самое что и код rremix но так я немножко "чайник" не понял полностью его
|
|
|
|
17.12.2007, 16:25
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ничего удивительного, что условие непонятно... я сам его не понял ![Улыбка](images/smilies/icon_smile.gif) помню только - спать хотелось очень ![Улыбка](images/smilies/icon_smile.gif) ))
Суть условия такова: имеется массив значений, являющихся серединами диапазонов, для которых определено состояние. Дальше надо проверить, как текущее значение относится к этому диапазону. т.е. вычисляем среднее арифметическое двух соседних значений (проверяемого и следующего) - получаем середину, т.е. в идеале - момент переключения. Потом вычитаем некотурую константу - т.е. половину зоны гистерезиса. То же самое делаем с предыдущим (перед проверяемым) значением. Тагим образом появляется понятие "диапазон значений, при которых ТОЧНО пора переключаться". И вторично появляется диапазон значений, при которых ни одно из условий (при выполнении всего цикла проверки) не выполняется (т.к. лежат к сред. арифм. между значениями ближе, чем константа). Они обозначены в пред. посте буквами H.
Вот при этих значениях просто ничего не делаем.
Есть и другие способы (напр. задавать границы, а не середины, и вычитать/добавлять конст. к значению границ). Но суть та же. Не забываем про инициализацию (т.е. что надо делать, если при включении контроллера значение лежит в зоне гистерезиса).
|
|
|
|
17.12.2007, 17:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,535
Сказал спасибо: 698
Сказали Спасибо 4,313 раз(а) в 1,977 сообщении(ях)
|
Кстати, об измерениях. Всем советую почитать литературу на тему "Improving ADC Resolution By Oversampling".
http://www.yandex.ru/yandsearch?text...mpling&rpt=rad
http://www.google.com/search?ie=UTF-...20Oversampling
Есть статьи от Атмела, Cygnal, Silabs,
Texas I, Actel. Идея в том что можно реально повысить разрядность АЦП на 2-3 и более разрядов применяя множественные измерения и обрабарывая результаты довольно простым образом. Сам этим давно пользуюсь. К тому же фильтрация и усредение получаются автоматически.
|
|
|
|
18.12.2007, 14:57
|
|
Временная регистрация
Регистрация: 14.04.2007
Сообщений: 65
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Где-же ты раньше был ?
Как я понял вот это основное ? :
//////////////////////////////////////////////////
void ADC_isr (void) interrupt 15
{
static unsigned int_dec=256;
static long accumulator=0L;
ADCINT = 0;
accumulator += ADC0;
int_dec--;
if (int_dec == 0)
{
int_dec = 256;
result = accumulator ›› 4;
accumulator = 0L;
}
}
////////////////////////////////////////////////////
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:29.
|
|