Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 4 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
алгоритм
DAlexV Дата: Вс, 15.07.2012, 14:43  |                                                                                                                Сообщение # 46
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Добавил еще один таймер для смещения включения светодиода. Принцип такой:
при прерывании по В.0 запускается таймер 2 (значение таймера это и есть сдвиг относительно начала импульса)
по прерыванию (переполнение таймера 2) если светодиод не был включен, то включаем его и даем таймеру новое значение(время горения светодиода)
по повторному переполнению таймер 2 (светик уже был включен) выключаем светик, и стопорим таймер (до следующего прерывания по В.0)

Исправления приложил, удачи wink
Прикрепления: EDIT.rar (74.5 Kb)


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Вс, 15.07.2012, 14:46
доцент2 Дата: Пн, 16.07.2012, 21:20  |                                                                                                                Сообщение # 47
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

посмотрел Ваши варианты, спасибо! Интуиция подсказывала о вводе в програаму еще одного таймера (просто я только с ними разбираюсь и заходить в этот лес особо не хотелось).

(retas) С асмом я не знаком, воспользовался утилиткой для написания задержки. Задержка получилась маленькая, расчитанная на получение угла опережения в пределах 0...40град при
максимальной частоте вращения вала (принял пока 10000об/мин), поэтому на измерение частоты влияние не оказывает (если верить протеусу).
Как я понимаю таймер TMR2 позволит установить длительность фспышки светодиода, чтобы для глаз заметна была работа стробоскопа.
Блок задержки поставленный в "управляемый цикл" как раз и позволил мне задать угол опережения, и с помощью стробоскопа наблюдать соответствует он
действительности или нет и определить его значение.
Может конечно есть более элегантное решение этой задачи?
Хочу попробовать сделать расчет задержки появления импульса для стробоскопа используя данные таймера TMR1 с помощью которого определяется частота вращения.
А длительность импульса вспышки придется устанавливать с помощью ТMR2 (DAlexV).
Если у каго есть какие-то предложения буду рад!


Прикрепления: 4174522.jpg (110.5 Kb)
DAlexV Дата: Вт, 17.07.2012, 12:42  |                                                                                                                Сообщение # 48
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Первым делом еще раз советую увеличить до максима частоту проца. Точнее можно будет определять частоту и как следствие УОЗ. Угол можно вычислять через TMR1.
только единственное но... Задержка в градусах будет с запозданием на 3 оборота. Объясняю почему.
1 оборот:
вычисляем длительность импульса (TMR1)
2 оборот:
Продолжает считать TMR1. Вычисление частоты (значение оборотов).
Для вычисления угла в градусах значение длительность импульса TMR1 делим на 360 градусов(1 градус) или на 720( 0.5 градуса). Далее умножаем на нужное кол-во градусов и заносим в TMR2.
3 оборот:
Продолжает считать TMR1. Вычисление частоты (значение оборотов).
Стартует TMR2 на нужный нам градус(значение вычисленного из 1 оборота). вычисление угла в градусах из значения длительности импульса TMR1 (для 2 оборота)

Далее все повторяется в цикле. Вот такие пироги с котенками biggrin

Удачи wink

P/s. Так же после определенных заморочек можно угнать угол и в минус. Получится устройство коррекции ОУЗ.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Вт, 17.07.2012, 12:44
доцент2 Дата: Вт, 17.07.2012, 21:32  |                                                                                                                Сообщение # 49
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Частоты проца в 8 мегов итак выше крыши, а ошибкой в +/-10 оборотов на максимуме можно принебречь.
Допустим для появления импульса стробоскопа используется TMR2.
1. Для 1000 об/мин одному градусу соответствует длительность 0,0001666сек. Для примера рассмотрим угол в 10 градусов, тогда
необходимая длительность составит 10*0,0001666=0,001666сек.
2. TMR2 настроим предделитель 1:4, постделитель 1:8, в этом случае период составит 0,000016сек.
3. установка для TMR2 примет вид 0,001666/0,000016=104,125 (примерно 104).
4. записываем TMR2=104. Т.е. таймер будет считать от 0 до 104 и переполниться.
Я правильно рассуждаю?

Если до, то возникает следующий вопрос - а для получения длительности самого импульса стробоскопа задействовать еще один таймер, TMR0?
или вводить дополнительные условия "если да кабы..."?

Пока вернул задержку на Asm. Вот, что у меня получилось.
Сегодня или завтра попробую поиграть с таймером TMR2 для установки УОЗ. Посмотрим, что получиться.
Прикрепления: 111111.rar (76.9 Kb)

