Методичка (МПС)
.pdf#include <iom32v.h> #include <macros.h> unsigned int pulse=0; unsigned char cycle_cnt=0; signed char Kp=-2; unsigned char Ti=6;
unsigned long int Uvh=0,Uos=0;
signed long int delta=0,delta_i=0,Up=0,Urs=0,Urs_=0;
& pulse – & " ; cycle_cnt – " 01, " '
)*- $ 100 ;
Kp, Ti – '' &$
$&$ $ ;
Uvh, Uos – $ " $ ; delta, delta_i – $ ! $ ;
Up – $ &$ $ ;
Urs,Urs_ – $ $
# .
2. ) $ " ' main (),
" ' ' " "
init_devices ():
CLI(); port_init(); timer0_init(); timer1_init(); adc_init(); MCUCR = 0x03; GICR = 0x40; TIMSK = 0x13; SEI();
: ' & ' , " 00 01, 8), % !$ INT0 (MCUCR =
0x03; GICR = 0x40) " " (TIMSK = 0x13): void port_init(void)
{
PORTA = 0xFE; DDRA = 0x00; PORTB = 0xF0; DDRB = 0x0F; PORTC = 0xFF; DDRC = 0x00; PORTD = 0xFB; DDRD = 0x00;
}
void adc_init(void)
{
ADCSRA = 0x00;
ADMUX = 0x60;
ADCSRA = 0x00;
71
ADCSRA = 0xCF;
}
void timer0_init(void)
{
TCCR0 = 0x00;
TCNT0 = 0x00;
OCR0 = 0x00;
TCCR0 = 0x00;
}
void timer1_init(void)
{
TCCR1B = 0x00;
TCNT1H = 0x00;
TCNT1L = 0x00; OCR1AH = 0x1F; OCR1AL = 0x40; OCR1BH = 0x00; OCR1BL = 0x00; ICR1H = 0x00; ICR1L = 0x00; TCCR1A = 0x00; TCCR1B = 0x09;
}
#pragma interrupt_handler adc_isr:iv_ADC void adc_isr(void)
{
CLI();
Uvh=ADCH;
ADCSRA|=0x40;
SEI();
}
8) % $ ,
" 8-" % $ , &
– 8- $ ADCH 8).
0 " 00 $ &
' & !-& . ) $ " 56.
0 " 01 % )*- $ . ) & ' " )*- $ – , ,
& $ ( ).
&! , % )*- $ "
% $ $ . ( &!
& " #
$ . " % CTC
1 , $ % $
cycle_cnt, " 100 .
3. ) " $" '
" while(1),
«!», $ PA2:
if((PINA&0x04)==0x04)
72
{
TCCR0=0x4B;
}
else
{
TCCR0=0x00;
TCNT0=0x00;
PORTB=0x00;
}
- ! , " 00, # " '
# & . , ! , " 00 , & .
4. ) $ 8) ' $ adc_isr(),
" " Uvh , $ ADCH. ) $ 8):
CLI();
Uvh=ADCH;
ADCSRA|=0x40;
SEI();
5. ) " 00
56. ) :
CLI();
PORTB=0x08;
SEI();
) :
CLI();
PORTB=0x09;
SEI();
6. ) $ & &$
' $ & ' !
INT0:
CLI();
pulse+=1;
SEI();
) % ! &
pulse, $ . * &
% 100 , $ " 01 '$ " .
7. " 01 $
)*- $ . : % 1 , . . " 01
$ % CTC
:
CLI(); cycle_cnt+=1;
73
if(cycle_cnt==100) |
|
{ |
|
Uos=pulse; |
|
Uos<<=2; |
|
pulse=0; |
|
cycle_cnt=0; |
|
delta=Uvh-Uos; |
|
delta_i=delta; |
|
if(Kp==0) |
Up=0; |
else if(Kp==1) |
Up=delta; |
else if(Kp==2) |
Up=delta<<1; |
else if(Kp==4) |
Up=delta<<2; |
else if(Kp==8) |
Up=delta<<3; |
else if(Kp==-1) |
Up=delta; |
else if(Kp==-2) |
Up=delta>>1; |
else if(Kp==-4) |
Up=delta>>2; |
else if(Kp==-8) |
Up=delta>>3; |
if(Ti==0) |
{delta_i=0;} |
else |
{delta_i>>=(Ti-1);} |
if((PINA&0x04)==0x00)
{
delta_i=0; Urs=Up; Urs_=0;
}
else
{
Urs=Up+delta_i+Urs_; Urs_=Urs-Up;
}
if(Urs>=250) |
Urs=250; |
else if(Urs<=5) |
Urs=5; |
OCR0=Urs;
}
SEI();
% 100 )*- $
. + $ " , &
$ Uos. ) $ !
$ (delta=Uvh-Uos). : % ''
&$ $ $& "
$ . & ' $ $ Urs, "
$" $ " 00,
$ VT1, VT4 .
" " & &
$ ,
" $ , & $ "
!-&$
.
74
+ ' - 8. ' ' )
'
/ " '
* & % 0)-6)0, & &
.
# ) '
1.* & " " "
" $ $
$ ;
2.( & «0 " &».
3.* & $ $
$ $ .
# '
0 " %
" $ $ .
: ! " # ", $
& &! $ , $
& % , & %
$ $ " $
&.
!-&
$ $ , $
# ", % & &
" " '$ .
& «0 " &»
0)-6)0 %. ! "
" . 1. , " %:
–& «+ &» %;
–$& $ &
&$ $ $ Y;
–" # % "
$ . ( % #&
«n/U»;
–" $ , % #
X1, X2, X3, X4 # , %
$ %
$ X5, X6;
75
|
|
|
|
||||||
|
) * |
|
|
|
|
|
|||
|
|
|
n, / |
|
|
|
|
|
|
|
|
|
|
|
X5 |
|
|
X6 |
|
|
|
|
|
U, |
|
|
|
|
|
|
|
|
|
|
|
|
|
Y |
|
|
|
|
|
+ |
|
|
|
|
|
UZ1 |
|
|
|
|
|
|
UZ2 |
|
|
X1 |
VS1 |
X2 |
|
VS3 |
|
|
|
|
|
|
|
|
|
X4 |
VS5 |
X3 |
VS7 |
X5 |
|
~U |
|
|
|
|
|
|
|
X6 |
|
|
|
|
|
|
|
|
|
X7 |
|
X2 |
VS2 |
X1 |
|
VS4 |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
UA |
|
|
|
|
|
X3 |
VS6 |
X4 |
VS8 |
|
|
|
|
|
,- # |
|
|
|
|||
|
|
" |
|
! |
|
%! '( |
|
|
|
|
|
|
|
|
|
||||
$%& % |
# |
|
|
|
0 |
1 |
|
||
|
|
|
|
|
|
|
|
||
|
“ - ” |
|
|
|
|
|
|
. 2. ! " «0 " &»
–& « / » % . % « .»
& # $ $ , % « .» $ &
« »;
–«)», % "
% ;
–«+», % " # #
& % ;
–& « /,», # # " $
% % ;
–$ $
% ;
–«#», " " "
" .
5 3 ) ' 5-
" ) '
! $ " &
# $ $ %
$ 4 = (5Я).
6 :
76
–QF1
& X5 X6 "
$ $ ;
–$ & "
% " ;
–& % $ QF1
& & «+ &» «0 "
&». ) % % $& # "
" ;
–& " % ,
$ $
;
–& $ ! ( «)»), ,
$ , , '
& " . 1;
–&
$ " % " , &
% «+».
0. 1
5Я,
4,
/
>
* # « » «,». ( & $ $ , &
$ % " . ) &
& 5Я = (>).
77
+ ' - 9. # ! 1 !
', ' 67 ) " )
/ " '
( & «0 " & –
$& $ ».
# ) '
1.* & " "
$" $ ".
2.& % " $ " 0)-6)0,
& $ .
3., & & $
$ $ 0)-6)0
.
# '
" " ' "
$ $ $ $
$ .
#$ $ & &
& « » ATmega32.
6 $ , & «0 " &» $
" , !$ #$
, «+ &»
« / » % « ».
$ VS1…VS8 & #
" X1…X4.
+ VS1 VS4
X1, VS2 VS3 X2,
VS6 VS7 X3, VS5 VS8 X4.
)
QF1 &
X5 X6 " $ $
.
) '
6 $ , & $
, , & " & ( . 1). (
& , $&
$ .
78
+ $ $ $ , #$
RP1 « », $ . , # $ #& $
.
! % "
$ $ ' " .
//------------------------------------------------------------------
//Входы:
//PA0 – сигнал задания на ТП
//PA1 – задание направления вращения
//PA2 – разрешение на работу преобразователя //PD2 – сигнал синхронизации с сетью //Выходы:
//PB0 – управление тиристорами VS1, VS4
//PB1 – управление тиристорами VS2, VS3
//PB2 – управление тиристорами VS6, VS7
//PB3 – управление тиристорами VS5, VS8
//Подключение стандартных библиотек:
#include <iom32v.h> #include <macros.h>
//Объявление переменных:
unsigned int alpha=9722; unsigned char adc_result;
//Функция инициализации портов:
void port_init(void)
{
PORTA = 0xFE; DDRA = 0x00; PORTB = 0xF0; DDRB = 0x0F; PORTC = 0xFF; DDRC = 0x00; PORTD = 0xFB; DDRD = 0x00;
}
//Функция инициализации АЦП:
void adc_init(void)
{
ADCSRA = 0x00;
ADMUX = 0x60; ADCSRA = 0x8E;
}
//Функция инициализации таймера Т1:
79
void timer1_init(void)
{
TCCR1B = 0x00;
TCNT1H = 0x00;
TCNT1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
TCCR1A = 0x00;
TCCR1B = 0x00;
}
//Обработка прерывания готовности АЦП:
#pragma interrupt_handler adc_isr:iv_ADC void adc_isr(void)
{ |
|
CLI(); |
//Запрет всех прерываний |
adc_result=255-ADCH; |
//Инверсия результата |
alpha=adc_result*38; |
//Вычисление угла управления тиристорами |
ADCSRA|=0x40; |
//Перезапуск АЦП |
SEI(); |
//Разрешение всех прерываний |
} |
|
//Обработка внешнего прерывания INT0: |
|
#pragma interrupt_handler int0_isr:iv_INT0 |
|
void int0_isr(void) |
|
{ |
|
CLI(); |
//Запрет всех прерываний |
PORTB&=0xF0; |
//Выключение управляющих импульсов |
OCR1A=alpha; |
//Запись уставки угла управления в таймер Т1 |
TCNT1=0; |
|
if((PINA&0x04)==0x04) |
//Если подано разрешение на работу |
{ |
|
TCCR1B=0x02; |
//то запуск таймера Т1 |
} |
|
else |
//Иначе |
{ |
|
TCCR1B=0x00; |
//Остановка таймера Т1 |
PORTB=0x00; |
//Выключение тиристоров |
} |
|
SEI(); |
//Разрешение всех прерываний |
} |
|
//Обработка прерывания по совпадению T1:
#pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA void timer1_compa_isr(void)
{ |
|
CLI(); |
//Запрет всех прерываний |
80