Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Бытовая и промышленная техника, авто, мото и т.п. » Прошу помощи в допиливании программы цифрового стрелочного спидометра.


Прошу помощи в допиливании программы цифрового стрелочного спидометра.

Сообщений 1 страница 30 из 61

1

Добрый день! Прошу помощи в допиливании программы цифрового стрелочного спидометра. Вкратце: программа считает частоту от датчика скорости и согласно поступающей частоте производит поворот стрелки(шаговый двигатель) на нужный угол, также параллельно считается общий пробег и суточный пробег. Организовано меню по корректировке скорости и пробега в зависимости от длины окружности колеса и прочее. Контроллер мега32 частота 16мгц
Все в принципе работает, но имеются какие то сбои в работе. С генератора импульсов подаю частоту допустим 60гц, стрелка поворачивается, но подергивается на месте, шаг туда\обратно. Вывел на табло пробега временно частоту, которую измеряет процессор и видно, что частота нестабильна: стоит допустим 60гц, потом подергивается на несколько герц вверх или вниз, очень быстро,потом успокоится, потом опять и так хаотично. Я уже задал в программе усреднение данных частоты-10замеров усредняем и выводим. Но это ощутимо не помогло. Это наблюдается как в готовом устройстве так и в проекте в протеусе.
Я новичок в программировании, может что не так написал или неправильно расположил код. Явных ошибок компилятор не выдает. Помогите пожалуйста, может как то надо подправить программу. Спасибо заранее. Архив с проектом и программой прикрепляю.
http://radiokot.ru/forum/download/file.php?id=304967

0

2

В вашем проекте, полностью отсутствуют такие обязательные настройки как:

Код:
$hwstack
$swstack
$framesize

0

3

насколько мне известно если их не прописывать компилятор автоматом их устанавливает. Или нет?

0

4

Вроде и стек и указатели инициализируются.
Вот раздез его кода в протеусе.

0

5

Dnepr_1186 написал(а):

автоматом их устанавливает

Нет, если посмотреть в настройки, то можно увидеть как значения статические (прописаны ручками).
По умолчанию этого может быть недостаточно. Надо самому высчитывать.

0

6

ввел эти параметры. Изменял и в большую и в меньшую сторону.Даже  если вообще нули там поставить. Ничего не меняется. Значит дело в чем то другом.

Отредактировано Dnepr_1186 (2018-03-05 20:42:04)

0

7

Ну совсем"нули" ставить не нужно, ну по 32 или 64 каждый поставь и гуд.  Если совсем 0 по стек с фреймом будут пересекаться и будет зависон.

0

8

нули ставил ради эксперимента. Потом убрал. Просто от изменения этих параметров работа программы не меняется. Может  посмотрите код и как это проявляется в протеусе?
Идут эти помаргивания хаотичные. Может у меня криво код написан?

0

9

Dnepr_1186 написал(а):

Может у меня криво код написан

Ну на первый взгляд у вас там вообще не код, а так "как увидел - так и делаю". В такой "бардак" и вдумываться не хочется. Разместите нормальную/действующую схему, а там кто может быть...

0

10

Да схемку на днях нарисую, пока только на бумаге имеется. Да я новичок в программировании. Читал немного, примеры, видеоуроки. Постарался вроде все откоментировать. Я не знаю как там нужно правильно строить код программы. Смотрел общий принцип в примерах различных. Так и старался похоже располагать.

0

11

Dnepr_1186 написал(а):

пока только на бумаге имеется

Нормально рисовать не обязательно, если на бумаге всё от руки понятно нарисовано, то можно просто фото.

Dnepr_1186 написал(а):

Читал немного, примеры, видеоуроки. Постарался

Похвально. :yep:

0

12

Вот схема первой версии спидометра на мега168. Суть та же самая что и на 32й меге. Все цепи обвязки МК такие же. Просто в 32й планировал позже реализовать полушаговый режим и всунуть вольтметр, а на это в 168й не хватало ног. Я вот думаю, может прерывания мешают друг другу? Когда идет вывод информации на LED происходит прерывание по сигналу на ноге ICP и  уходит в обработчик и из-за этого сбои. Может тут как то можно подправить?
http://s8.uploads.ru/t/9ESrA.gif

0

13

Dnepr_1186 написал(а):

Я вот думаю, может прерывания мешают друг другу?
Когда идет вывод информации на LED происходит прерывание по сигналу на ноге ICP и  уходит в обработчик и из-за этого сбои.

Очень даже вероятно.
Если запущен таймер, то ножки МК этого таймера есть смысл использовать только для получения сигнала этого самого таймера.
Большего от этих ножек до отключения таймера добиться не получится.

