Помогите разобраться с программой

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Спасибо большое, попробую так...
есть еще вопрос, каким образом в си задаются интервалы?
К примеру мне нужно, что бы при val>а светодиод включался, а при val меньше b выключался. по условию а больше б.

Код: Выделить всё

if(val>(level-level_delta)) STATUS1_ON;
  if ((level-level_delta)>val>(leveloff-level_deltaoff)) STATUS1_ON;
  else
  if (val<(leveloff-level_deltaoff)) STATUS1_OFF;
}


Я написала так, но почему то не работает...
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Ежик в тумане писал(а):Спасибо большое, попробую так...
есть еще вопрос, каким образом в си задаются интервалы?
К примеру мне нужно, что бы при val>а светодиод включался, а при val меньше b выключался.


Может по простецки :

if (val>а) Включить ;

if (val<b) вЫключить ;
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

не, блин не так сформулировала, нужно что бы при val>a включался, при val меньше б выключался а в промежутке горел а больше б по условию.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Я так и накалякал - с гистерезисом.

Например:

if (val>15) Включить ;
if (val<10) вЫключить ;

После включения на 16 будет гореть пока не снизится до 9. А снова включится при достижении 16.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Ой, спасибо... числа оказались не те... теперь работает :)
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Подскажите еще плиз, по работе АЦП...
у меня в схеме есть две меги 16, на каждый вход ацп приходит сигнал синусоида 50 Гц с амплитудой от 0 до 5В. При достижении уровня сигнала в 3 В контроллер на одном из портов должен выдавать логическую 1, а при снижении амплитуды до 2,4 В логический ноль. Проблема в том, что у меня оба канала включаются при 3В, а выключаются по разному. Первый канал выключается при 2,9В, второй как и положено при 2,4В. Причем у первого канала наблюдается моргание светодиода. Программы в обоих мегах одинаковые, сигналы на вход приходят одинаковые по амплитуде и фазе, опорные уровни тоже одинаковые... Далее я попробовала сделать фильтр (брала соседние отсчеты и делила на 2) моргание светодиода первого канала пропало и выключаться он стал при 1,9В. Второй канал выключается при 2,4В как и было ранее.
В чем может быть причина такой работы в погрешности ацп, в разводке платы. в программе синхронизации контроллеров? Но включаются то они синхронно, почему тогда выключаются несинхронно? Уже голову сломала что это может быть....Подскажите кто что знает...
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Ежик в тумане писал(а):с амплитудой от 0 до 5В.


Если это крайние значения - то это РАЗМАХ сигнала. Амплитуда это макс отклонение от средней величины. Для синусоиды Рамах в 2 раза больше амплитуды.

Ежик в тумане писал(а):При достижении уровня сигнала в 3 В контроллер на одном из портов должен выдавать логическую 1, а при снижении амплитуды до 2,4 В логический ноль.


Настройте мастером CVAVR АЦП ( пример в задаче 11 под кнопкой Изображение ниже) и в прерывании по окончании АЦП делайте проверку IF как написано выше и запускайте следующее преобразование. При изменении входа АЦП делайте холостое АЦП.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

1. Да за была уточнить... перед мегой стоит изолирующий усилитель... на вход него приходит синусоида к примеру 3 В, а на входы ацп приходит только положительная полуволна синусоиды... срабатывать должно при 3В на входе усилителя.
2. Проверка с помощью иф конечно же делается, в обе меги записывается одна и та же программа и одинаковые числа соответственно... Ацп работает по прерыванию от таймера с частотой 2 кГц. Вход АЦП всегда один и он не меняется.
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

К стати про смену входа ацп я не совсем поняла... сигнал на обе меги приходит синхронно ... абсолютно одинаковый. В каждом ацп используется только один канал. И можно немного поподробнее про холостое ацп преобразование? Это преобразование без сохранения результата?
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Ежик в тумане писал(а):немного поподробнее про холостое ацп преобразование? Это преобразование без сохранения результата?


Обычное преобразование но его результат вы игнорируете.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

А подскажите еще пожалуйста, как правильно на си написать число... к=Т*f0, где T =3,14 - период а f0=2000Гц частота дискретизации...
как эти числа правильно записать и какой тип данных использовать?
для Т это будет float? и как запишется число 3,14 и 2000?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

число ПИ обычно уже определено как константа в модуле math.h

например, для компилятора WinAVR оно обозначается M_PI - см. документацию по avr-libc

если писать "вручную", то вместо запятой надо ставить точку, т.е. 3.1415

Целые числа так и писать, при умножении на float все преобразования будут выполнены автоматически.

P.S. по возможности избегайте типов float и double - размер кода очень сильно разрастается и так же сильно падает скорость исполнения програмы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Спасибо!
Может подскажите еще в чем все таки может быть причина того, что обе меги включаются при одном входном напряжении а выключаются при разных с разницей в 0,5В. Сигналы на входе, опорное напряжение, питание все одинаковое... программы в обеих контроллерах тоже одинаковые...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