Сообщение отредактировал доцент2 - Вт, 17.07.2012, 23:16
DAlexV Дата: Вт, 17.07.2012, 22:38  |                                                                                                                Сообщение # 50
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (доцент2)
не совсем понятно, а как это значение записать в таймер TMR2 он же считает до 255?
А переполнения ???? Так же как для пониженных оборотов.
Quote (доцент2)
а для получения длительности самого импульса стробоскопа задействовать еще один таймер, TMR0?
Если ни чем не будет занят, то почему же нет.
Quote (доцент2)
На данном этапе пришлось вернуть задержку на Asm иначе значение угла опережения всегда постоянно
Тут уж хозяин-барин. Главное работает, а дальше уже по усмотрению.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Вт, 17.07.2012, 23:15  |                                                                                                                Сообщение # 51
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Сейчас посчитал величину предустановки TMR2 для интервала от 1 до 50 град при различных оборотах.
Получилось при заданных установках предделителей TMR2 значение предустановки для оборотов ниже 2200 об/мин превышает 255.
Кроме того значение предустановки таймера получается для целых интервалов оборотов (например от 6000...10000об/мин)
одинаковое - TMR2=1 для УОЗ в 1градус (в таймер можно записать только целое число!).
Т.е. в итоге ошибка получается значительной.

Допустим надо записать в таймер 521 (это для 50 градусов при 900об/мин), как это будет выглядеть с переполнением?
521/255=2 переполнения и остаток 11.
Как сделать счет с переполнением таймера мне понятно, а вот наоборот задать нужное кол-во переполнений, а потом загнать туда еще и остаток,
немного не догоняю!? можно по подробнее?
ЯНДЕКС Дата: 17.07.2012
DAlexV Дата: Вт, 17.07.2012, 23:42  |                                                                                                                Сообщение # 52
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (доцент2)
Допустим надо записать в таймер 521 (это для 50 градусов при 900об/мин), как это будет выглядеть с переполнением? 521/255=2 переполнения и остаток 11.
Делаем обратную операцию. До этого прибавляли, теперь убавляем. Переполнений допустим 2. Заводим переменную, в нее заносим кол-во переполнений. При переполнении вычитаем 1 из переменной. Если достигли 0, то в TMR2 заносим $FF - остаток(Советую посчитать его заранее дабы не засорять прерывание). И ничего тут вроде заумного нет.
Quote (доцент2)
Получилось при заданных установках предделителей TMR2 значение предустановки для оборотов ниже 2200 об/мин превышает 255.
Вот поэтому
Quote (DAlexV)
Первым делом еще раз советую увеличить до максима частоту проца
Quote (DAlexV)
Точнее можно будет определять частоту и как следствие УОЗ


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Ср, 18.07.2012, 21:43  |                                                                                                                Сообщение # 53
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

DAlexV спасибо, сегодня попробую/

Добавлено (18.07.2012, 21:43)
---------------------------------------------
Пока частоту оставил 8МГц. Собрал все на макетке. в качестве источника оборотов поставил вентилятор от компа с выводом таходатчика (генератора к сожалению под руками нет).
Причем таходатчик пришлось подключить примо к выводу МК, иначе ни каких измерений не получается (тестером не смог замерить частоту, показывал нули.)
В программе добавил делеление на 2 (т.к. за 1 оборот крыльчатки выходит два импульса).
Вентилятор запитал от 5 вольт, питания МК.
Измеритель меряет, УОЗ регулируется, на сколько это заметно!
Но как обычно самодельный мёд без ложки дёгтя не бывает!
Показания измерителя постоянно прыгают например при 1430 об/мин, измеритель показывает интервал 1200...1495об/мин и периодически показания падают до 330...350 об/мин, а потом до 1200...1495об/мин.
Цифры прыгают с частотой раз 10-20 в секунду.
Пробовал оставить только измеритель оборотов, но результат тотже.
В чем может быть причина?

Сообщение отредактировал доцент2 - Ср, 18.07.2012, 21:48
DAlexV Дата: Ср, 18.07.2012, 23:29  |                                                                                                                Сообщение # 54
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (доцент2)
В чем может быть причина?
доцент2,
будем гадать на кофейной гуще, или может исходник глянем ???? cool


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Чт, 19.07.2012, 08:13  |                                                                                                                Сообщение # 55
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

