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

Pic18f45k20 - сборка схемы в Protheus, шаговый двигатель - Микроконтроллер

29.04.2017, 14:12. Просмотров 192. Ответов 3
Метки нет (Все метки)

Не могу нормально разобраться со сборкой схемы в Protheus
Есть сомнения как в правильности программы, хотя она нормально компилируется в MatlabX v3.60
Реализуется шаговый двигатель, управление скоростью на PIC18F45K20.
C
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
//Входы:
//       RA3:RA0 - дискретное задание скорости вращения:
//              0000 - 3.75 об/мин;
//              0001 - 7.50 об/мин;
//                  ...
//              1111 - 60 об/мин;
//       RA5 - пуск/стоп:
//              0 - стоп;
//              1 - пуск.
//Выходы:
//       RD4 - сигнал на включение обмотки A;
//       RD5 - сигнал на включение обмотки !A;
//       RD6 - сигнал на включение обмотки B;
//       RD7 - сигнал на включение обмотки !B.
 
#include <p18f45k20.h>
 
//Новые имена ножек контроллера.
#define _A PORTDbits.RD4
#define _nA PORTDbits.RD5
#define _B PORTDbits.RD6
#define _nB PORTDbits.RD7
 
void main (void);
void InterruptHandlerHigh (void);
 
unsigned char cnt=0,freq_i=0,freq_pr=16,in;
 
void main (void)
{
  INTCONbits.TMR0IE = 1;    //Разрешение прерывания по переполнению TIMER0.
  TMR0H = 0xB1;         //Сброс таймера 
  TMR0L = 0xDF;         //в начальное значение.
  T0CON = 0x88;         //Запуск таймера с отключенным предделителем. 
  INTCONbits.GIEH = 1;      //Глобальное разрешение прерываний
 
  ANSEL = 0;                //Отключение аналоговых входов
  ANSELH = 0;           //микроконтроллера.
  
  TRISA = 0x2F;         //Настройки направления данных
  TRISC = 0;                //в задействованных портах
  TRISD = 0;                //ввода/вывода.
 
  PORTD = 0;            //Начальные значения
  PORTC = 0;            //портов микроконтроллера.
 
  while (1);                //Основной бесконечный цикл.
}
 
//Вектор прерываний.
#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh 
  _endasm
}
 
//Обработчик прерываний.
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
    if (INTCONbits.TMR0IF)
    { 
        TMR0H = 0xB1;       //Сброс счётного регистра TMR0
        TMR0L = 0xDF;       //в начальное значение.
        INTCONbits.TMR0IF = 0;  //Сброс флага прерывания.
        if (PORTAbits.RA5 == 1) //Если есть сигнал «Пуск»
        {
            in=PORTA&0x0F;      //Считываем значение с тумблеров.
            freq_pr=0x10-in;        //Перерассчитываем задание частоты.
            switch(cnt)         //Выводим текущее состояние обмоток
            {               //шагового двигателя.
                case 0:
                    _A = 1;
                    _nA = 0;
                    _B = 0;
                    _nB = 0;
                    break;
                case 1:
                    _A = 0;
                    _nA = 1;
                    _B = 0;
                    _nB = 0;
                    break;
                case 2:
                    _A = 0;
                    _nA = 0;
                    _B = 1;
                    _nB = 0;
                    break;
                case 3:
                    _A = 0;
                    _nA = 0;
                    _B = 0;
                    _nB = 1;
                    break;
            }
        
            if ((++freq_i)>=freq_pr)    //Если счётчик переполнений таймера
            {               //больше либо равен уставке на частоту,
                cnt=(++cnt)&0x03;   //то инкрементируем номер выводимого
                freq_i=0;       //шага и обнуляем счётчик переполнений
            }
        }
        else            //Если сигнала «Пуск» нет, снимаем сигналы
        {           //на включение всех обмоток шагового двигателя.
            _A = 0;
            _nA = 0;
            _B = 0;
            _nB = 0;
 
        }  
 
    }
  INTCONbits.GIEH = 1;      //Глобальное разрешение прерываний.
}
В архиве файлы проекта, файл си, hex файл, файл протеуса + скриншот
0
Миниатюры
Pic18f45k20 - сборка схемы в Protheus, шаговый двигатель  
Вложения
Тип файла: zip Step.zip (31.5 Кб, 0 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2017, 14:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Pic18f45k20 - сборка схемы в Protheus, шаговый двигатель (Микроконтроллер):

PIC18F45K20 + прерывания
Доброго времени суток. Разбираюсь с демо платкой на основе PIC18F45K20 . Шла в...

шаговый двигатель в СAD
В какой среде можно смоделировать шаговый двигатель?Задача простая - отследить...

STM32f3discovery + SMD-1.8 + шаговый двигатель, начало работы
Приветствую, уважаемые форумчане. Начну из далека. С программированием...

Шаговый двигатель
Здравствуйте у меня вопрос по шаговому двигателю, а точнее по программе...

шаговый двигатель
Привет. Как можно поднять обороты шагового двигателя? Напряжения питания 12В,...

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

3
pyzhman
755 / 451 / 62
Регистрация: 15.05.2012
Сообщений: 2,541
29.04.2017, 19:15 #2
Сперву-началу - пишет же: MCLR is low. Подтяните его к питанию.
0
Maxim_R
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 2
30.04.2017, 12:36  [ТС] #3
Да, спасибо, этот момент заметил
Теперь не могу понять, должен ли двигатель двигаться на +-90 градусов, или же его возможно заставить вертеться
0
Миниатюры
Pic18f45k20 - сборка схемы в Protheus, шаговый двигатель  
paskal
450 / 299 / 28
Регистрация: 15.08.2011
Сообщений: 913
30.04.2017, 17:36 #4
Цитата Сообщение от Maxim_R Посмотреть сообщение
должен ли двигатель двигаться на +-90 градусов, или же его возможно заставить вертеться
Может и вертеться.
Попробуйте поменять местами текст в ветках case 1: и case 2:
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2017, 17:36
Привет! Вот еще темы с решениями:

2-фазный шаговый двигатель
42BYG008G. не подскажете, как должны выглядеть диаграмма сигналов на фазы?...

Шаговый двигатель + PBII
Доброго времени суток! Заимел такую штуку - ...

ATMega и шаговый двигатель
есть ли какие-нибудь библиотеки для ATMega, для шаговых двигателей надо...

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


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

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

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