
Методичка (МПС)
.pdf, " "
$ , %
. )
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