Методичка (МПС)
.pdf& ! , " 01, ! ,
& " 01 & PORTB.
5. ) " $" '
$ " 01
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();
}
" $ $ ' $
% , %
# ' (PORTB=step).
" & $
& , % &
$ !$ $ . 6 «3$" $&» %
& % &
«+ &» & $ & & « / » %
« ». " $
А1, В1, А1, В1, % " .
51
+ ' - 5. ' ' )
5-" '
/ " '
* & % 3*)-6)0, & &
.
# ) '
1.* & " " " !-&$ $ $
$ ;
2.( & «3-& "
&».
3.* & $ $
!-&$ .
# '
+ & $ $
" # !-& #& $
! . + # !-
&$ $ % &:
–& $ %;
–& $ ;
–" , , ;
–$ $ $ % ;
–$ ,
, , .
6 $ , & $
, , & " !-& "
& ( . 1). ( ("),
$& $& .
+ # 3*):
–;
–.
) % & "
% 4, 1
# " % & 2 = 0 … 1,0. 0
$ % . 6
&$ % 3*) 2,
3 # " % &, $
%.
52
1 |
3 |
2 |
4 |
. 1. + $ !-&$
) 4 1… 4. ) 1 4 ' 2 3.
& % 2 = 0,5 %
, % 2 = 1 – & % &,
% 2 = 0,5 – & & %.
& «3-& " &»
3*)-6)0
%. ! " " .2.
. 2. ! " «3-& " &»
53
, " %:
–& «+ &» %;
–$& $ &
&$ $ $ Y;
–" # % "
$ . ( % #&
«n/U»;
–" !-&$ ,
% # 1, 1, +1, D1 A2, B2, C2, D2 "
, % "
X1, X2, X3, X4. 2
VT1, B2 – VT2, +2 – VT3,
D1 – VT4;
–X5, X6, $ %
$& $ ;
–& « / » % . % « .»
& # $ $ , % « .» $ &
« »;
–«)», % "
% ;
–«+», % " # #
& % ;
–& « /,», # # " $
% % ;
–$ $
% ;
–«#», " " "
" .
5 3 ) ' 5-
" ) '
! $ " &
# $ $ %
$ 4 = (5Я).
6 :
–QF1
& X5 X6 "
$ $ . 0 % & " 2, 2, +2, D2 # X1, X2, X3, X4;
–$ & "
% " ;
–& % $ QF1
& & «+ &» «3-
54
& " &». ) % % $&
# " " ;
–& " % ,
$ $
;
–& $ ! ( «)») ,
$ , , '
& " . 1;
–&
$ " % " , &
% «+».
0. 1
5Я,
4,
/
2
( & $ $ , &
% & $ % , %
& % %
& " % &. & .1.
55
+ ' - 6. # ! 1 ! 5-
" ', ' 67 ) " )
/ " '
( & «3-& "
& – $& $ »
% .
# ) '
1.* & " "
$" $ " $ %
3*.
2.& % " $ $
" 3*)-6)0, & $ .
3.& % " $ $
" 3*)-6)0, & $ .
3., & & $
$ $ 3*)-6)0
.
# '
" " ' "
$ $
!-&$
.
#$ $ & &
& « » ATmega32.
6 $ , & «3-& " &»
$ " , !$
#$ ,
«+ &» « / » % « ».
$ VT1…VT4 &
# " DD1.
+ VT1 A1,
VT2 B1,
VT3 C1, VT4
D1.
)
QF1 &
X5 X6 " $ $
. 0 % & " 2, 2, +2, D2 #
X1, X2, X3, X4.
56
) ) 5-"
'
6 $ , & $
, , & " !-& "
& ( . 1). ( ("),
$& $& .
) % & "
% 4, 1
# " % & 2 = 0 … 1,0.
0 $ %
. 6 &$ % 3*)
2, 3 # " % &,
$ % & .
1 |
3 |
2 |
4 |
. 1. + $ !-&$
+ $ $ $ , #$
RP1 « », % &
.
, # $ #& $
.
! % "
$ $ ' " .
# 1. & !-&
$ % . , % & $
, $ RP1
.
//------------------------------------------------------------------
//Входы:
//PA0 – сигнал задания на ШИП
//PA1 – задание направления вращения
//PA2 – разрешение на работу преобразователя //Выходы:
//PB0 – управление транзистором VT1 (вход А1)
//PB1 – управление транзистором VT2 (вход B1)
//PB2 – управление транзистором VT3 (вход C1)
57
//PB3 – управление транзистором VT4 (вход D1)
//Подключение стандартных библиотек:
#include <iom32v.h> #include <macros.h>
//Объявление переменных:
unsigned char adc_result=0;
//Функция инициализации портов ввода/вывода:
void port_init(void) |
|
|
{ |
|
|
PORTA |
= 0xFE; |
//Порт А инициализируется на ввод данных |
DDRA |
= 0x00; |
|
PORTB |
= 0xF0; |
//Порт В инициализируется на вывод данных |
DDRB |
= 0x0F; |
|
PORTC |
= 0xFF; |
|
DDRC |
= 0x00; |
|
PORTD |
= 0xFF; |
|
DDRD |
= 0x00; |
|
} |
|
|
//Функция инициализации таймера T0:
void timer0_init(void)
{
TCCR0 = 0x00;
TCNT0 = 0x00;
OCR0 = 0x00;
TCCR0 = 0x00;
}
//Функция инициализации аналогово-цифрового преобразователя:
void adc_init(void) |
|
{ |
|
ADCSRA = 0x00; |
|
ADMUX = 0x60; |
//АЦП инициализируется на работу с входом ADC0 |
ADCSRA = 0x00; |
|
ADCSRA = 0xCF; |
//АЦП запускается в одиночном режиме |
} |
//с предделителем 128 |
//Подпрограмма обработки прерывания готовности АЦП:
#pragma interrupt_handler adc_isr:iv_ADC |
|
|
void adc_isr(void) |
|
|
{ |
|
|
CLI(); |
//Запрет всех прерываний |
|
adc_result=ADCH; |
//Считывание результата преобразования АЦП |
|
if(adc_result<=5) |
adc_result=5; |
//Минимальная скважность |
else if(adc_result>=250) |
adc_result=250; |
//Максимальная скважность |
58
OCR0=adc_result; |
//Выдача результата на ШИМ таймера Т0 |
|
ADCSRA|=0x40; |
//Перезапуск |
АЦП |
SEI(); |
//Разрешение |
всех прерываний |
} |
|
|
//Подпрограмма обработки прерывания по совпадению таймера Т0:
#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP void timer0_comp_isr(void)
{ |
|
CLI(); |
//Запрет всех прерываний |
if((PINA&0x02)==0x02) |
//При движении «Вперед» |
{ |
|
PORTB=0x08; |
//включается транзистор VT4 |
} |
|
else |
//При движении «Назад» |
{ |
|
PORTB=0x02; |
//Включается транзистор VT2 |
} |
|
SEI(); |
//Разрешение всех прерываний |
} |
|
//Подпрограмма обработки прерывания по переполнению таймера Т0:
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void)
{ |
|
CLI(); |
//Запрет всех прерываний |
if((PINA&0x02)==0x02) |
//При движении «Вперед» |
{ |
|
PORTB=0x09; |
//Включаются транзисторы VT1 и VT4 |
} |
|
else |
//При движении «Назад» |
{ |
|
PORTB=0x06; |
//Включаются транзисторы VT2 и VT3 |
} |
|
SEI(); |
//Разрешение всех прерываний |
} |
|
//Функция инициализации периферийных устройств контроллера: void init_devices(void)
{ |
|
|
CLI(); |
|
//Запрет всех прерываний |
port_init(); |
//Вызов функции инициализации портов |
|
timer0_init(); |
//Вызов функции инициализации таймера Т0 |
|
adc_init(); |
//Вызов функции инициализации АЦП |
|
MCUCR |
= 0x00; |
|
GICR |
= 0x00; |
//Запрет всех внешних прерываний |
TIMSK = 0x03; |
//Разрешение прерываний по совпадению и |
|
|
|
//переполнению таймера Т0 |
SEI(); |
|
//Разрешение всех прерываний |
} |
|
|
59
//Главная функция программы: void main(void)
{ |
|
init_devices(); |
//Вызов функции инициализации устройств контроллера |
while(1) |
//Бесконечный цикл |
{ |
|
if((PINA&0x04)==0x04) |
//При подаче сигнала разрешения |
{ |
|
TCCR0=0x4B; |
//Запускается таймер Т0 в режиме ШИМ |
} |
|
else |
//При снятии сигнала разрешения |
{ |
|
TCCR0=0x00; |
//Таймер Т0 останавливается |
TCNT0=0x00; |
|
PORTB=0x00; |
//управляющие импульсы снимаются |
} |
|
} |
|
} |
|
//------------------------------------------------------------------ |
|
$ .
1. + ,
$ $& :
#include <iom32v.h> #include <macros.h>
unsigned char adc_result=0;
2. ) $ $" ' main (),
" ' ' " "
init_devices():
CLI(); port_init(); timer0_init(); adc_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x03; SEI();
3. ; ' " " &
' / , " 00 8):
void port_init(void)
{
PORTA = 0xFE; DDRA = 0x00; PORTB = 0xF0; DDRB = 0x0F; PORTC = 0xFF; DDRC = 0x00; PORTD = 0xFF; DDRD = 0x00;
60