Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры

Войти
Регистрация
Восстановить пароль
 
Warehouse
1 / 1 / 1
Регистрация: 18.12.2014
Сообщений: 158
#1

Управление Двигателем через КМ1816ВЕ51 - Микроконтроллер

04.04.2017, 01:08. Просмотров 159. Ответов 5
Метки нет (Все метки)

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

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

Прикладываю код, который у меня есть:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
org 0h
jmp start
org 000Bh
jmp interrupt_counter ;TL0-счётчик
 
org 001Bh
jmp interrupt_timer ;TH0-таймер
 
org 8100h
 
des_oborotov equ R3 ;десятки оборотов в секунду
edinici_oborotv equ R4;единицы оборотов в секунду
count_impuls equ R5 ;хранит кол-во оборотов при счете 
mk_sek equ R6 ;счетчик микросекунд
ml_sek equ R7 ;счетчик милисекунд
decisec equ R1 ;счетчик сотен миллисекунд(decisec=10->1sec)
trev equ R2; время реверса
 
 
start:
 mov trev,#100
 mov decisec, #0
 mov DPTR, #3  ;с помощью регистра управления настраиваем
 mov A, #82h   ;порт A-вывод B-ввод C-вывод
 movx @DPTR, A
 
 mov count_impuls, #0 ;обнуляем все переменные
 mov mk_sek, #0 ;необходимые для подстчета
 mov ml_sek, #0 ;оборотов зв секунду
 mov des_oborotov, #0
 mov edinici_oborotv, #0
 
 
 ;Настройки cчётчика таймера T0, T1
 mov A,TMOD
 orl A,#00000111b ;выбираем 3 режим счетчик 0
 mov TMOD,A    
 mov IE, #10011010b ;разрешаем прерывания от Т0, Т1
 mov TL0, #130 ;один оборот 125 импульсов (130+125=255)
 mov TH0, #155 ;для выдержки 100 микросекунд (155+100=255) 
 
 ;запускаем двигатель
 clr P1.4
 clr P1.6
 setB P1.5
 setB P1.7
 
 setb TCON.4 ;запускаем счетчик Т0
 setb TCON.6 ;запускаем таймер Т1
 
 cycle:
  mov DPTR, #2 
  ;выводим десятки оборотов
  mov A, #01000000b
  add A, des_oborotov
  movx @DPTR, A
  nop
  nop
  nop
  ;выводим единици оборотов
  mov A,#10000000b
  add A,edinici_oborotv
  movx @DPTR, A
  nop
  nop
  nop
 jmp cycle
 
jmp $
 
jmp_end_timer:
 jmp end_timer
 
; обработчик прерывания при переполнении счетчика
interrupt_counter:
 mov TL0, #130 ;один оборот 125 импульсов (130+125=255)
 inc count_impuls ;увеличивае количество оборотов в секунду
reti
 
;обработчик прерывания при переполнени таймера
interrupt_timer:
 mov TH0, #155 ;для выдержки 100 микросекунд (155+100=255)
 
 inc mk_sek
 cjne mk_sek,#10,jmp_end_timer ;если меньше 1000 микросекунд выходим из обработчика и продолжаем ждать
 mov mk_sek, #0 ;иначе обнуляем микросекунды
 
 inc ml_sek ;увеличиваем кол-во милисекунд
 mov A, ml_sek
 cjne A,02,gamma 
 ;обратный ход
 setb P1.4
 setb P1.6
 clr P1.5
 clr P1.7
 gamma:
 
 cjne ml_sek,#100,jmp_end_timer ;если меньше 100 миллисекунд выходим из обработчика и продолжаем ждать
 mov ml_sek, #0 ;иначе обнуляем миллисекунды
 
 ;возвращаем прямой ход
 clr P1.4
 clr P1.6
 setB P1.5
 setB P1.7
;Зона управления вращением(процент скорости вращения)
inc decisec
 