Если задействовано прерывание, то эту ножку как порт можно использовать только после отключения прерывания.

0

14

1. Не имея опыта и нормальной схемы можно вообще что-то начать писать, вы скорее всего скачали откуда-то код (в это я скорее поверю), ибо на схеме даже нормально не описана нумерация портов МК, а на глаз...надо обладать недюжинным опытом.
2. Как вы определяете нулевую позицию стрелки при помощи L293 чипа, если это обычный драйвер шагового мотора? Или вы не мотором крутите стрелку, а реальной стрелкой и используете всего лишь 1 канал (вместо двух)?
3. Что такое "ДС", Двигательная Система или что? :)
4. У вас в коде есть обработка компаратора (описание входов), а на схеме я этого не вижу (возможно это и есть ответ на пункт №2 - хз).

Короче, везде полуфабрикат.

Ладно, идём дальше, абстрагируемся от бесконечного неизвестного железа и попробуем понять код...

Замечания:

- "Config Adc = Single" - лучше использовать режим Free, не будет тормозить код выполения, т.к. в режиме одиночного измерения, МК ждет когда АЦП произведёт измерение и отдаст значение, а АЦП у Атмег весьма тормозное, следовательно вся производительность на нём уже отжирается. В режиме Free измерения производятся внутри железа, само. (Вообще для более крутого/точного измерения без помех от работы процессора, надо делать засыпание МК на время измерения, но здесь пока до этого далеко)
- "Config Timer1 = Timer , Prescale = 64" - 64 означает, что в прерывании есть всего лишь 64 такта процессора на выполнение подпрограммы. Если код будет тормозной, то всё, считай МК будет не вылезать из прерывания и забирать всю производительность. (это так, для общего развития)
-

Код:
   Select Case Rr
   Case 0 : Ugol = 0
   Case 1 : Ugol = 0
   Case 2 : Ugol = 0
   Case 3 : Ugol = 0
   Case 4 : Ugol = 0
   Case 5 : Ugol = 0
...

Это вообще какой-то позор, работает очень медленно и обычно так не делается. Надо либо все данные записать в память как таблицу (что бы значение автоматом вычислялось по позиции, всего 213 байт) или вообще можно хранить внешним файлом, который будет подключаться.
Чатать все эти данные можно функцией/оператором LOOKUP. Код бы тогда упростился до одной строки:

Код:
Ugol = Lookup(Rr , Ugol_table)
...
...
Ugol_table:
     Data 0, 0, 0, 0, 0, 0, 3
     Data 4,4,5,6,6...и т.д.

- (дальше) В коде для отсуствия путаницы, основной цикл программы заключен в Do и Loop, а заканчиваться должно End и после него должны идти все подпрограммы (gosub/call) и обработчики прерываний.
- в коде не должно быть больших задержек типа "Waitms 300", если только это реально не задумано, иначе на это время МК умирает (работают только прерывания) и не дай бог в прерывание ставить задержку.

Нуссс, пока всё.

0

15

Огромное спасибо что помогаете) И так по пунктам
1)Как бы это удивительно не было, но написал программу сам, естественно куски работы с 7сегментником и обработка частоты и прочие типовые решения брались из ранее изученных примеров\уроков. Мне бы проще было где нибудь скачать готовый код, но нету такого). Я придумал это устройство именно под себя и свои нужды, поэтому приходилось доходить своим умом как получилось( и в целом вышло что худо бедно работает, первая версия уже стоит на мотоцикле и успешно эксплуатируется, только вот эти глюки раздражают). Порты не пронумерованы т.к. в программе-рисовалке не было готового шаблона под этот мк и пришлось рисовать самому по упрощенной схеме.
2. Да 293я микросхема просто поворачивает стрелку на определенный угол, обратной связи нет. Система тут такая-нулевой шаг устанавливается при первом запуске после прошивки тот, в каком положении находится двигатель в данный момент. Т.е. грубо говоря можешь выставить стрелку в ноль и прошиваешь. Это положение при первоначальном запуске считается нулевым. Далее уже после выключения питания это положение записывается в EEPROM и от него ведется весь отсчет. Если питание пропадает, а стрелка находится в ненулевом положении, то в момент выключения по сигналу с компаратора(спад напряжения питания) в EEPROM записывается текущее положение стрелки. При последующем запуске программа видит что на входе импульсов ноль, а стрелка не на нуле и возвращает ее в ноль или в другое положение, соответсвующее текущей скорости движения.
3. ДС это датчик скорости. Подключается к коробке передач. Во время езды выдает прямоугольные импульсы  частотой в зависимости от скорости движения.
4. Компаратор отвечает за сохранение данных при выключении питания. Через резистивный делитель на 13й ножке мк мониторится напряжение. Если оно становится ниже 1,25в(спад прри выключении питания), то происходит запись нужных параметров в еепром (шаг, пробег, суточный пробег)
По Ацп спасибо буду знать и изменю. По таймеру. Думал что предделитель устанавливается в зависимости от нужной тебе частотного диапазона на выходе, а тут оказывается что не так.
По  большим задержкам понятно. Они у меня используется только во время определения нажата кнопка долго или коротко. В зависимости от этого выполняются разные действия.
По таблице спасибо еще раз! Переделаю. Только уточнить, сама таблица Ugol_table: должна распологаться после метки END или в самой программе?
вот для представления общей картины об устройстве. Первый тест для друга снимал https://vk.com/video?z=video13989054_456239087/pl_cat_updates

