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

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

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

#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