cjne decisec,#50, m01 ;+10 процентов
mov trev, #75
jmp show
m01:
cjne decisec,#100, m02 ;+20 процентов
mov trev, #1
jmp show
m02:
cjne decisec,#110, m03 ;+30 процентов
mov trev, #5
jmp show
m03:
cjne decisec,#120, m04 ;+40 процентов
mov trev, #10
jmp show
m04:
cjne decisec,#130, m05 ;+50 процентов
mov trev, #15
jmp show
m05:
cjne decisec,#140, m06 ;+60 процентов
mov trev, #20
jmp show
m06:
cjne decisec,#150, m07 ;+70 процентов
mov trev, #25
jmp show
m07:
cjne decisec,#160, m08 ;+80 процентов
mov trev, #30
jmp show
m08:
cjne decisec,#170, m09 ;+90 процентов
mov trev, #35
jmp show
m09:
cjne decisec,#180, m10 ;+100 процентов
mov trev, #40
jmp show
m10:
cjne decisec,#190, m11 ;+90 процентов
mov trev, #45
jmp show
m11:
cjne decisec,#200, m12 ;+80 процентов
mov trev, #100
mov decisec, #0
m12:
 
show:
 ;теперь считаем обороты в секунду для вывода
 mov A, count_impuls
 mov B, #10
 div AB
 mov des_oborotov, A
 mov edinici_oborotv, B
 mov count_impuls,#0
 
 end_timer:
reti
 
end
0
Миниатюры
Управление Двигателем через КМ1816ВЕ51   Управление Двигателем через КМ1816ВЕ51  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2017, 01:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Управление Двигателем через КМ1816ВЕ51 (Микроконтроллер):

PIC16F73 (MPLAB). Управление двигателем - Микроконтроллер
Нужно написать программу для pic16f73 на MPLAB IDE .asm Задача звучит, как: "Есть вентельный двигатель. Фазы двигателя соеденены...

Управление шаговым двигателем на PIC16F873 - Микроконтроллер
Подскажите возможно применить данный алгоритм для управления биполярным шаговым двигателем. unsigned short i=0; unsigned int...

Proteus. Симуляция и управление двигателем на МК Atmega - Микроконтроллер
Добрый день !!! Нужно собрать схему в PROTEUS для управления трехфазным двигателем (переменного тока) и собственно все , Если у кого...

Управление двигателем на atmega8 - Atmega AVR микроконтроллер
Здравствуйте, есть у меня проблема, которую не удалось решить самостоятельно. Итак, имеем схему, изображенную на рисунке. Это часть схемы,...

Управление шаговым двигателем на Attiny2313 - Atmega AVR микроконтроллер
нужен программный код на C и С++ Короче имеются две кнопки(влево и вправо).При нажатии на них соответственно двигатель поворачивается...

ЧЯДНТ?! Управление шаговым двигателем с таймера - Atmega AVR микроконтроллер
Собственно, код http://pastebin.som/kWQNwEp9 Вроде бы, все просто - таймер тикает, дрыгатель идет. И почти все работает, за...

5
pyzhman
739 / 435 / 61
Регистрация: 15.05.2012
Сообщений: 2,395
04.04.2017, 09:16 #2
Схему бы.

Добавлено через 25 секунд
Электрическую принципиальную.
0
Warehouse
1 / 1 / 1
Регистрация: 18.12.2014
Сообщений: 158
04.04.2017, 23:34  [ТС] #3
Вот такая схема
0
Миниатюры
Управление Двигателем через КМ1816ВЕ51  
pyzhman
739 / 435 / 61
Регистрация: 15.05.2012
Сообщений: 2,395
05.04.2017, 11:16 #4
Assembler
1
2
3
4
5
;запускаем двигатель
 clr P1.4
 clr P1.6
 setB P1.5
 setB P1.7
Откроется ветвь 1-2 и устроит КЗ. То же самое по остальным.
Вам нужна ШИМ, распределенная во времени.
0
Warehouse
1 / 1 / 1
Регистрация: 18.12.2014
Сообщений: 158
08.04.2017, 23:57  [ТС] #5
Двигатель работал, не было КЗ.

Вот пример для другого эпюра:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
ORG 0000h
    JMP start
 
ORG 0Bh
    LJMP increment  ;метка на прерывание от таймера
 
ORG 8100h   
start:
    setb EA
    setb ET0
    orl TMOD,#00000001b
    mov TH0,#252
    mov TL0,#24
    jmp infinity    