Отредактировано Dnepr_1186 (2018-03-06 18:19:08)

0

16

Dnepr_1186 написал(а):

Ацп спасибо буду знать и изменю. По таймеру. Думал что предделитель устанавливается в зависимости от нужной тебе частотного диапазона на выходе, а тут оказывается что не так.

Я немного не точно (неправильно) описал, дополню...
Логика простая, просто рисуем перед глазами картину: пред делитель 64 - да делит частоту МК на 64 и с этой частотой начинает крутить таймер, а прерывание начинает срабатывать в зависимости его переполнения/разрядности (это всё настраивается). Т.е. надо умножить на нужное значение настроек.

Dnepr_1186 написал(а):

Только уточнить, сама таблица Ugol_table: должна распологаться после метки END или в самой программе?

Для удобства её поиска, таблицу можно расположить в самом конце программы.

0

17

Dnepr_1186 написал(а):

Да 293я микросхема просто поворачивает стрелку на определенный угол, обратной связи нет...

Дальше п.2 можно не читать...
Этот способ применим только для демонстрации работы ШД.
Накапливающиеся ошибки рано или поздно приведут к погрешности с любым знаком и не спасут никакие EEPROM'ы.

Вариант выхода из положения: ставим на вал ШД диск с отверстием и оптопарами при старте системы ловим "MAX" и "MIN", а только после этого начинаем считать импульсы и крутить стрелку.
Можно не оптопарой, а другими типами датчиков...
Да хоть контактными даже. ;)
На очень многих машинах при вкл. зажигания стрелки бегают... Не наводило на мысль - "зачем" ?

0

18

думал об этом, пока нету технической возможности это сделать. Пару сотен км пробега никаких отклонений стрелки не выявило. Если все же в будущем может возникнуть погрешностьто думаю в меню допишу пункт корректировки нуля. Т.е. при удержании кнопки стрелка будет двигаатся по кругу, дойдя до нулевой по шкале позиции отпускаем кнопку и в память автоматом пишется, что это ноль и отсчет начинает вестись с этой позиции. Да в машинах применяются совсем другие ШД. В нашем же колхозе нашел случайно несколько этих древних ДШР39, что и определило дальнейшее развитие конструктива под него.. Так что надо допилить программу  под этот двигатель и конструкцию, потому как уже реализовано в железе и что то другое опять сначала городить нет желания.

0

19

RDW написал(а):

Я немного не точно (неправильно) описал, дополню...
Логика простая, просто рисуем перед глазами картину: пред делитель 64 - да делит частоту МК на 64 и с этой частотой начинает крутить таймер, а прерывание начинает срабатывать в зависимости его переполнения/разрядности (это всё настраивается). Т.е. надо умножить на нужное значение настроек.
.

ну это понятно, с учетом тактовой частоты и делителя и высчиталась константа Т=0.0004с т.е. время за которое таймер меняет свое значение на единицу. Ну и с учетом нее частота и считается

0

20

Dnepr_1186 написал(а):

думал об этом

Честно, мотор выкинуть надо и поставить обычный стрелочный индикатор типа вольтметра или любой готовый на напряжение до 5В. Дальше делаем DAC на шиме и всё.

0

21

Dnepr_1186 написал(а):

думал об этом, пока нету технической возможности это сделать. Пару сотен км пробега никаких отклонений стрелки не выявило.

200 км - только проверка работоспособности вообще, а не качества работы.
Вот через 1000 уже можно об этом вспомнить... ;)

Dnepr_1186 написал(а):

Если все же в будущем может возникнуть погрешностьто думаю в меню допишу пункт корректировки нуля. Т.е. при удержании кнопки стрелка будет двигаатся по кругу, дойдя до нулевой по шкале позиции отпускаем кнопку и в память автоматом пишется, что это ноль и отсчет начинает вестись с этой позиции.

Не выход. Где гарантия, что кнопка будет отпущена вовремя ?

Dnepr_1186 написал(а):

Да в машинах применяются совсем другие ШД. В нашем же колхозе нашел случайно несколько этих древних ДШР39, что и определило дальнейшее развитие конструктива под него.. Так что надо допилить программу  под этот двигатель и конструкцию, потому как уже реализовано в железе и что то другое опять сначала городить нет желания.

ШД - он и на Марсе ШД... ;)  Применяемые в авто - далеко не уникальны, разве что могут быть в бескорпусном исполнении, смонтированы сразу на плате.
Разобрав какой-нибудь дисковод старый (думаю в вашем колхозе это есть) можно добыть весьма "съедобный" ШД, который будет в состоянии крутить стрелку спидометра.

0

22

RDW написал(а):

Dnepr_1186 написал(а):думал об этомЧестно, мотор выкинуть надо и поставить обычный стрелочный индикатор типа вольтметра или любой готовый на напряжение до 5В. Дальше делаем DAC на шиме и всё.

Тогда надо искать головку с углом хотя бы 180°... ;)
Обычный некузяво смотреться будет...

0

23

RDW написал(а):

Не выход. Где гарантия, что кнопка будет отпущена вовремя ?

ШД - он и на Марсе ШД...   Применяемые в авто - далеко не уникальны, разве что могут быть в бескорпусном исполнении, смонтированы сразу на плате.
Разобрав какой-нибудь дисковод старый (думаю в вашем колхозе это есть) можно добыть весьма "съедобный" ШД, который будет в состоянии крутить стрелку спидометра.

ну отпустил не вовремя прокрутил еще на круг. Притом задержку между шагами сделать чтобы не пропустить.
Нет тут я думаю не стоит обсуждать тип ШД, этого прекрасно хватает крутить стрелку без всяких редукторов, полу\микрошагов и прочего. Разрядность шага 1.8гр, что с моей шкалой выходит примерно 1-1.5км.ч на шаг(плюс-минус потому что шкала нелинейная). Это меня устраивает абсолютно. Повторюсь-применение другого типа ШД приведет к тому что нужно полностью менять конструкцию. А у меня уже собрано два экземпляра-на два моих мотоцикла. Поэтому в этой теме обсуждается именно программа.
В общем спасибо пока за помощь. Попробую скорректировать программу с учетом советов и если не поможет буду дальше отписываться в этой теме

0

24

Dnepr_1186 написал(а):

Попробую скорректировать программу с учетом советов и если не поможет буду дальше отписываться в этой теме

Как бы и конечный результат хотелось бы увидеть...  ^^

0

25

конечно, обо всем отпишусь, покажу

Отредактировано Dnepr_1186 (2018-03-06 22:23:46)

0

26

Dnepr_1186 написал(а):

Что именно? ПРограмму или устройство в целом?

Да что не жалко... ;)

Просто частенько не видно результатов...
Помогаешь, участвуешь (я не про себя), а чем закончилось у ТС - никто не знает... ;)
Как-то "сказка без конца"... ;)

Кстати, закончу одну из "сказок"...
Читаем тут Блок КУ УАЗ Патриот

0

27

Nord написал(а):

Тогда надо искать головку с углом хотя бы 180

Не по веришь, в машине как раз в бортовухе стоят такие. :)

Отредактировано RDW (2018-03-07 11:39:20)

0

28

RDW написал(а):

Не по веришь, в машине как раз в бортовухе стоят такие.

Поверю, но вот как раз из автомобильных далеко не все и очень нечасто приборы (кроме тахометра и спидометра) имеют угол хода стрелки более 120°...

0

29

В общем скорерктировал с учетом замечаний. Изменений в работе не произошло, но памяти стало занимать в два раза меньше.
Заметил что эти хаотичные помаргивания и сбои происходят именно во время измерения частоты. Когда же частота ноль, т.е не происходит прерывания по захвату, все работает стабильно.
В протеусе просимулировал. При работе программы видно что при измеряемой частоте на входе допустим 50гц и в регистре  захвата вылазит число 8620. И вот в какой то момент это число может изменится, что это даже тяжело уловить и в этот момент соответсвенно идет поддергивание выводимой частоты с изменением ее значения, потом опять все в норме, а далее снова такой глюк.
как тут код отдельным фалом прикрепить? Сюда залить как то можно?

0

30

Выложи код, может будет более читабельнее.

0


Вы здесь » Программирование ATMEL в BASCOM. » Бытовая и промышленная техника, авто, мото и т.п. » Прошу помощи в допиливании программы цифрового стрелочного спидометра.