Автоматизация станка с ЧПУ

Автор работы: Пользователь скрыл имя, 05 Октября 2011 в 18:52, дипломная работа

Описание работы

Современный электропривод представляет собой конструктивное единство электромеханического преобразователя энергии (двигателя), силового преобразователя и устройства управления. Он обеспечивает преобразование электрической энергии в механическую в соответствии с алгоритмом работы технологической установки. Сфера применения электрического привода в промышленности, на транспорте и в быту постоянно расширяется. В настоящее время уже более 60% всей вырабатываемой в мире электрической энергии потребляется электрическими двигателями. Следовательно, эффективность энергосберегающих технологий в значительной мере определяется эффективностью электропривода. Разработка высокопроизводительных, компактных и экономичных систем привода является приоритетным направлением развития современной техники.

Содержание работы

Введение 6
1 Анализ объекта управления 8
1.1 Основные требования к объекту управления 8
1.2 Принцип работы БДПТ 10
1.3 Управление шаговым двигателем 14
1.4 Описание объекта управления 17
1.5 Анализ целей управления 17
2 Обзорный анализ существующих аналогов СУ 18
3 Построение структурной схемы СУ 20
4 Проектирование принципиальной схемы СУ 22
4.1 Выбор управляющего микроконтроллера 22
4.1.1 Основные требования к микроконтроллеру 22
4.1.2 Анализ аппаратных ресурсов микроконтроллера и обоснование их использования 23
4.1.3 Модуль микроконтроллера 24
4.2 Проектирование силовой части схемы 25
4.2.1 Устройство сопряжения и транзисторный ключ 25
4.2.2 Датчики положения ротора 27
4.2.3 Оптический энкодер 29
4.2.4 Разработка принципиальной схемы блока питания 32
4.3 Проектирование интерфейса пользователя 32
4.3.1 Модуль ЖК-дисплея 32
4.3.2 Устройство сброса микроконтроллера 34
5 Синтез алгоритма СУ 35
5.1 Разработка алгоритма микроконтроллера 35
5.2 Процедура инициализации 36
5.3 Основной цикл программы 38
5.4 Обработка прерывания QEI 38
5.5 Отладка программы микроконтроллера в среде MPLAB 39
5.6 Настройка параметров среды программирования 40
5.7 Создание нового проекта 40
5.8 Создание основного файла проекта 41
5.9 Подключение дополнительных файлов проекта 41
6 Технологическая часть 42
6.1 Программирование микроконтроллера 42
6.2 Разработка печатной платы 43
6.2.1 Общие сведения о системе проектирования печатных плат ACCEL P-CAD 2002 44
6.2.2 Технология изготовления печатных плат 44
6.2.3 Разработка печатных плат системы управления и силовой части 46
7 Экономическая часть 51
7.1 Расчет стоимости опытного образца 51
7.1.1 Расчет стоимости основных материалов 51
7.1.2 Расчет стоимости покупных изделий 52
7.2 Расчет стоимости проектирования и изготовления устройства 54
7.2.1 Расчет основной заработной платы 54
7.2.2 Расчет дополнительной заработной платы 54
7.2.3 Отчисления на социальные нужды 54
7.2.4 Общая стоимость проектирования и изготовления устройства 55
7.3 Общехозяйственные расходы. 55
7.4 Расчет полной стоимости устройства 56
7.5 Экономический эффект от создания устройства 56
8 Охрана труда и окружающей среды 57
8.1 Охрана труда 57
8.1.1 Разработка системы управления 57
8.1.2 Изготовление печатных плат системы управления и силовой части 60
8.1.3 Эксплуатация и обслуживание системы управления 63
8.2 Охрана окружающей среды 64
8.2.1 Охрана окружающей среды при работе на ПЭВМ 65
8.2.2 Охрана окружающей среды при работах по пайке и лужению 65
8.2.3 Экономия ресурсов и утилизация прибора 66
Заключение 68
Список литературы 69
Приложение А 70
Приложение Б 71
Приложение В 73
Приложение Г 74
Приложение Д 92

Файлы: 1 файл

ДИПЛОМ.doc

