Автор работы: Пользователь скрыл имя, 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
{
Norm:
OVDCON = Table_PWM_lf[Enc_r]; // подключаем соответствующие ШИМ
if (Enc_r == 1)
NextEn
else
NextEn
timer3value = TMR3; // время поворота заготовки на 4 градуса
TMR3 = 0; // обнулили таймер
ob = Oborot*timer3value*25; // время одного оборота
ob_min = MIN*1000000/ob; // число оборотов за 1 минуту
IFS0bits.
}
else // если резец не повернулся за заготовкой
{
if (Razgon == 0)
goto Norm;
else
Продолжение приложения Г
{
TMR3 = 0;
ob_min = 0; //выводим на экран сообщение об ошибке
IEC0bi
}
}
}
else
IFS0bits.
}
//----------------------------
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) // последний элемент в таблице
NextEn
else
NextEn
}
}
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) // последний элемент в таблице
NextEn
else
NextEn
}
PWMCON1 = 0x0777;
Flags.RunMotor = 1;
//выводим сообщение о разгоне двигателя
InitLCD();
LCD_setDDRAM(0); //
LCD_Razgon(); //вывели на дисплей "разгон"
DelayNmSec(5000); //
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); //
LCD_WriteNibble(12); //
DelayNmSec(4);
// очистили индикатор
LCD_WriteNibble(0); //
LCD_WriteNibble(1); //
DelayNmSec(4);
LCD_setDDRAM(0); //
if (ob_min == 0)
{
LCD_ERror(); //
}
else
//выводим символы начиная со старшего разряда по определенному адресу
{
if (e != 0)
{
LCD_PutCHar(
}
// 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); //
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); //
LCD_WriteNibble(ch); //
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мс
}
/*****************************
вывод на ЖК дисплей сообщения об ошибке "ошибка"
******************************