при поиске ответа на загадку о пороге переключения, я бы провел такие эксперименты:
1. переставил (если возможно) контроллеры местами, проверил бы, зависит эта ситуация от места в схеме или не зависит
2. взял бы 2 новых абсолютно контроллера, прошил бы их и поставил взамен старых - возможно один контроллер "подпаленный"
3. считал бы фьюзы - возможно что-то нехорошее кроется там... считал бы из контроллеров всю память и сравнил бы ее побайтно - возможно тезис об одинаковости прошивок не является истиной.
4. если вышеописанные пункты не проясняют ситуацию - выкинул бы все нафик и сделал бы принципиально новую схему :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Спасибо :) Перспективы у меня совсем не радужные....
Меги к сожалению местами не поменять... они уже впаяны...
Можно, конечно взять новые меги впаять их на место старых прошить и посмотреть...
фьюзы считывали - там все одинаково, остается только считать еще всю память или сразу не мучаясь все выкинуть...
Вот еще интересный момент, сегодня попробовала подать на вход синусоиду с частотой 25, 50 и 75 Гц... Обнаружила что чем выше частота, тем стабильнее все работает... В смысле включаются и выключаются при одинаковых напряжениях... но на 50 Гц выключается при 2,4В и 1,9В то на 75 уже при 1В оба канала выключаются , на 25 Гц вообще не поняла что происходит светодиоды моргают включение и выключение происходит при 3В...
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Изиняюсь шо вмешиваюсь.
Но мне хочется изложить свое объяснение, как найти максимальное значение.
Т.к. здесь явно показывается (суть) машинный ход(шаг).

б=0;
цикл{ // бесконечный или по конца какого либо массива
а = значению вход АЦП;// текущему или если мссив то началу массива
если (а больше б) // если предыдущее значение меньше текущего, т.е. а больше б
то {
б=а; // то текущее становится предыдущим
};
} // и так в цикле или пока не кончится массив(увеличивая ячейку массива за каждый цикл)

Также(этим способом), можно найти конец фазы. И синхронизироваться. К примеру.


По поводу коэфицентов.
Так, блин покажте(!) где они применяются!
Там должно быть такое:
Опрос АЦП и что то с полученным значением делается(формулка или небольшие матем. операции).
Ну типа, - значение АЦП*10/2+коэффициент.
Вот сдесь и играйте!
Можно либо расчитать, но это схему смотреть надо. Скорее там
делитель, так насколько он делит?!
А можно просто, методом тыка, не - значение АЦП*10/2+коэффициент.
А (значение АЦП*10/2+коэффициент)*2. Сразу получите уровень срабатывания не 3В а 6В.


По последнему сообщению, видимо не прописан алгоритм синхронизации с синусоидой. Т.е. массив заполняется(он не нужен! его надо удалить) не синфазно с синусоидой сигнала. Т.е за текущий период, он нашёл(МК) максимум но начал замер не от нуля (с нуля фазы) а как получилось...

Это всё сугубо мои предположения, но не помешает к рассмотрению.
Ужос!!!
простое чмо, выдумщик
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Спасибо за ценные мысли... собственно массив уже был так написан как Вы сказали....

Далее есть еще вопрос... у меня контроллер должен выдавать лог.1 на выходе когда на входе устройства приходит 3 В действующего напряжения. Эти 3 В со входа через резисторы и стабилитроны идут на микросхему AD202JY (это можно назвать фильтром или однополупериодным выпрямителем или еще как то). Т.е. на входе этого фильтра у меня уже не 3 В действующегозначения напряжения а 1,65В, соответсвенно после выпрямления на выходе 1,15В действующего либо если брать размах амплитуды одной полуволны 3,12В. АЦП измеряет одну полуволну, далее находим максимум - если этот максимум больше коэффициента, записанного в епроме, то выдаем лог.1 если меньше - лог.0
вопрос в том нужно ли мне этот измеренный максимум пересчитывать к действующему значению? Какой коэффициент записывать в епром, если у меня опорное напряжение 4,09В, для 8 разрядного ацп это 0,016 В на разряд? т.е. для 3 В это будет 3/0.016=ВВ? Но у меня срабатывание от этого значения не происходит, а происходит от значения 0х47h т.е. 71*0.016=1,15В, только при этом необходимо измеренное максимальное значение разделить на 2... Почему так.... ЫЫЫЫЫЫЫЫЫ
MetEl
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Чт окт 18, 2007 16:45:30
Откуда: из Питера

Сообщение MetEl »

Дайте схему!
Вы десительно на Мегу16 на aref 4.09В подаёте?
Вы уверены, что 8-м бит преобразовангие, а не 10-бит(это вами прописано).
простое чмо, выдумщик
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ежик в тумане
Встал на лапы
Сообщения: 80
Зарегистрирован: Ср ноя 28, 2007 09:42:28

Сообщение Ежик в тумане »

Да на входе aref 4.09В... Было уже 10 раз все измерено...
что касается результата ацп, то в программе используются данные только одного регистра ADCH, при этом стоит выравнивание результата по левой границе...
Под действующим напряжением я понимаю значение напряжения. которое измеряю тестером...3 В оно равно 0,7* U ампл, амплитудное значение при этом равно 4,5В ... Размах соотвественно в 2 раза больше амплитудного т.е. порядка 9В.... Возможно, я недостаточно глубоко понимаю что такое действующее напряжение ... ну как понимаю, если неправильно, поправьте, плиз...
К стати прошу прощения, немного ошиблась, при числе ВВ срабатыване происходит при значении напряжения 3,8В на входе схемы (до фильтров), при этом измеренное максимальное значение на 2 не делю....
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»