— 2.79 Мб (Скачать файл)

            {

Norm:

                  OVDCON = Table_PWM_lf[Enc_r];  // подключаем соответствующие ШИМ

                  if (Enc_r == 1)

                        NextEnc = Table_PWM_lf[6];  // следующее включение ШИМ при правильной работе

                  else

                        NextEnc = Table_PWM_lf[Enc_r-1];

                  timer3value = TMR3;  // время поворота заготовки на 4 градуса

                  TMR3 = 0;      // обнулили таймер

                  ob = Oborot*timer3value*25;  // время одного оборота

                  ob_min = MIN*1000000/ob;  // число оборотов за 1 минуту

                  IFS0bits.CNIF = 0;     // очистили флаг

            }

            else  // если резец не повернулся за заготовкой

            {

                  if (Razgon == 0)

                        goto Norm;

                  else

Продолжение приложения Г

                  {

                        TMR3 = 0;

                        ob_min = 0;  //выводим на экран сообщение об ошибке

                        IEC0bits.CNIE = 0;   //запретили прерывание

                  }

            }

      }

      else

                  IFS0bits.CNIF = 0;     // очистили флаг 

}

//---------------------------------------------------------------------

int main(void)

{

      LATE = 0x0000;

      LATB = 0x0000;

      LATF = 0x0000;

      LATC = 0x0000;

      TRISB = 0x0038;

      TRISD = 0x0003;

      TRISF = 0x0000;

      TRISC = 0x8000;

      TRISE = 0xFFC0;   // PWMs are outputs

      ADPCFG = 0xFFFF;  //все выводы порта В - цифровые 

      InitMCPWM();

      InitTMR3();

      imp_pr = 0;

      imp_lf = 0;

      CNEN1 = 0x0040;

      CNPU1 = 0x0040;   //прерывание по выводу CN6 (RB4)

      IFS0bits.CNIF = 0;  // clear CNIF

      IEC0bits.CNIE = 1;  // разрешили прерывания по данным энкодера

      Enc = 0x0000;   // обнулили переменную состояния резца

Продолжение приложения Г

      Razgon = 0;    //разгон двигателя

      T3CONbits.TON = 1;  // запустили таймер

N:

      if (imp_pr == 0)

      {

            if (imp_lf == 0)

                  goto N;

            else

            {

            //двигатель вращается  влево

            //опрашиваем датчики  положения о текущем положении  резца

                  if (PORTEbits.RE8 == 1)

                        Enc = Enc | 0x04;

                  if (PORTDbits.RD0 == 1)

                        Enc = Enc | 0x02;

                  if (PORTDbits.RD1 == 1)

                        Enc = Enc | 0x01; 

                  Enc_r = Table_ENC[Enc];    // присвоили переменной значение из таблицы 1

                  OVDCON = Table_PWM_lf[Enc_r];   // включаем соответствующие ШИМ 

                  if (Enc_r == 1)   // последний элемент в таблице

                        NextEnc = Table_PWM_lf[6];   // следующее включение ШИМ при правильной работе

                  else

                        NextEnc = Table_PWM_lf[Enc_r-1]; //следующее состояние ШИМ при правильной работе

            }

      }

      else

      {

Продолжение приложения Г

            //двигатель вращается  вправо

            //опрашиваем датчики  положения о текущем положении  резца

                  if (PORTEbits.RE8 == 1)

                        Enc = Enc | 0x04;

                  if (PORTDbits.RD0 == 1)

                        Enc = Enc | 0x02;

                  if (PORTDbits.RD1 == 1)

                        Enc = Enc | 0x01; 

                  Enc_r = Table_ENC[Enc];    // присвоили переменной значение из таблицы 1

                  OVDCON = Table_PWM_pr[Enc_r];   // включаем соответствующие ШИМ 

                  if (Enc_r == 6)      // последний элемент в таблице

                        NextEnc = Table_PWM_pr[1];   // следующее включение ШИМ при правильной работе

                  else

                        NextEnc = Table_PWM_pr[Enc_r+1]; //следующее состояние ШИМ при правильной работе

      }

      PWMCON1 = 0x0777;

      Flags.RunMotor = 1; 

      //выводим  сообщение о разгоне двигателя

      InitLCD();

      LCD_setDDRAM(0);  //установили адрес, по которому выводится сообщение

      LCD_Razgon();   //вывели на дисплей "разгон"

      DelayNmSec(5000);  //задержка 5сек

      Razgon = 1;    //разгон закончился

// работа ЖКИ  по выводу информации о скорости  вращения заготовки

A:

      t =ob_min;

Продолжение приложения Г

//разбиваем число  на символы для вывода на  дисплей

      a = t % 10; t /= 10;  //делит ob_min на 10 и присваивает а остаток от деления(т.е.младший разряд)

      b = t % 10; t /= 10;

      c = t % 10; t /= 10;

      d = t % 10; t /= 10;

      e = t % 10;     //старший разряд 

      LATFbits.LATF2 = 0;   //A=0 -запись команды

    for( i=0; i<2000 ; i++);

//включили дисплей

      LCD_WriteNibble(0);   //0000

      LCD_WriteNibble(12);  //1100

      DelayNmSec(4);

// очистили индикатор

      LCD_WriteNibble(0);   //0000

      LCD_WriteNibble(1);   //0001

      DelayNmSec(4); 

      LCD_setDDRAM(0);   //установили адрес

      if (ob_min == 0)

      {

            LCD_ERror();   //выводим сообщение об ошибке

      }

      else

//выводим символы  начиная со старшего разряда  по определенному адресу

      {

            if (e != 0)

            {

                  LCD_PutCHar(e);

            }

//  LCD_setDDRAM(1);

            LCD_PutCHar(d);

Продолжение приложения Г

//   LCD_setDDRAM(2);

            LCD_PutCHar(c);

//  LCD_setDDRAM(3);

            LCD_PutCHar(b);

//  LCD_setDDRAM(4);

            LCD_PutCHar(a);

//  LCD_setDDRAM(5);

            LCD_WriteNibble(2);  

            LCD_WriteNibble(0);   //вывели " "

     for( i=0; i<2000 ; i++); //задержка 2мс

//  LCD_setDDRAM(6);

            LCD_WriteCHar();   //'об/мин'

      }

      DelayNmSec(100);    //задержка 100 мс

      goto A; 

}

/******************************************************************

вывод данных/команд на порты управления

*******************************************************************/

void LCD_WriteNibble(unsigned char nb)

{

   LATFbits.LATF3 = 1;  // E=1-разрешает запись команды/данных

    for( i=0; i<2000 ; i++); 

      if(nb & 0x08)

         LATCbits.LATC13 = 1; // DB7

      else

         LATCbits.LATC13 = 0; 

      if(nb & 0x04)

         LATBbits.LATB2 = 1; // DB6

      else

         LATBbits.LATB2 = 0;

Продолжение приложения Г

      if(nb & 0x02)

         LATBbits.LATB1 = 1; // DB5

      else

         LATBbits.LATB1 = 0; 

      if(nb & 0x01)

         LATBbits.LATB0 = 1; // DB4

      else

         LATBbits.LATB0 = 0;

   

      LATFbits.LATF3 = 0;  // E=0

    for( i=0; i<2000 ; i++);

}

/******************************************************************

вывод 1 символа  на ЖК дисплей

*******************************************************************/

void LCD_PutCHar(unsigned char ch)

{

      LATFbits.LATF2 = 1;  // А0=1 - вывод данных

    for( i=0; i<2000 ; i++);

      LCD_WriteNibble(3); //0011-загрузили старшие 4 бита (цифры от 0 до 9)

      LCD_WriteNibble(ch);  //выводим конкретный символ (младшие 4 бита) 

    for( i=0; i<2000 ; i++); //задержка 2мс

} 

/******************************************************************

вывод на ЖК дисплей "об/мин"

*******************************************************************/

void LCD_WriteCHar(void)

{

      LATFbits.LATF2 = 1;  // А0 = 1 - вывод данных

    for( i=0; i<2000 ; i++);

Продолжение приложения Г

      LCD_WriteNibble(6);  //

      LCD_WriteNibble(15);  //вывели "о"

    for( i=0; i<2000 ; i++); //задержка 2мс 

      LCD_WriteNibble(11);  //

      LCD_WriteNibble(2);  //вывели "б"

    for( i=0; i<2000 ; i++); //задержка 2мс 

      LCD_WriteNibble(2);  //

      LCD_WriteNibble(15);  //вывели "/"

    for( i=0; i<2000 ; i++); //задержка 2мс 

      LCD_WriteNibble(11);  //

      LCD_WriteNibble(12);  //вывели "м"

    for( i=0; i<2000 ; i++); //задержка 2мс 

      LCD_WriteNibble(11);  //

      LCD_WriteNibble(8);  //вывели "и"

    for( i=0; i<2000 ; i++); //задержка 2мс 

      LCD_WriteNibble(11);  //

      LCD_WriteNibble(13);  //вывели "н"

    for( i=0; i<2000 ; i++); //задержка 2мс 

}

/******************************************************************

вывод на ЖК дисплей сообщения об ошибке "ошибка"

*******************************************************************/

Информация о работе Автоматизация станка с ЧПУ