алгоритм
|
|
DAlexV |
Дата: Вс, 15.07.2012, 14:43 | Сообщение # 46 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Добавил еще один таймер для смещения включения светодиода. Принцип такой: при прерывании по В.0 запускается таймер 2 (значение таймера это и есть сдвиг относительно начала импульса) по прерыванию (переполнение таймера 2) если светодиод не был включен, то включаем его и даем таймеру новое значение(время горения светодиода) по повторному переполнению таймер 2 (светик уже был включен) выключаем светик, и стопорим таймер (до следующего прерывания по В.0)
Исправления приложил, удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Вс, 15.07.2012, 14:46
|
|
|
|
доцент2 |
Дата: Пн, 16.07.2012, 21:20 | Сообщение # 47 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
посмотрел Ваши варианты, спасибо! Интуиция подсказывала о вводе в програаму еще одного таймера (просто я только с ними разбираюсь и заходить в этот лес особо не хотелось).
(retas) С асмом я не знаком, воспользовался утилиткой для написания задержки. Задержка получилась маленькая, расчитанная на получение угла опережения в пределах 0...40град при максимальной частоте вращения вала (принял пока 10000об/мин), поэтому на измерение частоты влияние не оказывает (если верить протеусу). Как я понимаю таймер TMR2 позволит установить длительность фспышки светодиода, чтобы для глаз заметна была работа стробоскопа. Блок задержки поставленный в "управляемый цикл" как раз и позволил мне задать угол опережения, и с помощью стробоскопа наблюдать соответствует он действительности или нет и определить его значение. Может конечно есть более элегантное решение этой задачи? Хочу попробовать сделать расчет задержки появления импульса для стробоскопа используя данные таймера TMR1 с помощью которого определяется частота вращения. А длительность импульса вспышки придется устанавливать с помощью ТMR2 (DAlexV). Если у каго есть какие-то предложения буду рад!
|
|
|
|
DAlexV |
Дата: Вт, 17.07.2012, 12:42 | Сообщение # 48 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Первым делом еще раз советую увеличить до максима частоту проца. Точнее можно будет определять частоту и как следствие УОЗ. Угол можно вычислять через TMR1. только единственное но... Задержка в градусах будет с запозданием на 3 оборота. Объясняю почему. 1 оборот: вычисляем длительность импульса (TMR1) 2 оборот: Продолжает считать TMR1. Вычисление частоты (значение оборотов). Для вычисления угла в градусах значение длительность импульса TMR1 делим на 360 градусов(1 градус) или на 720( 0.5 градуса). Далее умножаем на нужное кол-во градусов и заносим в TMR2. 3 оборот: Продолжает считать TMR1. Вычисление частоты (значение оборотов). Стартует TMR2 на нужный нам градус(значение вычисленного из 1 оборота). вычисление угла в градусах из значения длительности импульса TMR1 (для 2 оборота)
Далее все повторяется в цикле. Вот такие пироги с котенками
Удачи
P/s. Так же после определенных заморочек можно угнать угол и в минус. Получится устройство коррекции ОУЗ.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Вт, 17.07.2012, 12:44
|
|
|
|
доцент2 |
Дата: Вт, 17.07.2012, 21:32 | Сообщение # 49 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 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 для установки УОЗ. Посмотрим, что получиться.
Сообщение отредактировал
доцент2 - Вт, 17.07.2012, 23:16
|
|
|
|
DAlexV |
Дата: Вт, 17.07.2012, 22:38 | Сообщение # 50 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Сейчас посчитал величину предустановки TMR2 для интервала от 1 до 50 град при различных оборотах. Получилось при заданных установках предделителей TMR2 значение предустановки для оборотов ниже 2200 об/мин превышает 255. Кроме того значение предустановки таймера получается для целых интервалов оборотов (например от 6000...10000об/мин) одинаковое - TMR2=1 для УОЗ в 1градус (в таймер можно записать только целое число!). Т.е. в итоге ошибка получается значительной.
Допустим надо записать в таймер 521 (это для 50 градусов при 900об/мин), как это будет выглядеть с переполнением? 521/255=2 переполнения и остаток 11. Как сделать счет с переполнением таймера мне понятно, а вот наоборот задать нужное кол-во переполнений, а потом загнать туда еще и остаток, немного не догоняю!? можно по подробнее?
|
|
|
|
DAlexV |
Дата: Вт, 17.07.2012, 23:42 | Сообщение # 52 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) В чем может быть причина? доцент2, будем гадать на кофейной гуще, или может исходник глянем ????
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Чт, 19.07.2012, 08:13 | Сообщение # 55 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
да исходник все тот же. в протеусе все замечательно, а в железе не очень.
Прикрепления:
_8.rar
(76.7 Kb)
|
|
|
|
DAlexV |
Дата: Чт, 19.07.2012, 09:24 | Сообщение # 56 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 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. Удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Чт, 19.07.2012, 16:36 | Сообщение # 57 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Попробовал в железе - помогло! Цифры оборотов бегают в разряде единиц и десятков, но это скорее всего неравномерность вращения крыльчатки да и таходатчик наверное не без греха + погрешность самого измерителя. Это уже мелочи. Только пришлось вывести обнуление TIMER1 за цикл: '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Inc SensN If SensN=2 Then CHETTMR1=TIMER1 SensN=0 End If '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TIMER1=0 Если прикрепиться файл, то на нем видно положение полоски скотча соответствущее установленному углу в 45 град против часовой стрелки относительно светлой линейки (к сожалению нет транспортира для наглядности). Надо ввести выбор кол-ва импульсов приходящих за один оборот вала. Скоро встанет одна из самых трудных задач - это довести устройство до корпуса! (нехватает емкостного датчика и вспышка на светодиоде получается хиленькая, т.к. маленькая длительность). Спасибо!!! Возникнут вопросы обращусь.
Сообщение отредактировал
доцент2 - Чт, 19.07.2012, 16:46
|
|
|
|
DAlexV |
Дата: Чт, 19.07.2012, 20:56 | Сообщение # 58 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) Цифры оборотов бегают в разряде единиц и десятков, но это скорее всего неравномерность вращения крыльчатки да и таходатчик наверное не без греха + погрешность самого измерителя Последний раз предлагаю. Увеличь частоту кварца, Все исчезнет. У меня в проекте 20 мгц Прекрасно мерит от 0 до 7000 без глюков(импульсов на 1 оборот вала 6), причем еще успевает регулировать (16 бит) фазовый сдвиг, обслуживать динамическую индикация, I2C, и т.д. По поводу яркости светика могу предложить уменьшить сопротивление резистора(есть такое понятие как импульсный ток. Он обычно в 2-3 раза больше. Плюсы метода: увеличение яркости свечения, минусы: для постоянного свечения он работать не может, так как быстро сгорит и требуется частенько собирать внешний буфер, так как выходной ток часто превышает допустимый ток через ногу проца. Удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
доцент2 |
Дата: Чт, 19.07.2012, 21:56 | Сообщение # 59 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Частоту увеличить попробую попозже. Светик я ставил через транзисторный ключ, но толку от этого не было ( и замыкал ограничивающий резистор). Думаю может поставить еще один каскад или применить полевик. А можно и лазерную указку попробовать.
|
|
|
|
DAlexV |
Дата: Пт, 20.07.2012, 00:07 | Сообщение # 60 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (доцент2) Думаю может поставить еще один каскад или применить полевик. А можно и лазерную указку попробовать. Или мощный светик
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|