infinity:
    mov R1,#0
    jmp cycle_f05
    ;Вперед 1800 об/мин
    cycle_f05:
            mov R0,#0
            mov p1,#10100000b
            setb TR0
        part1:
            cjne R0, #50, part1
            mov R0,#0
            mov p1,#00110000b
            setb TR0
        part2:
            cjne R0, #50, part2
            inc R1
        cjne R1, #100, cycle_f05
        mov R1,#0
        jmp cycle_b05
        
    ;назад 1800 об/мин  
    cycle_b05:
            mov R0,#0
            mov p1,#01010000b
            setb TR0
        part3:
            cjne R0, #50, part3
            mov R0,#0
            mov p1,#00110000b
            setb TR0
        part4:
            cjne R0, #50, part4
            inc R1
        cjne R1, #100, cycle_b05
        mov R1,#0
        jmp cycle_f1
        
    ;Вперед 3600 об/мин 
    cycle_f1:
            mov R0,#0
            mov p1,#10100000b
            setb TR0
        part5:
            cjne R0, #100, part5
            inc R1
        cjne R1, #100, cycle_f1
        mov R1,#0
        jmp cycle_b1
        
    ;назад 3600 об/мин
    cycle_b1:   
            mov R0,#0
            mov p1,#01010000b
            setb TR0
        part6:
            cjne R0, #100, part6
            inc R1
        cjne R1, #100, cycle_b1
    ljmp infinity
 
increment:   ;прерывание от таймера 
    clr TR0
    inc R0
    mov TH0,#252
    mov TL0,#24
    setb TR0
    RETI    
END
0
Миниатюры
Управление Двигателем через КМ1816ВЕ51  
Warehouse
1 / 1 / 1
Регистрация: 18.12.2014
Сообщений: 158
09.04.2017, 06:43  [ТС] #6
Я написал, на основании предыдущей проги. Работает по принципу: 100мс = 3600 оборотов, чобы получить линейно растущую скорость, нужно в каждый момент времени добавлять десятую часть. То есть за 1 секунду будет 360 оборотов.

Теперь буду ждать понедельника, чтобы загрузить ее на стенд и проверить:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
ORG 0Bh
    LJMP increment  ;метка на прерывание от таймера
 
ORG 8100h   
start:
    setb EA
    setb ET0
    orl TMOD,#00000001b
    mov TH0,#252
    mov TL0,#24
    mov A, #0
    jmp infinity    
infinity:
    mov A, #0
    mov R1,#0
    jmp cycle_f1
    
    ;Прямой ход нарастания 3600 об/мин  
    cycle_f1:
            mov R0,#0
            mov p1,#10100000b
            setb TR0
        part5:
            cjne R0, A, part5
            add A, #10
            inc R1
        cjne R1, #100, cycle_f1
        mov R1,#0
        mov A, #0
        jmp cycle_b1
        
    ;Реверс нарастания 3600 об/мин
    cycle_b1:   
            mov R0,#0
            mov p1,#01010000b
            setb TR0
        part6:
            cjne R0, A, part6
            add A, #10
        cjne R1, #100, cycle_b1
        mov R1,#0
        mov A, #0
        jmp cycle_f05
        
        ;Нарастание оборотов от 0 до 1800 об/мин
    cycle_f05:
            mov A, #0
            mov R0,#0
            mov p1,#10100000b
            setb TR0
        part1:
            cjne R0, A, part1
            add A, #5
            mov R0,#0
            mov p1,#00110000b
            setb TR0
        part2:
            cjne R0, A, part2
            inc R1
        cjne R1, #50, cycle_f05
        
        ;Сбавление оборотов от 1800 до 0
        part1_1:
            cjne R0, A, part1
            subb A, #5
            mov R0,#0
            mov p1,#00110000b
            setb TR0
        part2_2:
            cjne R0, A, part2
            dec R1
        cjne R1, #0, cycle_f05
    ljmp infinity
 
increment:   ;прерывание от таймера 
    clr TR0
    inc R0
    mov TH0,#252
    mov TL0,#24
    setb TR0
    RETI    
END
0
09.04.2017, 06:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2017, 06:43
Привет! Вот еще темы с ответами:

Управление через USB - Микроконтроллер
Всем привет!Я хочу собрать своё usb-устройство-лампочку,которая будет включаться и выключаться по команде...

Управление соленоидами через микроконтроллер - Микроконтроллер
Добрый вечер, уважаемые обитатели форума. Для моего исследовательского проекта необходимо выбрать блок управления соленоидами...

Управление яркостью через триммер и АЦП - Микроконтроллер
Суть задания-используя переменный резистор стенда(подключенный к ацп) управлять яркостью светодиода(шим) это все происходит на...

Управление программой через командную строку - Atmega AVR микроконтроллер
Доброго времени суток. Вопрос больше по программированию чем по контроллерам, извините если написал не туда. Скажите пожалуйста, есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru