Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Warehouse
1 / 1 / 3
Регистрация: 18.12.2014
Сообщений: 158
#1

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

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

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

http://www.cyberforum.ru/microcontrollers/thread748012.html
Я нашел пример, для похожего эпюра, вроде бы и разобрался. Когда добавил свои данные, движок как крутился с одной скоростью, так и крутится.

Прикладываю код, который у меня есть:
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 (Микроконтроллер):

Управление шаговым двигателем на PIC16F873
Подскажите возможно применить данный алгоритм для управления биполярным шаговым...

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

Управление двигателем на atmega8
Здравствуйте, есть у меня проблема, которую не удалось решить самостоятельно....

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

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

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

Добавлено через 25 секунд
Электрическую принципиальную.
0
Warehouse
1 / 1 / 3
Регистрация: 18.12.2014
Сообщений: 158
04.04.2017, 23:34  [ТС] #3
Вот такая схема
0
Миниатюры
Управление Двигателем через КМ1816ВЕ51  
pyzhman
755 / 451 / 62
Регистрация: 15.05.2012
Сообщений: 2,541
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 / 3
Регистрация: 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 / 3
Регистрация: 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-устройство-лампочку,которая будет...

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

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

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


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

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

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