да исходник все тот же. в протеусе все замечательно, а в железе не очень.
Прикрепления: _8.rar (76.7 Kb)
DAlexV Дата: Чт, 19.07.2012, 09:24  |                                                                                                                Сообщение # 56
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (доцент2)
да исходник все тот же. в протеусе все замечательно, а в железе не очень.
О-о-о !!!!! Знакомые грабли. Помню на них наступал. Ошибка кроется в том что у меня за 1 оборот двигателя было 4 импульса. Да, в протеусе все сказочно, длительность одинаковая, а в реале ....... не всегда. Разная длительность между импульсами от датчика. Здесь не делить на 2 нужно, а считать через один импульс. Добавляй еще 1 переменную(SensN) и в прерывании это будет выглядеть так:

Int_Label:
Context Save
If INTF=1 Then
INTF=0 ' сброс Флага внешнего прерывания по PORTB.0(INT)
Inc(SensN)
if SensN=2 then

CHETTMR1=TIMER1 ' считаем значение счета таймера
TIMER1=0
SensN=0
end if

PERIOD=PERTMR1 ' кол-во импульсов за период прерывания по входу RB0 (INT)
' TMR1L = $00 ' Значение младшего регистра TMR1
' TMR1H = $00 ' Значение старшего регистра
PERTMR1=0 ' сбросить кол-во переполнений таймера
EndIf

If TMR1IF=1 Then
TMR1IF=0 ' сброс Флага прерывания по переполнению TMR1
Inc PERTMR1 ' приращение кол-ва прерываний по переполнению TMR1
EndIf
Context Restore ' Возврат из обработчика прерывания

И естественно не забудь убрать деление на 2. Удачи wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Чт, 19.07.2012, 16:36  |                                                                                                                Сообщение # 57
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Попробовал в железе - помогло! Цифры оборотов бегают в разряде единиц и десятков, но это скорее всего неравномерность
вращения крыльчатки да и таходатчик наверное не без греха + погрешность самого измерителя. Это уже мелочи.
Только пришлось вывести обнуление TIMER1 за цикл:
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Inc SensN
If SensN=2 Then
CHETTMR1=TIMER1
SensN=0
End If
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TIMER1=0
Если прикрепиться файл, то на нем видно положение полоски скотча соответствущее установленному углу
в 45 град против часовой стрелки относительно светлой линейки (к сожалению нет транспортира для наглядности).
Надо ввести выбор кол-ва импульсов приходящих за один оборот вала.
Скоро встанет одна из самых трудных задач - это довести устройство до корпуса!
(нехватает емкостного датчика и вспышка на светодиоде получается хиленькая, т.к. маленькая длительность).
Спасибо!!! Возникнут вопросы обращусь.
Прикрепления: IMGP5879.rar (787.2 Kb)

Сообщение отредактировал доцент2 - Чт, 19.07.2012, 16:46
DAlexV Дата: Чт, 19.07.2012, 20:56  |                                                                                                                Сообщение # 58
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (доцент2)
Цифры оборотов бегают в разряде единиц и десятков, но это скорее всего неравномерность вращения крыльчатки да и таходатчик наверное не без греха + погрешность самого измерителя
Последний раз предлагаю. Увеличь частоту кварца, Все исчезнет. У меня в проекте 20 мгц Прекрасно мерит от 0 до 7000 без глюков(импульсов на 1 оборот вала 6), причем еще успевает регулировать (16 бит) фазовый сдвиг, обслуживать динамическую индикация, I2C, и т.д. По поводу яркости светика могу предложить уменьшить сопротивление резистора(есть такое понятие как импульсный ток. Он обычно в 2-3 раза больше. Плюсы метода: увеличение яркости свечения, минусы: для постоянного свечения он работать не может, так как быстро сгорит и требуется частенько собирать внешний буфер, так как выходной ток часто превышает допустимый ток через ногу проца. Удачи wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
доцент2 Дата: Чт, 19.07.2012, 21:56  |                                                                                                                Сообщение # 59
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Частоту увеличить попробую попозже. Светик я ставил через транзисторный ключ, но толку от этого не было ( и замыкал ограничивающий резистор).
Думаю может поставить еще один каскад или применить полевик. А можно и лазерную указку попробовать.
DAlexV Дата: Пт, 20.07.2012, 00:07  |                                                                                                                Сообщение # 60
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (доцент2)
Думаю может поставить еще один каскад или применить полевик. А можно и лазерную указку попробовать.
Или мощный светик


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
  • Страница 4 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: