Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка (МПС)

.pdf
Скачиваний:
22
Добавлен:
04.06.2015
Размер:
1.2 Mб
Скачать

, " "

$ , %

. )

QF1 &

%:

& «+ &» & % %;

& « / » & % « »;

# & " %

" ;

& «%» & % %;

& % " &

% « »;

А1, В1, А1, В1, !$

" & % & .

' 5 ) ) )

* !$ $ $ %

$ #

# & .

) & «3$" $&»

& , #&

!$ (& « ») & &

# $ . 6 $ & $ , # #

&$ $ ( Y

«3$" $&»), ' " $ $ :

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

//Программа подсчета и индикации частоты импульсов импульсного датчика //Входы: PD2 – вход для подключения импульсного датчика.

//Выходы: PC0…PC7 – сегменты семисегментного индикатора.

//PB0…PB3 – выходы для подключения сегментов индикатора.

//Подключение стандартных библиотек, в том числе библиотеки

//контроллера ATmega32:

#include <iom32v.h> #include <macros.h>

//Задание переменных, используемых в программе

unsigned char step=0x01; unsigned int pulse=0; unsigned int freq=0;

unsigned char dddd=0,ddd=0,dd=0,d=0; unsigned char symbol=0;

//Функция инициализации портов ввода/вывода:

41

void port_init(void)

{

 

 

PORTA

= 0x00;

 

DDRA

= 0x00;

 

PORTB

= 0x01;

 

DDRB

= 0x0F;

//Разряды PD0…PD3 инициализируются на вывод

PORTC

= 0x00;

 

DDRC

= 0xFF;

//Порт С инициализируется на вывод информации

PORTD

= 0x00;

 

DDRD

= 0x00;

 

}

 

 

//Функция инициализации таймера Т1:

void timer1_init(void)

{

 

 

TCCR1B = 0x00;

 

TCNT1H = 0x00;

 

TCNT1L = 0x00;

 

OCR1AH = 0x7A;

//Уставка таймера, обеспечивающая задержку 1 с при

OCR1AL = 0x12;

//работе таймера c предделителем clk/256

OCR1BH = 0x00;

 

OCR1BL = 0x00;

 

ICR1H

= 0x00;

 

ICR1L

= 0x00;

 

TCCR1A = 0x00;

 

TCCR1B = 0x0C;

//Включен режим CTC c предделителем clk/256

}

 

 

//Обработка внешнего прерывания INT0:

#pragma interrupt_handler int0_isr:iv_INT0 void int0_isr(void)

{

 

CLI();

//Запрет всех прерываний

pulse+=1;

//Инкремент счетчика импульсов датчика скорости

SEI();

//Разрешение всех прерываний

}

 

//Обработка прерывания по совпадению Т1:

#pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA void timer1_compa_isr(void)

{

 

CLI();

//Запрет всех прерываний

freq=pulse;

//Подсчет частоты

dddd=freq/1000;

//Выделение разряда «тысяч»

ddd=(freq/100)%10;

//Выделение разряда «сотен»

dd=(freq/10)%10;

//Выделение разряда «десятков»

d=freq%10;

//Выделение разряда «единиц»

pulse=0;

//Обнуление счетчика импульсов

SEI();

//Разрешение всех прерываний

}

 

42

//Функция инициализации периферийных устройств контроллера:

void init_devices(void)

{

 

 

CLI();

 

//Запрет всех прерываний

port_init();

//Вызов функции инициализации портов

timer1_init();

//Вызов функции инициализации таймера Т1

MCUCR

= 0x03;

//Прерывание INT0 – по нарастающему фронту

GICR

= 0x40;

//Разрешение внешнего прерывания INT0

TIMSK = 0x10;

//Разрешение прерывания по совпадению таймера Т1

SEI();

 

//Разрешение всех прерываний

}

 

 

//Главная функция программы:

void main(void)

 

{

 

 

init_devices();

//Вызов функции инициализации устройств

while(1)

//Бесконечный цикл

{

 

 

switch(step)

//В зависимости от работающего разряда индикатора

{

 

//вызов на индикацию:

case 0x01: symbol=d; break;

//разряда «единиц»,

case 0x02: symbol=dd; break;

//разряда «десятков»,

case 0x04: symbol=ddd; break;

//разряда «сотен»,

case 0x08: symbol=dddd; break;

//разряда «тысяч».

}

 

 

switch(symbol)

//Перевод кода числа symbol в код семисегментного

{

//индикатора

 

case 0:symbol=0x3F;break;

 

case 1:symbol=0x06;break;

 

case 2:symbol=0x5B;break;

 

case 3:symbol=0x4F;break;

 

case 4:symbol=0x66;break;

 

case 5:symbol=0x6D;break;

 

case 6:symbol=0x7D;break;

 

case 7:symbol=0x07;break;

 

case 8:symbol=0x7F;break;

 

case 9:symbol=0x6F;break;

 

}

 

 

PORTC=symbol;

//На сегменты подается код числа

PORTB=step;

//На один из разрядов подается сигнал включения

step<<=1;

//Реализация «Бегущей единицы» для создания

if(step==0x10) step=0x01; //динамической индикации.

}

}

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

) $ , $ %,

% & #

!$ $ $ .

43

6 ШД = ( УПР), $ ШД

# !$ $ $ , УПР – $

$ , :

& % & " «+ &»

%. ) % $ # " ;

& $ «)» !$

$ % «)/+» ;

! $

#, & . 1;

! " %

" , & !$ $ %

«)/+».

0. 1

УПР, 1

ШД, 1

' 5 ) ) )

6 % $

& «1 0,5» % «0,5».

) $ & ШД = ( УПР) #

:

& % & " «+ &»

%. ) % $ # " ;

& $ «)» !$

$ % «)/+» ;

! $

#, & . 2;

! " %

" , & !$ $ %

«)/+».

0. 2

УПР, 1

ШД, 1

: & ШД = ( УПР) !$ $

$ & $' "

. ) & 7 & % !$ $

$ .

44

' 5 ) ) ) .

) % !$ $ ,

$ # &. %

% & $ $ ,

% & $ $ % . 6 $ % :

& " (!$") % $

" «1 0,5» % «1»;

& «%» % «3$»;

& «3$" $&» %

$ ;

% & «)/+»

$ ;

% & «+» " $

$ ;

& % «3$», &

$ $ % . & & & $ $

% (5-6 ), & " . 3;

& # & $ $ %,

! & ;

& % $ !$"

& , 5 ;

& (& «+ &»)

(" & QF1 ).

0. 3

& ) ! .

5 !$

1

2

3

 

4

5

6

2$

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

, $ .

 

 

 

 

 

 

 

 

 

# 5 ) ! .

 

 

 

5 !$

1

2

3

 

4

5

6

2$

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

, $ .

 

 

 

 

 

 

 

45

+ ' - 4. # 1 ! 5 )

/ " '

( & !$ $

% .

# ) '

1.( & " "

!$ $".

2.( & $", " $

!$ $ , " " .

3., & & $ .

4., & $ !$ $

& .

# '

) & !$ $ !

!, " , "!

!$ $"

% & "

& ".

) # !$ $ $ &

$ ' $ , % &

$"

" %.

6 $ , & & $ !$

$ ,

" :

& «+ &» & % %;

& « / » & % « ».

!$ $ ,

$ # $

А1, В1, А1, В1, % " «3$" $&»;

& % " &

% « »;

& «+ &» « » %

%, # « ».

) "

& $" !$ $

% & .

# 1. , & $ , # # !$

$ " " # % .

46

) & &

$ : 1 1, 5 1, 10 1, 20 1.

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

//Программа управления шаговым электродвигателем в симметричном режиме //Входы:

//PA0, PA1 – задание частоты коммутации

//PA1:PA0=00 – частота 1 Гц //РА1:PA0=01 – частота 5 Гц //PA1:PA0=10 – частота 10 Гц //PA1:PA0=11 – частота 20 Гц

//PA2 – направление вращения

//PA3 – разрешение на работу двигателя //Выходы:

//PB0 – импульс А1 //PB1 – импульс B1 //PB2 – импульс NA1 //PB3 – импульс NB1

//Подключение стандартных бибилиотек:

#include <iom32v.h> #include <macros.h>

//Объявление переменных:

unsigned char step=0x01; unsigned int delay=0;

//Функция инициализации портов ввода/вывода:

void port_init(void)

{

 

 

PORTA

= 0xFF;

//Порт А инициализируется на ввод

DDRA

= 0x00;

 

PORTB

= 0xF1;

//Порт В инициализируется на вывод

DDRB

= 0x0F;

 

PORTC

= 0xFF;

 

DDRC

= 0x00;

 

PORTD

= 0xFF;

 

DDRD

= 0x00;

 

}

 

 

//Функция инициализации таймера Т1:

void timer1_init(void)

{

TCCR1B = 0x00;

TCNT1H = 0x00;

TCNT1L = 0x00; OCR1AH = 0x7A; OCR1AL = 0x12; OCR1BH = 0x00; OCR1BL = 0x00; ICR1H = 0x00;

47

ICR1L = 0x00; TCCR1A = 0x00; TCCR1B = 0x00;

}

//Обработка прерывания по совпадению таймера Т1:

#pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA void timer1_compa_isr(void)

{

 

 

 

CLI();

//Запрет

всех

прерываний

PORTB=step;

//Подача

импульсов управления

if((PINA&0x04)==0x04)

//Направление

«Вперед»

{

step<<=1;

if(step==0x10) {step=0x01;OCR1A=delay;}

}

 

else

//Направление «Назад»

{

step>>=1;

if(step==0x00) {step=0x08;OCR1A=delay;}

}

SEI(); //Разрешение всех прерываний

}

//Функция инициализации периферийных устройств:

void init_devices(void)

 

 

{

 

 

 

CLI();

 

//Запрет всех прерываний

port_init();

//Вызов функции инициализации портов

timer1_init();

//Вызов функции инициализации таймера Т1

MCUCR

= 0x00;

 

 

GICR

= 0x00;

//Запрет внешних прерываний

TIMSK = 0x10;

//Разрешение прерывания по совпадению Т1

SEI();

 

//Разрешение всех прерываний

}

 

 

 

//Основная функция:

 

 

void main(void)

 

 

{

 

 

 

init_devices();

//Вызов функции инициализации устройств

while(1)

//бесконечный цикл

 

{

 

 

 

if((PINA&0x03)==0x00

{delay=0x7A12;}

//уставка Т1 на 1 Гц

else if((PINA&0x03)==0x01

{delay=0x186A;}

//уставка Т1 на 5 Гц

else if((PINA&0x03)==0x02)

{delay=0x0C35;}

//уставка Т1 на 10 Гц

else

 

{delay=0x061A;}

//уставка Т1 на 20 Гц

if((PINA&0x08)==0x08)

//Если подано разрешение на работу,

{

 

 

 

TCCR1B=0x0C;

//запускается таймер Т1

}

 

 

 

else

 

//Если разрешение не подано,

48

{

 

TCCR1B=0x00;

//таймер Т1 останавливается

TCNT1=0;

 

PORTB=0x00;

//и снимаются импульсы управления.

}

 

}

 

}

 

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

 

$ .

1. + ,

$ :

#include <iom32v.h> #include <macros.h>

2. ' main(), " '

" init_devices():

void init_devices(void)

{

CLI() port_init(); timer1_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x10; SEI();

}

: ' ' /

" 01:

void port_init(void)

{

PORTA = 0xFF; DDRA = 0x00; PORTB = 0xF1; DDRB = 0x0F; PORTC = 0xFF; DDRC = 0x00; PORTD = 0xFF; DDRD = 0x00;

}

void timer1_init(void)

{

TCCR1B = 0x00;

TCNT1H = 0x00;

TCNT1L = 0x00; OCR1AH = 0x7A; OCR1AL = 0x12; OCR1BH = 0x00; OCR1BL = 0x00; ICR1H = 0x00; ICR1L = 0x00; TCCR1A = 0x00;

49

TCCR1B = 0x00;

}

' " 01 " $ % +0+ (Clear to Compare). % "

, " 16- $ OCR1AH:OCR1AL, $

" " $

" 16- $ $ $ 0+NT1H:TCNT1L.

) & " clk/256

# ":

1 1 " 01 OCR1AH:OCR1AL=7A:12;

1 1 " 01 OCR1AH:OCR1AL=18:6A;

1 1 " 01 OCR1AH:OCR1AL=0C:35;

1 1 " 01 OCR1AH:OCR1AL=06:1A.

0 " # % CTC c clk/256

# " $ TCCR1B 0x0C.

6 & ' " !

" 01 (TIMSK = 0x10).

3. ) ! " $

" while(1) % & %

. " " " $

PA0, PA1 " 01:

if((PINA&0x03)==0x00

{delay=0x7A12;}

else if((PINA&0x03)==0x01

{delay=0x186A;}

else if((PINA&0x03)==0x02)

{delay=0x0C35;}

else

{delay=0x061A;}

2 # :

– " $ :

= = 0,000000125 c;

– " 01 clk/256:

! = 256 ∙ = 0,000032 c.;

" %& = 1 c &:

' = ()*+ = 31250/ = 7 121.

(,-.

4. ! $ #

:

if((PINA&0x08)==0x08)

{

TCCR1B=0x0C;

}

else

{

TCCR1B=0x00;

TCNT1=0;

PORTB=0x00;

}

50