Перейти к содержанию

Реверс двигателя (ATMega16) - AVR


Max1201

Рекомендуемые сообщения

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

;* На выходе OC1A МК АТmega16 получаем выходные импульсы
;* с частотой 50 Гц и коэффициентом заполнения g=0,025.
;* Тактовая частота MK AVR: 4 МГц
.nolist
.include"m16def.inc"
.list
 
.def STAT = r15                 ;Регистр для хранения состояния главной программы
.def WorkH = r16                ;Рабочий регистр для главной программы
.def WorkI = r17                ;Рабочий регистр для прерывания от таймера
.def AddLo = r18                ;Вспомогательный регистр для прибавления константы
.equ Impuls = 9000              ;Число тактовых сигналов, соответствующее импултсу
.equ Pause = 1000               ;Число тактовых сигналов, соответствующее паузе
 
Reset:
rjmp Initial                    ;Переход к части инициализации
reti                            ;Внешнее прерывание 0 (не используется)
reti                            ;Внешнее прерывание 1 (не используется)
reti                            ;Прерывание по захвату (не используется)
Timer1CompA:                    ;Прерывание CompareA для ATmega16
in STAT,SREG                    ;Сохраняем флаги главной программы
in WorkI,TCCR1A                 ;Регистр управления А счетчика Т/С1
sbrs WorkI,COM1A0               ;Пропускаем следующую команду, если COM1A0 = 1
rjmp TC1                        ;Пропускаем следующую команду, если COM1A0 = 0
cbr WorkI,1<<COM1A0             ;При следующем прерывании OC1A -> 1
out TCCR1A,WorkI                ;Сохраняем новое значение
in AddLo,OCR1AL                 ;Младший байт OCR1A
subi AddLo,Low(-Impuls)         ;Прибавляем младший байт значения импульса
in WorkI,OCR1AH                 ;Старший байт OCR1A
sbci WorkI,High(-Impuls)        ;Прибавляем старший байт значения импульса
rjmp IntEnde                    
TC1:                            
sbr WorkI,1<<COM1A0             ;При следующем прерывании OC1A -> 1         
out TCCR1A,WorkI                ;Сохраняем новое значение
in AddLo,OCR1AL                 ;Младший байт OCR1A
subi AddLo,Low(-Pause)          ;Прибавляем младший байт значения длительности импульса
in WorkI,OCR1AH                 ;Старший байт OCR1A
sbci WorkI,High(-Impuls)        ;Прибавляем старший байт значения длительности импульса
IntEnde:                        
out OCR1AH,WorkI                ;Назад - старший байт нового значения
out OCR1AL,AddLo                ;Назад - младший байт нового значения
out SREG,STAT                   ;Восстанавливаем старые флаги
reti                            ;Выход из обработки прерывания CompareA
 
Initial:                        ;Инициализация регистра ввода/вывода
ldi WorkH,High(RamEnd)          
out sph,WorkH                   
ldi WorkH,Low(RamEnd)           
out spl,WorkH                   ;Инициализируем стек
clr WorkH                       ;Все разряды = 0
out PortD,WorkH                 ;Вывод в порт D
ldi WorkH,$20                   ;Разряд 5 - в 1, остальные - в 0
out DDRD,WorkH                  ;OC1A (PD5) - выход, остальные входы
ldi WorkH,High(Pause)           ;Старший байт значения паузы
out OCR1AH,WorkH                ;в старший байт регистра сравнения А
ldi WorkH,Low(Pause)            ;Младший байт значения паузы
out OCR1AL,WorkH                ;в младший байт регистра сравнения А
ldi WorkH,$C0                   ;OC1A -> 1
out TCCR1A,WorkH                ;Сохраняем новое значение
ldi WorkH,$02                   ;Входной такт Т/С1 = такт сист. синхр./8
out TCCR1B,WorkH                ;Запускаем Т/С1
ldi WorkH,$40                   
out TIMSK,WorkH                 ;Разрешаем прерывание CompareA
sei                             ;Общее разряшение прерываний (разряд I)
Haupt:                          
rjmp Haupt                      ;Главная часть программы: ожидаем возникновения прерывания

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

d50I1pc3RQg.jpg

e-5ynSa8oWw.jpg

EsW2drcSpUE.jpg

UqMa3Upkoz4.jpg

В методичке это 4 лаба, там программа не та но теория та что и вновой методичке

lab_rab_MK_AVR.pdf

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

7 минут назад, Max1201 сказал:

я вообще не понимаю этот ассемблер

Возьмите другой, который понимаете.

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

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

12 минуты назад, Max1201 сказал:

 

Код с помощью которого двигатель вращается в одном направлений по часовой стрелке.

 

Двигатель вращается без помощи кода, по крайней мере тот, что на стенде на фото. Твой код, видимо, для шагового двигателя. У тебя коллекторный двигатель через H-мост, управление двумя выводами, на них 1-0 или 0-1 в зависимости от нужного направления. Писать надо с нуля, и полное задание тоже надо знать!

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

6 часов назад, Max1201 сказал:

Помогите, а то я вообще не понимаю этот ассемблер

Для чего же вы тогда учитесь? Чтобы потом штаны в офисе протирать? Смените профессию, пока не поздно.

Ссылка на комментарий
Поделиться на другие сайты

Код ужасен. Фотматирование отсутствует, осмысленные комментарии тоже.

Цитата

Reset:

rjmp Initial ;Переход к части инициализации

reti ;Внешнее прерывание 0 (не используется)

reti ;Внешнее прерывание 1 (не используется)

reti ;Прерывание по захвату (не используется)

Timer1CompA: ;Прерывание CompareA для ATmega16

in STAT,SREG

Зачем здесь метка RESET? Да еще практически синоним метки Initial. По адресу Timer1CompA идет не переход на обработчик, а сразу его код. А вдруг понадобится добавить прерываний? А где записанные явным образом адреса векторов (.org OC1Aaddr + rjmp Tim1_CompA_vect).

Главный вопрос - зачем тут вообще используется таймер?

8 часов назад, Max1201 сказал:

ldi WorkH,$40

out TIMSK,WorkH

За такое надо по рукам бить. Тем более что в других местах вместо магических чисел используются нормальные сдвиги.

8 часов назад, Max1201 сказал:

subi AddLo,Low(-Pause) ;Прибавляем младший байт значения длительности импульса

А почему в коде - Pause?

.

Проще переписать с нуля под конкретное ТЗ чем переделывать ЭТО.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

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

jnA65ZDHUPA.jpg

uZTjZnniMSw.jpg

Ссылка на комментарий
Поделиться на другие сайты

@Max1201 для таких заявок у нас есть раздел "Вакансии и разовая работа".

http://forum.cxem.net/index.php?/forum/15-вакансии-и-разовая-работа/

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, Max1201 сказал:

я вообще не понимаю этот ассемблер((

Хм... А почему бы это не сказать преподу и не написать прогу на том, что понимаете ? Думаю, он пойдёт на встречу.
 

Ссылка на комментарий
Поделиться на другие сайты

Он наверное ни на чем не понимает в программировании .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

.include "m16def.inc"
.equ ROTATE_DIRECTION = 1

sbi DDRD,4
sbi DDRD,5

.if ROTATE_DIRECTION
  sbi PORTD,4
  cbi PORTD,5
.else
  cbi PORTD,4
  sbi PORTD,5
.endif

CYCLE:
  rjmp CYCLE

Вот как ЭТО можно исправить: стереть к двоичным демонам и написать по-нормальному.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Тема работы 

Цитата

функционирование таймерного модуля в МК

 

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Выход на схеме на мост с OCB1A ,  OCB1B ,  чтоб не только направление,  но и скорость задавать .

Тут надо студенту книжку покупать по АВР и читать . Судя по повороту  схемы не только по АВР .

 

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
  • Похожий контент

×
×
  • Создать...