Главная страница > Курсовая работа: Транзисторний перетворювач з дроселем в первинному ланцюзі | Курсовая работа: Транзисторний перетворювач з дроселем в первинному ланцюзі |
|
Подпрограмма установок и инициализации //Watchdog initialize // prescale: 2048K void watchdog_init(void) { WDR(); //this prevents a timout on enabling WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs } void port_init(void) //инициализация портов { DDRA = 0b00110100; PORTA = 0b000000000; DDRD = 0b11111111; PORTD = 0b00000000; PORTB = 0b00000000; } void timer1_init(void) //инициализация таймера на время 18мкс { TCCR1B = 0x00; //stop TCNT1H = 0x3C; //setup TCNT1L = 0xB0; OCR1AH = 0xC3; OCR1AL = 0x50; OCR1BH = 0xC3; OCR1BL = 0x50; ICR1H = 0xC3; ICR1L = 0x50; TCCR1A = 0x00; } void init_devices(void) //инициализация устройств { CLI(); watchdog_init(); port_init(); timer1_init(); SREG = 0b10000000; ADCSRA = 0b10000110; //инициализация АЦП (режим) ADMUX = 0b11100011; // инициализация АЦП (выбор РА3) MCUCR = 0x00; TIMSK = 0x04; //прерывание по таймеру 1 GICR = 0x00; SEI(); } Подпрограмма функций unsigned int out,set ,Ton; int high,low,b,tint1,des,edi; int mas_code[10]={0b01000000,0b01111001,0b00100100,0b00110000, 0b00011001,0b00010010,0b00000010,0b01111000,0b00000000,0b00010000}; void BCD(int b) //BCD-преобразование { des=((b%100)/10); edi=((b%100)%10); } void delay_mcs(unsigned int tmp) //задержка { unsigned int tmp1; tmp1=tmp*10; while(tmp1>0) {tmp1--;} } void start(void) //функция запуска стабилизатора { ADCSRA = 0b11000110; //запуск АЦП delay_mcs(10); low=ADCL; high=ADCH; ADCSRA = 0b01000110; //остановка АЦП Uin = high; while(Uin != 0) {delay_mcs (100);} PORTA = 0b000000100; //VT1 } void vol(void) //определение напряжения нагрузки и необходимого тока за 2мкс, индикация { ADMUX = 0b11110000; // инициализация АЦП (выбор РА0,РА1) ADCSRA = 0b11000110; //запуск АЦП low=ADCL; high=ADCH; //считывание напряжения out = high; //запись в регистр ADCSRA = 0b01000110; //остановка АЦП ADMUX = 0b11100110; // инициализация АЦП (выбор РА6) ADCSRA = 0b11000110; //запуск АЦП low=ADCL; high=ADCH; //считывание напряжения set = high; //запись в регистр ADCSRA = 0b01000110; //остановка АЦП if(out<set) {Ton++;} if(out>set) {Ton--;} BCD(set); PORTB= mas_code[edi]; PORTD= mas_code[des]; } #pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) //подпрограмма прерывания по таймеру 1 { tint1 = 1; TCNT1H = 0x3C; TCNT1L = 0xB0; } Основная программа: // Target : M16 // Crystal: 10.000Mhz #include <iom16v.h> #include <init.h> #include <functions.h> #include <math.h> #include <macros.h> unsigned int T; void main(void) { init_devices(); start(); PORTA&0b001000000 = 0; PORTA&0b000100000 = 0; Ton = 10; while(1) { vol(); tint1=0; TCCR1B = 0x01; //запуск таймера T = 0; while (T<=Ton){ PORTA&0b001000000 = 1;T++} else { PORTA&0b001000000 = 0; PORTA&0b000100000 = 0;} //VT2 while(tint1 != 1)delay_mcs(0); vol(); tint1=0; TCCR1B = 0x01; //запуск таймера T = 0; while (T<=Ton){ PORTA&0b000100000 = 1;T++} else { PORTA&0b001000000 = 0; PORTA&0b000100000 = 0;} //VT3 while(tint1 != 1)delay_mcs(0); } } |
Новости |
---|
Copyright © 2006-2012 |